我是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;
}
答案 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