Poedu_C语言_lesson18_20160919_运算符运用

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.注意:优先级必须做到能让人工辨别,而不是让编译器去辨别:不要写出令人费解的复合表达式!!!













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值