c = a+++b

 

c = a+++b;//合法,等价于 c = a++ + b;

c = a+++++b;//不合法,会被当作c = a ++ ++ + b;对于a+++++b这一段代码,编译系统从左至右扫描整条语句,先遇到a++,判断出来是一个a的后缀自加运算;然后接着扫描,遇到一个+,+是一个二目运算符,它的左边已经有一个运算数a++了,系统就向右搜索第二个运算数;又遇到一个+,++比+的运算级别要高,这时,编译系统就将两个+看成一个整体来处理;既然是++,编译系统就认定,肯定它的左边或右边有一个变量,编译系统先搜索左边,发现++,不是变量;再搜索右边,发现+b,+b是什么东西?编译系统是无法搞明白的;因此它就认为++是一个缺少左值的自增运算符,于是提示错误给用户:lvalue required as

原理解析一下

C语言在这里遵循词法解析的贪婪匹配原则。优先匹配尽可能多字符的符号,无论是否有语法错误(因为词法分析时还没有语法检查)。

总结:a存在左值,可以有表达式:a++。但是(a++)不存在左值,无法继续执行(a++)++操作,所以最终报错。

原文:C语言中“c = a+++b”,这种结构合理吗? - 知乎 (zhihu.com)

posted @ 2023-10-31 14:35  败人两字非傲即惰  阅读(104)  评论(0编辑  收藏  举报