考虑follwoing片段:就怀疑运营商
int a,b;
a = 1;
b = 2;
c = a++++b; // does not work!! Compilation error.
c = a++*+b; // works !!
请帮助我理解这种行为。
考虑follwoing片段:就怀疑运营商
int a,b;
a = 1;
b = 2;
c = a++++b; // does not work!! Compilation error.
c = a++*+b; // works !!
请帮助我理解这种行为。
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;
感谢codaddict的详细解释。无论何时,如果有人怀疑闯入运营商的分组,我会运用这个最大限度的咀嚼规则。 – Zacky112 2010-02-03 08:13:40
这是有效地,因为“maximum munch rule”中C.
c = a++++b;
被解析为c = a++ ++ b;
,这是语法错误。
c = a++*+b;
被解析为c = a++ * +b;
,这没问题。
从C99草案,部分6.4p4(重点煤矿):
如果输入流被解析为预处理标记到一个给定的字符,下一个预处理标记是字符最长序列这可能构成一个预处理令牌。
感谢Alok给予参考和解释。 – Zacky112 2010-02-03 08:12:22
operator precedence。 ++比二进制+有更高的优先级。
++的优先级等于+的优先级。所以我们使用从左到右。
为什么我们在C++为得到一个错误,一样的道理:
vector<vector<int>>;
的>>
将作为一个运营商来处理。
“不工作”无法模糊。它假定有一个表示“工作”的预期输出,以及一个表示“不工作”的实际输出,并且你也未能提供。 – 2010-02-03 08:00:45
有什么意义? – Art 2010-02-03 08:00:55