如果 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++;
我是 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++;