i + ++i 的结果是啥? [复制]
Posted
技术标签:
【中文标题】i + ++i 的结果是啥? [复制]【英文标题】: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:不要因为你不知道如何使用而责怪语言。当你用枪指着你的脚时,不要责怪你的脚趾。
【参考方案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。 这是一个很好的例子,说明为什么要小心操作员!
【讨论】:
以上是关于i + ++i 的结果是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章