x = x + (x++) + (++x)运算符的运算优先级有关问题,在群里争执不下

x = x + (x++) + (++x)运算符的运算优先级问题,在群里争执不下
今天在QQ群里有人发了段代码:

int x=5;
x = x + (x++) + (++x)

结果当然等于17

但群主和一些人认为是按从左到右的顺序运算的,算成了 5+5+7
而我认为是先算 ++x,算成是 5+6+6

没一个人说我是对的,难道微软连最基本的运算符优先级都会弄错?
我说服不了他们,你们谁能证明一下谁对谁错。




------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

这个属于语言规范未定义,因此不同编译器实现得到不同的结果都有可能。

都是微软的Visual Studio,c#是微软开发的,又不是和c++比较结果,同是c#,怎么可能会不一样。

编译器输出什么就是什么呗。这个没有道理可以讲。

编译器在语言规范允许的范围内,他可以按照怎么实现编译器简单,怎么样优化代码性能的任意方式去实现,不用为结果不同负责。这就是“语言未定义”的意思。


表达式的结果是17,这个没有什么不同,任何语言都有自己的运算符优先规则,版本你的意思是
5+5+7

5+6+6
这2个都对?

我说的“对”的含义是,如果你设计一个C#编译器,它符合了C#语言规范的所有要求,即便它和微软的特定的编译器编译出来的程序的结果不同,但是它遵守了语言规范的要求,这个编译器就是合格的。

但是具体到某个程序,如果你使用了语言未定义的语法,那么这么做是“不对”的,因为你将自身置于危险之中。你的程序输出的结果不受你的控制,不符合你的预期。即便它现在能工作。但是如果有人换了编译器,启用了某个优化选项,或者放在特定上下文下,它的结果可能和编写代码的人期望的不同,那你的程序可能存在隐患。
------解决方案--------------------
微软官方http://msdn.microsoft.com/zh-cn/library/aa691323(v=vs.71).aspx明确提到
除了赋值运算符外,所有的二元运算符都向左顺序关联,意思是从左向右执行运算。例如,x + y + z 按 (x + y) + z 计算。
赋值运算符和条件运算符 (?:) 向右顺序关联,意思是从右向左执行运算。例如,x = y = z 按 x = (y = z) 计算。
当然你可以说C#编译器还有mono...