【问题标题】:What is the result of i + ++i? [duplicate]i + ++i 的结果是什么? [复制]
【发布时间】:2011-05-04 03:26:39
【问题描述】:

可能重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)

为什么这段代码会生成 8 作为结果?

#include <iostream> 
using namespace  std ;
void myFunction(int i)
{
    i = i + 2 + ++i;
    cout<<i<<endl;
}

void main () 
{
    int i = 2;
    myFunction(i);
    cin>> i;
}

我认为结果应该是 7 而不是 8...我使用的是 Visual Studio 2008

【问题讨论】:

  • 另外,void main() 不是标准 C++。将其更改为int main()
  • 为什么,为什么这似乎是这个标签中人们心中的第一大问题?
  • Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc...) 的可能副本。搜索sequence points获取更多答案。
  • 该语句的结果应该是下一次代码审查的一个大问题。
  • @M.H:不要因为你不知道如何使用而责怪语言。当你用枪指着你的脚时,不要责怪你的脚趾。

标签: c++


【解决方案1】:

此表达式右侧术语的评估顺序

i = i + 2 + ++i;

未定义。即它们可以以任何顺序出现。在这种情况下,编译器选择先增加 i(++i,第三项),然后再计算 i(第一项),结果为 3 + 2 + 3。

【讨论】:

  • 实际上,整个行为是未定义的,编译器在将表达式计算为 42 时将符合标准。
  • 未定义的行为很棒(对于编译器开发人员):)
  • @Dijkstra:对于编译器开发人员来说,未定义的行为意味着永远不必承认自己犯了错误,并且测试可接受的输出是轻而易举的事。
  • 这真的是未定义的吗?它不是执行最高的先例操作(preincrement),所以现在 i=3 然后是从左到右关联性的加法,(i+2)+i,得到 8 的值?
  • @John:运算符 ++ 的优先级仅适用于表达式 (++i)。优先级要求在将表达式添加到 (i + 2) 之前发生增量,但它不要求在评估第一个 i 的值之前发生增量。
【解决方案2】:

您在一个语句中更改了i 两次,并且还以与更改无关的方式引用了它的值。这是未定义的行为,没有唯一的正确答案。

【讨论】:

  • 或者你可以说有无数个正确答案,但没有错误答案。 ;)
  • 这只会发生在 c++ 中吗?
  • 它在 C 中也是未定义的
  • @M.H.:C++ 和 C。其他语言有规则可以明确定义这样的表达式。相信下一个C++标准会有规则定义更多这样的表达式,不过我还没研究过,VS2008还是在目前的标准上。
  • @M.H:如果您编写这样的代码,即使代码定义明确,您的同事也会过来揍您。因为使它明确定义的规则将是如此模糊,以至于没有人真正知道它是无价的(他们从一个朋友的堂兄那里听说两次移除了姐妹的丈夫,它确实是 X)。从初学者到专家,每个人都应该易于阅读代码。否则它是不可维护的,并且根据定义是坏的(如狗)。
【解决方案3】:

未指定的行为。它可以是任何值。不允许在单个序列点中多次修改变量。

【讨论】:

  • 未定义,不是未指定 :)
  • 该标准在这个问题上有点令人困惑,但显示了类似于 OP 的示例并将它们称为“未指定”。
【解决方案4】:

++i 在所有其他语句之前执行,因此在i + 2 + ++i 行中,结果是(i=2)3 + 2 + 3,即 8。

【讨论】:

    【解决方案5】:

    它首先评估“++i”。 "i" 然后是 3,所以你最终得到 3 + 2 + 3 = 8。 这是一个很好的例子,说明为什么要小心操作员!

    【讨论】:

      猜你喜欢
      • 2019-05-03
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多