1. 关于增值语句
mango[i++] += y;
被当作 mango[i] = mango[i] + y; i++; 而不是 mango[i++] = mango[i++] + y;
“++x” 表示:取x的地址,增加它的内容,然后把值放在寄存器中;
“x++” 表示:取x的地址,把它的值装入寄存器中,然后增加内存中x的值。
2. 关于数组和指针参数
实参 | 所匹配的形式参数 | ||
数组的数组 | char c[8][10]; | char (*c)[10]; | 数组指针 |
指针数组 | char *c[15]; | char **c; | 指针的指针 |
数组指针(行指针) | char (*c)[64]; | char (*c)[64]; | 不变 |
指针的指针 | char **c; | char **c; | 不变 |
3. 多维数组的分解
实际上,在C语言中不支持多维数组,只支持“数组的数组”
int apricot[2][3][5];
兼容类型:
int (*p)[3][5] = apricot;
int (*r)[5] = apricot[i];
int *t = apricot[i][j];
int u = apricot[i][j][k];
4.const与 #define的差异
在C++中,两者都可以用来定义常量,差别在于:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查;而对后者只进行字符替换,没有类型的安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
建议在C++程序中只用const常量,而不使用宏常量。
5.float -> double -> long double
int -> unsigned int -> long int -> unsigned long int
当把有符号操作数和无符号操作数整合时,会通过把符号位看成数的位的方法把有符号操作数“转换”成无符号的值。这条规则可能会导致某些隐蔽的编程错误。