什么是"序列点"?
未定义的行为和序列点之间的关系是什么?
我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?
如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
#include <stdio.h>
int main(void)
{
int i = 0;
i = i++ + ++i;
printf("%d\n", i); // 3
i = 1;
i = (i++);
printf("%d\n", i); // 2 Should be 1, no ?
volatile int u = 0;
u = u++ + ++u;
printf("%d\n", u); // 1
u = 1;
u = (u++);
printf("%d\n", u); // 2 Should also be one, no ?
register int v = 0;
v = v++ + ++v;
printf("%d\n", v); // 3 (Should be the …Run Code Online (Sandbox Code Playgroud) c increment operator-precedence undefined-behavior sequence-points
我们班的C编程教授问了这个问题:
你得到的代码:
int x=1;
printf("%d",++x,x+1);
Run Code Online (Sandbox Code Playgroud)
它总会产生什么输出?
大多数学生说未定义的行为.任何人都可以帮助我理解为什么会这样吗?
感谢编辑和答案,但我仍然感到困惑.
int foo(int c){
return c;
}
int main(void){
int a=5,c;
c = foo(--a) + a;
}
Run Code Online (Sandbox Code Playgroud)
它会在C/C++中调用未定义的行为吗?我想不,不会.
在阅读完所有答案之后,我无法弄清楚它是未定义的行为还是未指定的行为.