例如以下程序:
int main()
{
int i = 2; int num;
num = (++i)+(++i)+(++i)+(++i);
printf("%d%d\n",num,i); return 0;
}
其输出结果为:num = 19; i = 6。
其运算过程是:num = 4+4+5+6 = 19 i = i+4=6
int main()
{
int i = 2;
int num;
num = (i++)+(i++)+(i++)+(i++);
printf("%d%d\n",num,i);
return 0;
}
其运行结果为:num = 8; i = 6。 其运算过程是:num = 2+2+2+2 =8 i = i+4=6
而不是14
我的理解是i++时,编译器是直接将(i++)当成常量相加,相加完后,再执行自增运算。
++i时:
VC编译器是这么处理的,在进行加法运算时,求出了左值和右值之后,就求出他们的和,再进行下一步操作;
VS编译器是这样处理的,在多个式子相加的时候,先求出各个因式的值,最后一起执行加法操作(也就是执行++i,++i,++i之后,再求他们的和,所以是18); 这里我们还应该注意一点:对(++i)进行操作的时候(假设地址p出存放的是i的值),我们用的还是地址p处的值,也就是与i相关的操作执行之后(要考虑优先级)i的值。
总之这个问题得分编译器,不能一概而论。