关于c++ 为什么是十六啊

来源:百度知道 编辑:UC知道 时间:2024/06/06 03:08:03
#include<iostream.h>
int main()
{
int l, i=3;
l=++i+(++i)+(++i);
cout<<l;}
各位大虾帮帮忙啊

这个很奇怪,我也觉得应该是(4)+(5)+(6)=15,可是用c和C++编译出来都是16,计算过程是先把i自加两次成为5,然后两个5相加得到10,然后i再自加一次变为6,最后再把10和6相加得到16。
汇编结果如下:
movl $3, -8(%ebp) i=3
leal -8(%ebp), %eax
incl (%eax) i自加一次,变为4
leal -8(%ebp), %eax
incl (%eax) i再自加一次,变为5
movl -8(%ebp), %eax eax = 5
movl -8(%ebp), %edx edx = 5
addl %eax, %edx edx = eax + edx = 10
leal -8(%ebp), %eax
incl (%eax) i自加,变为6
movl %edx, %eax eax = edx = 10
addl -8(%ebp), %eax eax = eax + 6 = 10 + 6 = 16
movl %eax, -4(%ebp) l = eax = 16

这样的表达式的求值顺序是没有定义的。因为分号是一个顺序点,而二元加号不是一个顺序点,非顺序点连接起来的各个表达式的求值顺序是任意的,并且它们的副作用只在下一个顺序点之后才生成,这里分号是一个顺序点,理论上所有++操作和赋值操作的副作用都要在分号之后才生成。但是这一点并不是强制编译器必须要等到分号结束之后才执行赋值操作,只是规定一个顺序点之前的表达式求值所产生的副作用只有等到这个顺序点结束才是确定的。而在这个顺序点结束之前,编译器对位于该个顺序点和前一个顺序点之前的表达式以任意顺序求值。你这个表达式不符合规定,编译器给出的值也具有一定的