什么是"序列点"?
未定义的行为和序列点之间的关系是什么?
我经常使用有趣和复杂的表达方式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
考虑函数调用(调用int sum(int, int))
printf("%d", sum(a,b));
Run Code Online (Sandbox Code Playgroud)
编译器如何确定,函数调用中使用的函数sum(int, int)不是逗号运算符?
注意:我不想在函数调用中实际使用逗号运算符.我只是想知道编译器如何知道它不是逗号运算符.
据我所知,基本类型是Scalar和Arrays是聚合的,但是用户定义的类型呢?我将以什么标准将它们分为两类?
struct S { int i; int j };
class C { public: S s1_; S s2_ };
std::vector<int> V;
std::vector<int> *pV = &v;
Run Code Online (Sandbox Code Playgroud) 我知道以下是未定义的,因为我试图在同一个表达式中读取和写入变量的值,即
int a=5;
a=a++;
Run Code Online (Sandbox Code Playgroud)
但如果是这样,那么为什么以下代码片段未定义
int a=5;
a=a+1;
Run Code Online (Sandbox Code Playgroud)
在这里我也试图修改它的值a并同时写入它.
还解释了为什么标准没有解决这个问题或者删除这个未定义的行为,尽管事实上他们知道它是未定义的?
众所周知,这通过零循环:
while (x-- > 0) { /* also known as x --> 0 */
printf("x = %d\n", x);
}
Run Code Online (Sandbox Code Playgroud)
但x = x--产生未定义的行为.
这两个例子都需要一些'返回'值x--,我猜不到.如何x-- > 0定义但x = x--不是?