为什么x ++ - + - ++ x合法但x +++ - +++ x不合法?

时间:2013-07-11 17:33:09

标签: c# .net operators increment

我想知道为什么在C#中以下情况很好:

int y = x++-+-++x;

但是

int y = x+++-+++x;

不?为什么对+?

存在偏见

3 个答案:

答案 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作为变量,这是无效的。

两者都可能使用其他编译器有效。这取决于语义。