【问题标题】:Visual Studio pre-increment bug [duplicate]Visual Studio 预增量错误 [重复]
【发布时间】:2013-06-15 10:37:13
【问题描述】:

在我的代码中发现了一个奇怪的行为。

代码:

char foo[] = {64, 1};
int i = 0;

char c = ((foo[i]) | (foo[(++i)]));

cout << "Text: " << c << " " << (int)c << endl;

结果:

Text: ☺ 1

我看到的是“Text:A 1”而不是“Text:☺ 1”。由于某种原因,编译器忽略了“| foo[++i]”部分。

这个问题的解决方案很简单,只需要另外一行,但我感兴趣的是知道这是编译器错误还是只是 c++ 很奇怪。。 p>

在 VC10 和 VC11 中测试。

编辑:将 () 添加到代码中,仍然是相同的行为。

【问题讨论】:

  • foo[i] | foo[++i] 中的评估顺序未指定。有很多关于类似问题的问题,例如Undefined behavior and sequence points。在您的特定情况下,我猜i 首先递增(++i),然后您得到c = foo[1] | foo[1],即c = 1 | 1,即c = 1。请注意,依赖未排序的操作不仅会使结果难以预测,而且会导致未定义的行为。
  • @jogojapan @jprofitt 这不是一个评估排序问题,因为当我做这样的事情时结果是一样的char c = ((foo[i]) | (foo[(++i)]));
  • @TheVTM 括号不会改变这种情况。 |-operator 仍然有两个参数,并且标准未指定运算符参数(以及函数参数)的评估顺序。

标签: c++ visual-studio


【解决方案1】:

C++ 标准中没有记录表达式的顺序(不是格式正确的公式)。它取决于编译器的行为。例如:

push(pop() * pop());

C++ 没有记录调用pop() 的顺序。所以 MSVC 和 GCC 的结果是不同的。您应该逐步致电foo[i]foo[++i]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多