C/C++/Java中的运算符

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)


Alo*_*hal 7

这实际上是因为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节(强调我的):

如果输入流已被解析为预处理令牌直到给定字符,则下一个预处理令牌是可构成预处理令牌最长字符序列.