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

what is the value of a++ + a if value of a is 5?

我是 c 的初学者,我发现很难理解 post 和预增量我在下面给出了我的代码,我已经在 turbo c++ 编译器中编译了它并且我得到了输出 a = 6 和 b = 10 但是由于使用了 post 增量运算符,输出应该是 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;    
}

a++ + a; 的行为在 C 中是 undefined。这是因为 + 不是 序列点 并且您实际上是在尝试在同一表达式中递增和读取 a

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

为了理解前缀和后缀增量,使用像 b = a++;b = ++a;

这样的语句

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

接下来会发生什么?

b = a++ + a; 

1) a 是否自增,其原值再与a的原值相加?

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

3) 右边的a是先取后加到一个递增的a的原值上吗?

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

因此这是实现定义的行为。相反:

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

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