code/return-type-errors.cpp: In function ‘int add(int, int)’:
code/return-type-errors.cpp:8:3: error: return-statement with no value, in function returning ‘int’ [-fpermissive]
8 | return;
| ^~~~~~
《计算机程序设计》
计算机学院计算机研究所编译系统研究室
~/course
~/course/main.cpp
main.cpp
,随堂编程练习的代码请直接在此文件中编辑考考你
使用IO操纵子,输出主战坦克信息表的表头与前两行数据
|------|----------|--------------------|
|ID |Name | Weight|
|------|----------|--------------------|
|1 |99A | 5.50E1|
|2 |15 | 3.50E1|
打印主战坦克信息表
#include <iomanip>
#include <iostream>
using namespace std;
int main() {
cout << setfill('-') << right << '|' << setw(7) << '|' << setw(11) << '|' << setw(21) << '|' << endl;
cout << setfill(' ') << '|' << left << setw(6) << "ID" << '|' << left << setw(10) << "Name" << '|'
<< right << setw(20) << "Weight" << '|' << endl;
cout << setfill('-') << right << '|' << setw(7) << '|' << setw(11) << '|' << setw(21) << '|' << endl;
// ============= begin =============
// ============= end =============
return 0;
}
学习目标
circleArea
):函数的标识符,用于调用函数double
):说明函数返回值的类型,可以是void
,表示无返回值double r
):说明函数接受的参数,包括参数类型与参数名void
考考你
若返回值与返回类型不匹配,会发生什么?
避坑
非void
函数无返回值或void
函数有返回值,编译器会报错
考考你
若返回值与返回类型不匹配,会发生什么?
避坑
编译器会尝试将返回值转换为返回类型,若成功则返回转换后的值,否则报错
return
语句缺失考考你
非void
函数中,return
语句缺失,会发生什么?
避坑
非void
函数中,return
语句缺失或在部分执行路径缺失,编译器只会报告警告!但程序运行会有错误!
return
语句使用指南编程指南
void
函数,也写出return
语句,以明确函数结束void
函数,确保所有执行路径都有return
语句return
表达式类型与返回类型不匹配引入的隐式类型转换main
函数main
函数与其他函数没有区别main
是程序的入口(由操作系统shell调用),程序从这里开始执行
argc
和argv
两个参数接收int
,表示程序退出状态,0表示正常退出,其他值表示异常退出circledemo.cpp
Try it!
删掉第一行,编译时会发生什么?
The area is: 3
考考你
从这个例子中,你能看出“类型”在编译阶段的作用吗?链接器能否看到类型信息?
考考你
观察下面的程序,输出是什么?
valuearg.cpp
valuearg-inspect.cpp
Parameter x is at memory 0x7ffcc54bac08
Argument x is at memory 0x7ffcc54bac20
refarg.cpp
#include <iostream>
double updateme(double &x, double &y) { // &符号表示该参数以引用方式传递
double z = x + y;
std::cout << "Parameter x/y is at memory " << &x << '/' << &y << std::endl;
return z;
}
int main() {
double x = 0, y = 1;
double z = updateme(x, y);
std::cout << "Argument x/y is at memory " << &x << '/' << &y << std::endl;
std::cout << "The updated value is: " << z << std::endl;
return 0;
}
明察秋毫
int
与int&
的区别不仅仅是一个符号,二者是两种不同的类型!--- config: look: handDrawn themeVariables: fontSize: 28px --- mindmap Root(变量) 变量名:标识符 类型:数据类型 值:存储的数据 地址:内存中的位置 作用域:变量的可见范围 生存周期:变量的有效时间
块作用域
文件作用域
考考你
如果我希望一个变量能被另外一个文件访问,应该怎么做?我们都使用过这样的变量,你知道是哪一个吗?
--- config: look: handDrawn themeVariables: fontSize: 28px --- mindmap Root(变量) 变量名:标识符 类型:数据类型 值:存储的数据 地址:内存中的位置 作用域:变量的可见范围 生存周期:变量的有效时间
明察秋毫
“自动存储”的含义可以简单理解(并不准确):当变量所在的语句块开始执行时分配内存,结束时释放内存
静态存储
Hello, world! 0
Hello, world! 1
Hello, world! 2
考考你
全局变量和静态局部变量都具有静态存储类别,它们的区别在哪里?
静态局部变量与全局变量
extern
关键字实现
明察秋毫
The value of PI is: 3.14159
Try it!
extern
关键字,会发生什么?extern
关键字,会发生什么?static
关键字,会发生什么?static
关键字用于局部变量时,会使变量具有静态存储类别static
关键字用于全局变量时,会使全局变量无法被其他文件访问
static
关键字,全局变量都具有静态存储类别/usr/bin/ld: /tmp/cc1cFyy2.o: warning: relocation against `PI' in read-only section `.text'
/usr/bin/ld: /tmp/cc1cFyy2.o: in function `main':
externdemo.cpp:(.text+0x32): undefined reference to `PI'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status
作用域与存储类别示例
分类 | 存储类别 | 作用域 | 生存周期 |
---|---|---|---|
自动局部变量 | 自动存储 | 块作用域 | 代码块执行开始至执行结束 |
静态局部变量 | 静态存储 | 块作用域 | 程序开始至程序结束 |
全局变量 | 静态存储 | 文件作用域,可被其他文件访问 | 程序开始至程序结束 |
外部变量 | 外部存储 | 由声明位置决定 | 由定义位置决定 |
静态全局变量 | 静态存储 | 文件作用域,不可被其他文件访问 | 程序开始至程序结束 |
--- config: look: handDrawn themeVariables: fontSize: 20px --- mindmap 函数初步 函数定义 返回类型与返回值 形式参数 函数声明 函数调用 函数调用过程 传值参数 传引用参数 作用域 块作用域 文件作用域 存储类别 自动存储 静态存储 外部存储 static/extern关键字
学习目标
计算机程序设计