请解释一下变量的自增自减问题,谢谢!
以下程序的运行结果为:j=9
main()
{int i=1,j;
j=++i*++i;
printf(“j=%d”,j);
}
为什么改成float型后结果就为j=6 ?
main()
{float i=1,j;
j=++i*++i;
printf(“j=%f”,j);
}
{float i=1,j;
j=++i*++i;
printf(“j=%f”,j);
}
>> 本文固定链接: http://www.vcgood.com/archives/3276
对于第一个程序结果 j=9 我想不明白,反汇编下看看到底是什么原因吧
反汇编的结果如下:
int i=1,j;
j=++i*++i;
对应的汇编代码如下:
0BBE:01FF BE0100 MOV SI,0001
0BBE:0202 46 INC SI
0BBE:0203 46 INC SI
0BBE:0204 8BC6 MOV AX,SI
0BBE:0206 F7E6 MUL SI
0BBE:0208 8BF8 MOV DI,AX
解释下:
MOV SI,0001
给寄存器SI赋值为1,相当于i=1,这里SI就是存储变量 i 的地方
INC SI
把SI加上1,相当于++i
因为j=++i*++i 中有两个++i,所以INC SI要执行两次就变成3了
下面要进行乘法运算了
MOV AX,SI
把SI的值3放到另一个寄存器(可以看做其他的变量)中
MUL SI
把SI和AX相乘,其实也就是SI和自己相乘:3*3=9
分析到这里的话我们就可以看出来表达式 j=(++i)*(++i) 中前后 (++i) 的值应该是相同的,因为 i 只有一个存储空间SI,所以j=(++i)*(++i)可以看成是SI*SI=3*3=9
改为float型后 j=6 ,呵呵,这个没有分析出来,不过原因可以肯定是int 和 float 数据类型长度不同
有不对的地方请指出