【c++ primer, 5e】【函数基础】

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++;
}
原文地址:https://www.cnblogs.com/xkxf/p/6571921.html