请考虑以下片段:
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;