ch7-使用函数组织代码

#include <QCoreApplication>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const qreal Pi = 3.14159265;

void displayArr(int arr[], uint len);
void displayArr(char arr[], uint len);
// 原书笔误
// void displayArr(int[] arr, uint len);
// void displayArr(char[] arr], uint len);

void displayVec(vector<int>& arr)
{
 // 同行加一下斜杠
 for_each(arr.begin(), arr.end(), \
  [](int ele) {cout << ele << " ";}); 

 cout << endl;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

 //1.
 // 如果没有函数原型,编译器遇到 main( )中的第 16 和 19 行时,将不知道 Area 和 Circumference 是
 // 什么。函数原型告诉编译器, Area 和 Circumference 是函数,它们接受一个类型为 double 的参数,并
 // 返回一个类型为 double 的值。这样,编译器将意识到这些语句是合法的,而链接器负责将函数调用与
 // 实现关联起来,并确保程序执行时将触发它们

 // 可以给多个参数指定默认值,但这些参数必须位于参数列表的末尾

 // 如果没有退出条件或存在 bug,递归函数可能不断调用自己,直到栈溢出后才停止,导致应用程序崩溃。

 //2.
 // 名称和返回类型相同,但参数不同的函数被称为重载函数。

 //3.
 // 由于 Area()的第 二个参数是按引用传递的,因此 Area()中第 8 行使用的变量 result,与 main()中第 17 行声明的 double
 // areaFetched 指向同一个内存单元
#if 1
 const uint ARR_LEN = 4;
 int intArr[ARR_LEN] = { 1, 2, 3, 4 };
 char chArr[ARR_LEN] = { 'H', 'e', 'l', '\0' };

 displayArr(intArr, ARR_LEN);
 displayArr(chArr, ARR_LEN);
#endif

 //4.
 //4.1 微处理器如何处理函数调用
 // 编译器将函数调用转换为一条供微处理器执行的 CALL  指令,该指令指出了接下来要获取的指令所在的地址,该地址归函数所有。
 // 遇到 CALL 指令时,微处理器将调用函数后将要执行的指令的位置保存到栈中,再跳转到 CALL 指令包含的内存单元处

 // 该内存单元包含属于函数的指令。微处理器执行它们,直到到达 RET 语句(与您编写的 return 语句对应的微处理器代码)。 
 // RET 语句导致微处理器从栈中弹出执行 CALL 指令时存储的地址。该地址包含调用函数中接下来要执行的语句的位置。
 // 这样,微处理器将返回到调用函数,从离开的地方继续执行。

 // 栈的性质使其非常适合用于处理函数调用。函数被调用时,所有局部变量都在栈中实例化,即被压入栈中。
 // 函数执行完毕时,这些局部变量都从栈中弹出,栈指针返回到原来的地方。

 //4.2 内联函数
 // 常规函数调用被转换为 CALL 指令,这会导致栈操作、微处理器跳转到函数处执行等。
 // 程序员使用关键字 inline 发出请求,要求在函数被调用时就地展开它们(将函数 DoubleNum()的内容直接放到调用它的地方)

 // 将函数声明为内联的会导致代码急剧膨胀,在声明为内联的函数做了大量复杂处理时尤其如此。
 // 应尽可能少用关键字 inline,仅当函数非常简单,需要降低其开销时(如前面所示),才应使用该关键字。

 // 优化代码大小时,编译器可能拒绝众多的内联请求,因为这会让代码急剧膨胀。
 // 优化速度时,编译器通常会寻找并利用合理的内联机会,为您完成内联工作,即便您没有显式地请求这样做。

 //4.3 使用auto自动推断函数返回值

 //4.4 lambda函数
#if 0
 vector<int> arr;
 arr.push_back(500);
 arr.push_back(100);
 arr.push_back(-200);
 arr.push_back(-100);

 displayVec(arr);

 sort(arr.begin(), arr.end(), [](int e1, int e2) {return e1 < e2;});
 displayVec(arr);
 sort(arr.begin(), arr.end(), [](int e1, int e2) {return e2 < e1; });
 displayVec(arr);
#endif

    return a.exec();
}

void displayArr(int arr[], uint len)
{
 for (uint i = 0; i < len; ++i)
 {
  cout << arr[i] << " ";
 }

 cout << endl;
}

void displayArr(char arr[], uint len)
{
 for (uint i = 0; i < len; ++i)
 {
  cout << arr[i] << " ";
 }

 cout << endl;
}




猜你喜欢

转载自www.cnblogs.com/splitfire/p/9254677.html