c 与 c++ 的一些知识点
这里会记录一些c\c++的一些知识点,常看常新。
(1)printf 函数与自增的结合使用
int i = 0; printf("%d, %d", ++i, i++);
这个printf输出会是什么? g++ 编译后运行结果是"2, 0",而不是"1, 1"。c\c++ 函数参数压栈的顺序是从右至左,体现在上面就是先压入"i++",再压入"++i",这样由于栈是后进先出的,所以第一个参数"++i"结果会被放在栈顶位置。c\c++的函数实参可以是任何表达式,只是实际运行时会被先计算出一个结果在传递进函数。对于这样的问题更详细的解说可以参见csdn的这个帖子。
(2)*ptr++ 的特点分析
很多时候会看见这样的表达式 "*dst++ = *src++" 。这个表达式包含有下面几个知识点:
- 后缀“++”运算符优先级高于 “*”;
- ++ operator 产生 ptr 的一个副本拷贝;
- ++ 后缀操作增加 ptr 本省的值;
- 在 ptr 拷贝上执行提领“*”访问;
(3)sizeof 与 内存对齐
struct aa { char a; char b; double c; } printf("%d", sizeof(aa));
输出应该是多少? struct 的大小是其最大子元素(基本数据类型)的整数倍。这和内存对齐有关系。所以输出是 16。我之前有一篇和这个主题相近的一片文章,参见这里。有关内存对齐的问题以后再说。