如果a的值是5,那么a ++ + a的值是多少?

时间:2015-12-11 15:44:28

标签: c post-increment

我是c的初学者,我发现很难理解我在下面给出我的代码的帖子和预增量,我已经在turbo c ++编译器中编译了它并且输出为       a = 6和b = 10 但是由于使用了后增量运算符,输出应该是a = 6和b = 11,为什么不发生?有人可以解释它.. < /强>

#include<stdio.h>    
int main()    
{
    int a=5,b;
    b = a++ + a;    
    printf("\na = %d and b = %d",a,b);    
    return 0;    
}

3 个答案:

答案 0 :(得分:6)

a++ + a;的行为在C中是 undefined 。这是因为+不是排序点而你是基本上试图在同一个表达式中递增并读取a

所以你不能保证一个特定的答案。

为了理解前缀和后缀增量,请使用b = a++;b = ++a;等语句

答案 1 :(得分:3)

以下会发生什么?

b = a++ + a; 

1)a是否会增加,然后将其原始值添加到原始值a

2)a是否会增加,然后将其原始值添加到a的新值?

3)右边的a先取出,然后加到增量a的原始值吗?

C允许任何这些方法(以及可能的其他方法),因为这行代码缺少定义评估顺序的序列点。缺乏限制允许编译器经常制作优化的代码。这是有代价的,因为当以上述各种方式访问​​a时,这些方法不会产生相同的结果。

因此它是实现定义的行为。代替:

b = a++; 
b = b + a; 

b = a; 
b = b + a++; 

答案 2 :(得分:1)

int a = 5;a的值为5

b = a; // b is 5;

int a = 5;a++的值为5

b = a++; // b is 5

a++的副作用是增加a的值。这种增加可以在最后一个和下一个序列点之间的任何时间发生(基本上是最后一个和下一个分号)。

所以

/* ... */;
b = a++ + a;
#if 0
    /* side-effect */ 5 + 6
    5 /* side-effect */ + 6
    5 + /* side effect mixed with reading the value originating a strange value */ BOOM
    5 + 5 /* side effect */
#endif