Zac*_*112 6 c c++ java operators
请考虑以下片段:
int a,b;
a = 1;
b = 2;
c = a++++b; // does not work!! Compilation error.
c = a++*+b; // works !!
Run Code Online (Sandbox Code Playgroud)
帮助我理解这种行为.
cod*_*ict 30
c = a++++b;
Run Code Online (Sandbox Code Playgroud)
被视为:
c = ((a++)++)b;
Run Code Online (Sandbox Code Playgroud)
这是不正确的,因为你试图增加非左值.
和
c = a++*+b;
Run Code Online (Sandbox Code Playgroud)
被视为:
c = (a++)*(+b);
Run Code Online (Sandbox Code Playgroud)
这种行为的原因是:C语言词法分析器是贪婪的.
在案例1中:在标记'a'(标识符)之后,词法分析器看到+,然后是另一个+,因此它将两者(作为增量运算符)作为同一标记的一部分使用.它不会使+++的第3 +部分与+++不是有效的令牌.类似地,它将接下来的两个+组合成++令牌,使其有效地与:
c = ((a++)++)b;
Run Code Online (Sandbox Code Playgroud)
这是不正确的,因为++不会返回左值,因此你不能在其上应用++.类似于说5 ++的东西;
但在case2中:第一对++将被组合在一起(作为增量运算符).接下来,*将是一个令牌,因为您无法将其与+组合,因为*+不是有效令牌.最后+会有一个令牌(作为一元+)有效地使你的陈述成为:
c = (a++)*(+b);
Run Code Online (Sandbox Code Playgroud)
您可以通过使用括号或空格来覆盖词法分析器的这种贪婪行为,如下所示:
c = a++ + +b;
c = a++ * +b;
Run Code Online (Sandbox Code Playgroud)
这实际上是因为C中的" 最大咬合规则 ".
c = a++++b;
Run Code Online (Sandbox Code Playgroud)
被解析为c = a++ ++ b;,这是语法错误.
c = a++*+b;
Run Code Online (Sandbox Code Playgroud)
被解析为c = a++ * +b;,这没关系.
从C99草案,第6.4p4节(强调我的):
如果输入流已被解析为预处理令牌直到给定字符,则下一个预处理令牌是可构成预处理令牌的最长字符序列.