Why is `i += i++` 1 in C and 0 in C#?
Possible Duplicate:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
关于堆栈溢出有一个非常好的问题。
对于i=0,为什么(i+=i++)等于0?
但是当我在C中尝试相同的代码时,它给出了不同的结果:
1 2 3
| int i = 0;
i += i++; // 1 in C and 0 in C#
printf("%d", i); |
但以下内容:
1 2
| i = i++ + i; // 1 in C and 1 in C#
i += i++ + i; // 1 in C |
在C中,它评估++和=+操作符,首先为每个fo指定tempVar,并对tempVars执行操作。C是如何实现它的?或者是不同的建筑?
- 因为未定义的行为是未定义的?
- C++标准以其无穷的智慧,使得顺序表达式被评估为未定义的。
- 是的,行为未定义。没有规定是先评估+=还是先评估++。它甚至可以在一个编译器中变化。
- 因为微软口述了C在C或C++中的行为,所以没有强制执行者的喉咙这样的规则。
- @HotLicks:"它没有指定是先计算+=还是先计算++"---实际上这根本不是问题。运算符优先顺序清楚地表明,将首先评估++。
- @泽克斯-不是真的。优先级与评估顺序不同。
- 这个问题令人困惑。标题说i = i++,但实际的测试用例是i = i++ + i(实际上它只是未定义的行为)。我要编辑标题。
- @泽尔克姆,你以后能不能换个说法?有这么多人认为,运算符优先级决定了评估顺序,因此您的评论可能会加剧误解。事实上,i++是+=的一个操作数,需要在+=之前对i++进行评估。
- @zneak i = i++也是不明确的行为。
- @丹尼尔·费舍尔:配方非常清楚。在这种情况下,未定义的行为是由一个序列点(两个序列点之间的两个修改)而不是运算符优先级引起的。"事实上,i++是+=的一个操作数,这要求在+="之前对i++进行计算——这是事实,因为运算符的优先级,而不是别的。
- @Daniel Fischer:"i=i++也是未定义的行为。"——是的,而且它仍然与"它没有指定首先评估哪些操作符=或++"无关",这又是由序列点之间的2个值修改引起的。
- "是的,是的。我以为你知道。但我也看到过这样一种观点,即评价顺序是由运算符优先权直接决定的(例如,在x && y++中,y++由于优先权必须首先进行评价),我担心你的陈述会加深这种混淆。如果你不省略由优先权决定的分组,我希望这样做不太容易加深混乱。
- @Zerkms的另一件事是对zneak的回复,"但是实际的测试用例是i = i++ + i"(这里实际上只是未定义的行为),而不是对您。
- @丹尼尔·菲舍尔:"另一件事是对兹内克的答复。"——哦,好吧。我习惯于经常看到我的昵称拼写错误,所以我会回复任何以zlol)开头的内容。
C标准没有规定评估顺序。它留给编译器实现。
- 评估顺序到底是什么?
- 正如您在评论中所说,我们不知道是先计算+=还是++。
- 这并不重要,因为在测试用例中,表达式是i++ + i(与问题标题中的描述相反)。首先计算的是未定义的。
- @伊贡:我没这么说。由于运算符的优先级,已知哪个是第一个-++。不是答案?
- 我想,虽然我看到问题已经解决了…
- 这不仅仅是未指定的,C标准明确表示结果是未定义的。在程序中有一个未定义的部分会使它无效,任何事情都可能发生。