int main ()
{
int a = 5,b = 2;
printf("%d",a+++++b);
return 0;
}
此代码给出以下错误:
错误:需要左值作为增量操作数
但如果我在整个过程中添加空格a++ +
and ++b
,然后就可以正常工作了。
int main ()
{
int a = 5,b = 2;
printf("%d",a++ + ++b);
return 0;
}
第一个示例中的错误意味着什么?
编译器是分阶段编写的。第一阶段称为词法分析器,它将字符转换为符号结构。所以“++”变成了类似enum SYMBOL_PLUSPLUS
。随后,解析器阶段将其转变为抽象语法树,但它无法更改符号。您可以通过插入空格(结束符号,除非它们在引号中)来影响词法分析器。
普通的词法分析器是贪婪的(有一些例外),所以你的代码被解释为
a++ ++ +b
解析器的输入是符号流,因此您的代码将类似于:
[ SYMBOL_NAME(name = "a"),
SYMBOL_PLUS_PLUS,
SYMBOL_PLUS_PLUS,
SYMBOL_PLUS,
SYMBOL_NAME(name = "b")
]
解析器认为这在语法上是不正确的。 (根据评论进行编辑:语义上不正确,因为您不能将 ++ 应用于右值,而 a++ 会导致右值)
a+++b
is
a++ +b
这没关系。你的其他例子也是如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)