1.预编译指令,如#include,#define会在编译之前进行
2.反汇编:
1)mov dword ptr[i_num],0
其中,[ ]之中i_num本来应该是ebp+偏移地址,编译器为了便于我们查看,才用的i_num,[ ]是根据这个地址,往里面去存储值
2)int num=100;
这里的100并没有占用空间,而是直接转成16进制赋给num
3)sum=100+200;
sum=i_num+sum;
这两个表达式中,都是将右边的值先计算出来,然后通过mov指令放入指定空间
4)连续赋值语句:int i_other_num=sum=i_num
从右向左进行运算
例:int sum=25+BASE*3;
是以二叉树的方法进行计算的:
5)运算优先级:
imul 乘法
cdq:把位数扩充到64位(并不一定是64位,但是必须是除数的2倍)
cdq指令是为了idiv(除法)存在的
3.typedef:示例代码:
#include<stddef.h>
typedef unsigned int index;
...
index i=22;
4.ize_t 是sizeof的返回值,单位是byte,与int相比,给了该数字一个特殊的含义(代表一个长度)
sizeof是一个操作符而不是函数:
可以在反汇编中查看,当执行printf这个函数体使,会有call指令进行跳转,但是在执行sizeof这个指令时,是直接将值赋给左边
5.i++和++i
i++:执行完当前语句再++
printf("%d",i++);
printf("%d",i);
在反汇编中,其实在执行printf语句之前,i就完成了自加,但是在printf时,所传递进去的参数是保存原来值(一个临时变量)的地址,所以打印出了原来的值,再打印第二个printf时,就变成了i+1的值
++i:直接+1,使得i的值改变了,在进行函数调用的时候,传送的是现在的i的地址(并没有用到备份)
6.注意:优先级必须做到能让人工辨别,而不是让编译器去辨别:不要写出令人费解的复合表达式!!!