2010-02-03 63 views
6

考虑follwoing片段:就怀疑运营商

int a,b; 
a = 1; 
b = 2; 

c = a++++b; // does not work!! Compilation error. 
c = a++*+b; // works !! 

请帮助我理解这种行为。

+4

“不工作”无法模糊。它假定有一个表示“工作”的预期输出,以及一个表示“不工作”的实际输出,并且你也未能提供。 – 2010-02-03 08:00:45

+6

有什么意义? – Art 2010-02-03 08:00:55

回答

30
c = a++++b; 

被视为:

c = ((a++)++)b; 

,你正试图增加非左值这是不正确。

c = a++*+b; 

被视为:

c = (a++)*(+b); 

针对此行为的原因是:在C语言词法分析器是greedy。在案例1中:词法分析器'a'(标识符)之后,词法分析器看到+,后跟另一个+,因此它将两个(作为增量运算符)作为同一个标记的一部分使用。它不会使+++不是有效的标记,所以它不会成为同一标记的第3 +部分。类似地集团在未来两到+令牌++使其有效地一样:

c = ((a++)++)b; 

为++不会返回一个左值这是不正确的,因此你不能将其应用A ++。类似于说5 ++的东西;

但在情况2中:第一对++将组合在一起(作为增量运算符)。接下来,*本身就是一个令牌,因为你无法将它与+结合起来,因为* +不是有效的令牌。最后,+将令牌(作为一元+),有效地使你的语句:

c = (a++)*(+b); 

您可以通过使用括号或空格的如下重写词法分析器的这种贪婪行为:

c = a++ + +b; 
c = a++ * +b; 
+1

感谢codaddict的详细解释。无论何时,如果有人怀疑闯入运营商的分组,我会运用这个最大限度的咀嚼规则。 – Zacky112 2010-02-03 08:13:40

7

这是有效地,因为“maximum munch rule”中C.

c = a++++b; 

被解析为c = a++ ++ b;,这是语法错误。

c = a++*+b; 

被解析为c = a++ * +b;,这没问题。

从C99草案,部分6.4p4(重点煤矿):

如果输入流被解析为预处理标记到一个给定的字符,下一个预处理标记是字符最长序列这可能构成一个预处理令牌

+0

感谢Alok给予参考和解释。 – Zacky112 2010-02-03 08:12:22

0

operator precedence。 ++比二进制+有更高的优先级。

+2

我不明白它可能是运营商的优先级。 – 2010-02-03 08:08:08

+0

c = a ++ ++ b;是好的,但如果你删除空白,那么事实证明是一个无效的左值错误。 – bhups 2010-02-03 08:43:18

+0

我想我误解了这个问题。感谢您的解释。 – bhups 2010-02-03 12:01:59

0

++的优先级等于+的优先级。所以我们使用从左到右。

1

为什么我们在C++为得到一个错误,一样的道理:

vector<vector<int>>; 

>>将作为一个运营商来处理。