一直在学习 发表于 2021-3-5 18:50:33

含有多个括号和自增运算的表达式

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,此时就更懵逼了。

所以在以上情况下的运算顺序时怎样的?感谢回答!

Sunr 发表于 2021-3-6 02:23:30

这里我们直接来分析汇编
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测试

建议遇到这种不会的推荐直接看反汇编分析过程

永恒的蓝色梦想 发表于 2021-3-6 10:57:22

楼上说得对

一直在学习 发表于 2021-3-6 12:30:14

其实看结果15和24就能猜到计算顺序,就是不知道这背后的规则是什么?总感觉有点怪异

Sunr 发表于 2021-3-6 13:30:32

一直在学习 发表于 2021-3-6 12:30
其实看结果15和24就能猜到计算顺序,就是不知道这背后的规则是什么?总感觉有点怪异

看汇编,不同编译器之间处理方法不同

人造人 发表于 2021-3-6 15:00:30

一直在学习 发表于 2021-3-6 12:30
其实看结果15和24就能猜到计算顺序,就是不知道这背后的规则是什么?总感觉有点怪异

这样的代码没有标准的规则,因为标准没有规定这样的代码应该如何处理,所以决策权就交给了编译器的设计者,如果你是编译器的设计者,你遇到了这样的代码,你想怎么处理就怎么处理,就是这么随便,这样的代码不同的编译器会给出不同的结果,有的编译器会把所有的前++算完,然后是使用值,然后再算后++,有的编译器就按部就班的,++完一个就使用,然后再++,再使用
页: [1]
查看完整版本: 含有多个括号和自增运算的表达式