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.cppmain.cpp,随堂编程练习的代码请直接在此文件中编辑测一测
南北朝《张丘建算经》中叙述了一个”女不善织“问题,本质上是等差级数求和。请补充代码,使用循环求解该问题。
有女不善织,日减功迟。初日织五尺,末日织一尺,今三十日织讫,问织几何?
学习目标
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 0x7ffca718c418
Argument x is at memory 0x7ffca718c430
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/ccvmqWdU.o: warning: relocation against `PI' in read-only section `.text'
/usr/bin/ld: /tmp/ccvmqWdU.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关键字
学习目标
计算机程序设计
