【问题标题】:C/C++ post-increment/-decrement and function call [duplicate]C / C ++后增量/减量和函数调用[重复]
【发布时间】:2013-01-19 16:19:41
【问题描述】:

可能重复:
Undefined Behavior and Sequence Points

我正在使用 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--);

这将输出“first: 10 / second: 10”。

所以我的问题是:这种情况是否有任何明确的行为?有人可以指出我描述的文件吗?有没有发现编译器的bug~~O.O~~?

这个例子很简单,不再有意义,它只是展示了我的问题并且可以自己工作。

【问题讨论】:

  • 是否有任何已定义的行为 => 没有
  • @ipc:这每次都让我感到困惑:为什么行为“未定义”而不仅仅是“未指定”?不只是未指定参数的评估顺序吗?
  • @AndyProwl 未指定求值顺序,未定义访问同一变量并以无序列方式对其进行修改。哦等等,我想我看错了你的问题......
  • @AndyProwl 我认为这仍然是未定义的行为,但我没有标准参考,让我找到它。

标签: c++ c function call post-increment


【解决方案1】:

有两个相关的问题在起作用。首先,函数参数的执行顺序是未指定。保证的是在进入函数体之前所有的都被执行。其次,这是 undefined 行为,因为您正在更改和读取 n,而这些表达式之间没有任何序列点。

【讨论】:

  • 谢谢。我知道参数的未指定执行顺序,但不知道这会影响 post 运算符。我以为它们总是会在下一个分号之后被执行。
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2015-05-21
  • 2013-07-15
  • 2017-04-30
  • 2014-12-09
相关资源
最近更新 更多