p182~p185:
函数
1、在调用函数和执行return语句的同时,也发生了控制权的转移。
2、函数返回值不能是一个数组。(但是可以返回一个包含数组的对象,或者指向数组的指针)
3、重要概念:名字的作用域和对象的生命周期。
4、对象的生命周期分两种情况:一种是对象定义在函数体外部(包括main函数1),则对象将存在于程序的整个执行过程,第二种是对象定义在函数体内部,被称为自动变量(包括形参和普通局部变量),在块的末尾将被自动销毁。
5、局部静态对象的生命周期是程序的整个执行过程。
6、局部静态变量的默认初始化结果不是未定义的!!!并且,即使程序执行的路径将多次经过初始化语句,局部静态变量也只会被初始化一次(仅第一次)。
7、函数原型=函数声明≈函数签名。
6.1
实参是形参的初始值,形参是函数内部执行时要用到的变量。
6.2
a - 返回类型不匹配
b - 正确
c - 花括号漏了一边。。。
d - 正确
6.3
#include <iostream> int fact(int val) { if (val == 1) return 1; return val * fact(val - 1); } int main() { std::cout << fact(4) << std::endl; // 24 return 0; }
6.4
#include <iostream> using namespace std; int fact(int val) { if (val == 1) return 1; return val * fact(val - 1); } int getFact() { cout << "Enter a number:" << endl; int x; cin >> x; return fact(x); } int main() { cout << getFact() << endl; return 0; }
6.5
int abs(int x) { if (x < 0) return -x; return x; }
6.6
形参和局部变量多属于自动对象,生命周期仅限于所在块的范围。
局部静态变量将存在于程序的整个执行过程。
#include <iostream> using namespace std; int test(int x) { cout << "==========" << endl; int i; // 默认初始化是未定义的! i += x; cout << "parameter val x=" << x << endl; cout << "local var i=" << i << endl; static int k; // 默认初始化为0!!! ++k; cout << "local static var k=" << k << endl; } int main() { for (int i = 0; i < 4; ++i) { test(i); } return 0; }
调用结果:
==========
parameter val x=0
local var i=6422476
local static var k=1
==========
parameter val x=1
local var i=6422477
local static var k=2
==========
parameter val x=2
local var i=6422479
local static var k=3
==========
parameter val x=3
local var i=6422482
local static var k=4
6.7
int test() { static int k; return k++; }