含有多个括号和自增运算的表达式
i=5,j=5,p,q;p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
运行结果,p=15,q=24
不明白以上两个表达式的计算顺序?
按照个人理解,按照括号优先,左结合性的原则,是p=5+6+7=18;q=6+7+8=21;
当把括号去掉时,x=i+++i+++i++;
y=(++j)+++j+++j;
运行结果为x=15,y=18,此时就更懵逼了。
所以在以上情况下的运算顺序时怎样的?感谢回答! 这里我们直接来分析汇编
00B21786mov eax,dword ptr
00B21789add eax,dword ptr
00B2178Cadd eax,dword ptr
00B2178Fmov dword ptr ,eax
00B21792mov ecx,dword ptr
00B21795add ecx,1
00B21798mov dword ptr ,ecx
00B2179Bmov edx,dword ptr
00B2179Eadd edx,1
00B217A1mov dword ptr ,edx
00B217A4mov eax,dword ptr
00B217A7add eax,1
00B217AAmov dword ptr ,eax
可以看到 对于p的操作,为前三行,是5+5+5 = 15,而后面的自加操作只影响i
对于q
00B217ADmov eax,dword ptr
00B217B0add eax,1
00B217B3mov dword ptr ,eax
00B217B6mov ecx,dword ptr
00B217B9add ecx,1
00B217BCmov dword ptr ,ecx
00B217BFmov edx,dword ptr
00B217C2add edx,1
00B217C5mov dword ptr ,edx
00B217C8mov eax,dword ptr
00B217CBadd eax,dword ptr
00B217CEadd eax,dword ptr
00B217D1mov dword ptr ,eax
是先将j加三次后,再加给q也就是8+8+8 = 24
以上皆为vs2019测试
建议遇到这种不会的推荐直接看反汇编分析过程
楼上说得对 其实看结果15和24就能猜到计算顺序,就是不知道这背后的规则是什么?总感觉有点怪异 一直在学习 发表于 2021-3-6 12:30
其实看结果15和24就能猜到计算顺序,就是不知道这背后的规则是什么?总感觉有点怪异
看汇编,不同编译器之间处理方法不同 一直在学习 发表于 2021-3-6 12:30
其实看结果15和24就能猜到计算顺序,就是不知道这背后的规则是什么?总感觉有点怪异
这样的代码没有标准的规则,因为标准没有规定这样的代码应该如何处理,所以决策权就交给了编译器的设计者,如果你是编译器的设计者,你遇到了这样的代码,你想怎么处理就怎么处理,就是这么随便,这样的代码不同的编译器会给出不同的结果,有的编译器会把所有的前++算完,然后是使用值,然后再算后++,有的编译器就按部就班的,++完一个就使用,然后再++,再使用
页:
[1]