【问题标题】:Compiler issue or some bug in code block of c [duplicate]编译器问题或c代码块中的一些错误[重复]
【发布时间】:2013-06-01 18:37:05
【问题描述】:

c++中的简单编码出现了一个非常惊人和令人震惊的逻辑问题。

请看以下两段代码。

代码 1

int m = 5, n = 0;
n = m++ * ++m;
//This print m = 7 and n = 36
//Which is logically wrong

代码 2

int m = 5;
int n = m++ * ++m;
//This print m = 7 and n = 35
//Which is logically right

我们从逻辑上认为代码块 2 给出了正确答案,但令人惊奇或神奇的是代码块 1 有什么问题?

部分代码相同,只是我们之前声明了int n

可能有些编译!!!!!!

【问题讨论】:

  • m++ * ++m未定义的行为。您的输出没有任何“逻辑错误”;是你的代码坏了。
  • 我想一个有效的问题是:为什么这个编译器实现会这样工作。
  • @RaymondChen,你没有回答我的问题。该实现本可以催生一款井字游戏,但它没有。
  • 不要认为这个问题值得投反对票 - 可能标记/关闭为重复的 wrt 序列点和未定义的行为。对于想要弄清楚的新手(和新成员)来说,这些东西可能会令人惊讶。

标签: c++ compiler-construction


【解决方案1】:

检查http://en.cppreference.com/w/cpp/language/eval_order,尤其是讨论“未定义行为”的部分。基本上这不是编译器中的错误。语言说你正在做的事情是未定义的。

【讨论】:

    【解决方案2】:

    除了重要的“未定义行为”部分之外,这里没有什么不合逻辑的地方。假设评估是从右到左:

    ++m -> value is 6, m is 6
    m++ -> value is 6, m is 7
    6*6 = 36
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多