我想知道为什么在C#中以下情况很好:
int y = x++-+-++x;
但是
int y = x+++-+++x;
不?为什么对+?
存在偏见答案 0 :(得分:16)
另外两个答案是正确的;我将补充一点,这说明了词法分析的一些基本原则:
这些原则意味着+++x
将被定为++ + x
而不是+ ++ x
。
解析器然后将++ + x
解析为++(+x)
,而(+x)
不是变量,它是值,所以它不能递增。
另请参阅:http://blogs.msdn.com/b/ericlippert/archive/2010/10/11/10070831.aspx
答案 1 :(得分:5)
我正在使用VS 2012.这很有意思。
第一个可以解析为:
int y = (x++) - (+(-(++x)));
不改变最终结果。所以你可以看出为什么它会有效。
然而,第二个问题与+++x
存在问题,因为(我猜)它看到了两个++,并尝试将该一元运算符应用于r值,这是另一个+(而不是有效的r值)。
但是,您可以通过各种方式对其进行分组以使其正常工作:
int y = (x++)+(-(+(++x)));
有效。
我确信Jon Skeet或Eric Lippert或其他人会出现并指出C#规范的相关部分。我甚至不确定从哪里开始。但是,只需遵循一般的从左到右的令牌解析,你就可以看到它在第二个上会窒息。
答案 2 :(得分:2)
编译器在++
中的第二个int y = x+++-+++x
之后查找变量或属性,并且无法确定没有空格或括号。
您可以执行以下操作:
int y = x+++-+(++x);
或
int y = x++ + -+ ++x;
如果你想要的话。
您列出的第一个示例之所以有效,是因为编译器可以从+-
确定++x
;而在第二个例子中,它无法确定将+++
分开的位置,并且在读取第一个++
后自然期待变量;所以简而言之,编译器试图使用+x
作为变量,这是无效的。
两者都可能使用其他编译器有效。这取决于语义。