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

前端之家收集整理的这篇文章主要介绍了C/C++/Java中的运算符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
请考虑以下片段:
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;

这是不正确的,因为不会返回左值,因此您无法对其应用.类似于说5;

但在case2中:第一对将被组合在一起(作为增量运算符).接下来,*将是一个令牌,因为您无法将其与as *组合,因为它不是有效令牌.最后,一个令牌(作为一元)有效地使你的陈述成为:

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

您可以通过使用括号或空格来覆盖词法分析器的这种贪婪行为,如下所示:

c = a++ + +b;  
c = a++ * +b;
原文链接:https://www.f2er.com/c/117569.html

猜你在找的C&C++相关文章