C / C ++后
可能重复:
未定义的行为和序列点
我正在使用Microsoft Visual C ++。 看看下面的例子:
int n = 5;
char *str = new char[32];
strcpy(str, "hello world");
memcpy(&str[n], &str[n+1], 6+n--);
printf(str);
// output is "hell world"
因此,我的编译器生成的代码首先递减n,然后执行memcpy。 以下来源将做我预计会发生的事情:
int n = 5;
char *str = new char[32];
strcpy(str, "hello world");
memcpy(&str[n], &str[n+1], 6+n);
n--;
printf(str);
// output is "helloworld"
首先,我试图向自己解释。 最后一个参数首先被推入堆栈,因此可以先评估它。 但我真的相信后增加/减少保证要在下一个分号后进行评估。
所以我跑了下面的测试:
void foo(int first, int second) {
printf("first: %i / second: %i", first, second);
}
int n = 10;
foo(n, n--);
这将输出“第一:10 /秒:10”。
所以我的问题是:这种情况有没有定义的行为? 有人可以将我指向描述这种情况的文档吗? 我发现了一个编译器错误~~ OO ~~?
这个例子很容易让人不再感觉到,它只是证明了我的问题,并且独自运作。
有两个相关的问题在起作用。 首先,函数参数的执行顺序是未指定的 。 保证的是在进入函数体之前全部都被执行。 其次,它是未定义的行为,因为你正在改变和阅读n
而这些表达式之间没有任何顺序点。
上一篇: C/C++ post