c语言==和 的优先级,C语言优先级和(i ) (i )与( i) ( i)

本文通过分析VC6.0和gcc3.2.2下的汇编代码,探讨了C/C++中(i++)+(i++)和(++i)+(++i)两个表达式在不同编译器下的行为差异,揭示了运算符的副作用和编译器实现的影响。C#和Java对此有明确的规定,但在C/C++中则依赖于编译器。建议避免编写可能引起不确定性的代码。
摘要由CSDN通过智能技术生成

在网上看到了这篇文章,很不错就转载了,摘自:http://www.cnblogs.com/hustcat/archive/2009/06/02/1494311.html

与在前面:++(--)有太多让人困惑的地方,(i++)+(i++)与(++i)+(++i)有什么不同?为什么不同?如果从机器的角度去理解,就会豁然开朗。

先来看段程序:

int main(){ int i=3; int j=(i++)+(i++); // int j=(++i)+(++i); printf('%d,%d\n',i,j);}

(1)在VC 6.0下:

对于(i++)+(i++):

结果:i=5,j=6

相应的汇编代码为(有详细注释):

8B 45 FC mov eax,dword ptr [ebp-4] ;i->eax03 45 FC add eax,dword ptr [ebp-4] ;i+i=689 45 F8 mov dword ptr [ebp-8],eax ;6->j8B 4D FC mov ecx,dword ptr [ebp-4] ;i->ecx(=3)83 C1 01 add ecx,1 ;ecx=489 4D FC mov dword ptr [ebp-4],ecx ;4->i8B 55 FC mov edx,dword ptr [ebp-4] ;i->edx83 C2 01 add edx,1 ;edx=589 55 FC mov dword ptr [ebp-4],edx ;5->i

对于(++i)+(++i):

结果:i=5,j=10

相应的汇编代码为:

8B 45 FC mov eax,dword ptr [ebp-4] ;i->eax (=3)83 C0 01 add eax,1 ;eax=489 45 FC mov dword ptr [ebp-4],eax ;4->i8B 4D FC mov ecx,dword ptr [ebp-4] ;i->ecx83 C1 01 add ecx,1 ;ecx=589 4D FC mov dword ptr [ebp-4],ecx ;5->i8B 55 FC mov edx,dword ptr [ebp-4] ;i->edx03 55 FC add edx,dword ptr [ebp-4] ;edx=10 ,即i+i89 55 F8 mov dword ptr [ebp-8],edx ;10->j

(2)在gcc 3.2.2下:

对于(i++)+(i++):

结果:i=5,j=6相应的汇编代码为:

c7 45 fc 03 00 00 00 movl $3, -4(%ebp) ;3->i8b 55 fc movl -4(%ebp), %edx ;i->edx (=3)8b 45 fc movl -4(%ebp), %eax ;i->eax (=3)8d 04 10 leal (%eax,%edx), %eax ;i+i=6 ->eax89 45 f8 movl %eax, -8(%ebp) ;6->j8d 45 fc leal -4(%ebp), %eax ;&i->eaxff 00 incl (%eax) ;i++ ,即i=4,注意这里为寄存器间接寻址8d 45 fc leal -4(%ebp), %eax ;&i->eaxff 00 incl (%eax) ;i++,即i=5

对于(++i)+(++i):

结果:i=5,j=10

相应的汇编代码为:

movl $3, -4(%ebp) ;3->ileal -4(%ebp), %eax ;&i->eaxincl (%eax) ;i++,即i=4leal -4(%ebp), %eax ;&i->eaxincl (%eax) ;i++, i=5movl -4(%ebp), %eax ;i->eax, eax=5addl -4(%ebp), %eax ;i+i ->eax ,eax=10movl %eax, -8(%ebp) ;10->j

可见,对于VC6.0和gcc,二者的结果一致,但是gcc 3.2.2生成的汇编代码明显比VC6.0高效、简洁。这也许是因为VC 6.0出现较早的原因吧。

代码本身是没有意义,但是通过这段代码却可以理解机器层面的东西,而这也是我想表达的。

事实上,C#语言及Java语言对表达式的副作用及在运算中的表现有严格的规定,也就是说,有确定的答案。但在C及C++,没有确定的答案,因为这在语言中没有规定,是由编译器来决定的。

从这个角度看,永远不要写出这种“应试教育”的产物。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值