C/C++/Java中的运算符
考虑以下片段:
int a,b;
a = 1;
b = 2;
c = a++++b; // does not work!! Compilation error.
c = a++*+b; // works !!
帮助我理解这种行为
你可以在下面搜索框中键入要查询的问题!
考虑以下片段:
int a,b;
a = 1;
b = 2;
c = a++++b; // does not work!! Compilation error.
c = a++*+b; // works !!
帮助我理解这种行为
# 1 楼答案
operator precedence.++具有比二进制+更高的优先级
# 2 楼答案
同样的原因,我们在C++中得到了错误:
>>
将被视为一个运算符# 3 楼答案
这实际上是因为C中的“maximum munch rule”
解析为
c = a++ ++ b;
,这是语法错误被解析为
c = a++ * +b;
,这是正常的根据C99草案第6.4p4节(重点矿山):
# 4 楼答案
被视为:
这是不正确的,因为您试图增加非左值
及
被视为:
这种行为的原因是:C语言词法分析器是greedy
在案例1中:在标记“a”(标识符)之后,lexer看到+,后面跟着另一个+,因此它将两者(作为增量运算符)作为同一标记的一部分使用。它不会使同一令牌的第3+部分成为无效的令牌。类似地,它将接下来的两个+组合到++令牌中,使其有效地与以下相同:
这是不正确的,因为++不会返回左值,因此不能对其应用+。类似于说5++
但在案例2中:第一对++将被分组在一起(作为增量运算符)。接下来,*将是一个标记,因为您不能将它与+组合,因为*+不是有效的标记。最后,+将作为一个标记(一元+)有效地表示您的声明:
您可以通过使用括号或空格来覆盖lexer的贪婪行为,如下所示:
# 5 楼答案
++的进程等于+。所以我们使用从左到右