#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;
}
ch7-使用函数组织代码
猜你喜欢
转载自www.cnblogs.com/splitfire/p/9254677.html
今日推荐
周排行