一个有意思的问题
2011-12-01 15:55
197 查看
a+++++b这个表达式如何理解?应该理解成a++ ++ +b还是a++ + ++b,还是a + ++ ++b呢?应该按第一种方式理解。
编译的过程分为词法解析和语法解析两个阶段,在词法解析阶段,编译器总是从前到后找最长的合法Token。把这个表
达式从前到后解析,变量名a是一个Token,a后 面有两个以上的+号,在C语言中一个+号是合法的Token(可以是加法运算符或正号),两个+号也是合法的Token(可以是自增运算符),根据最长匹 配原则,编译器绝不会止步于一个+号,而一定会把两个+号当作一个Token。再往后解析仍然有两个以上的+号,所以又是一个++运算符。再往后解析只剩 一个+号了,是加法运算符。再往后解析是变量名b。词法解析之后进入下一阶段语法解析,a是一个表达式,表达式++还是表达式,表达式再++还是表达式,表达式再+b还是表达式,语法上没有问题。最后编译器会做一些基本的语义分析,这时就有问题了,++运算符要求操作数能做左值,a能做左值所以a++没问题,但表达式a++的值只能做右值,不能再++了,所以最终编译器会报错。
编译的过程分为词法解析和语法解析两个阶段,在词法解析阶段,编译器总是从前到后找最长的合法Token。把这个表
达式从前到后解析,变量名a是一个Token,a后 面有两个以上的+号,在C语言中一个+号是合法的Token(可以是加法运算符或正号),两个+号也是合法的Token(可以是自增运算符),根据最长匹 配原则,编译器绝不会止步于一个+号,而一定会把两个+号当作一个Token。再往后解析仍然有两个以上的+号,所以又是一个++运算符。再往后解析只剩 一个+号了,是加法运算符。再往后解析是变量名b。词法解析之后进入下一阶段语法解析,a是一个表达式,表达式++还是表达式,表达式再++还是表达式,表达式再+b还是表达式,语法上没有问题。最后编译器会做一些基本的语义分析,这时就有问题了,++运算符要求操作数能做左值,a能做左值所以a++没问题,但表达式a++的值只能做右值,不能再++了,所以最终编译器会报错。
相关文章推荐
- 遇到一个比较有意思的NIO问题!
- 多线程学习中碰到的一个很有意思的问题
- 今天碰到一个有意思的问题,用原生的js限制图片的宽度
- 一个没暂时没有办法实现的问题和一个有意思的小问题!
- 一个有意思的问题:你认为为什么C++不叫做++C?
- 一个有意思的逻辑判断问题
- 一个比较有意思的C语言问题
- 对powerbuilder版本过渡的问题思考,谁能告诉我多版本怎么协作并交互?一个有意思的命题
- 一个由sizeof引出的有意思的问题
- js的一个有意思的小题,闭包解决getElementByTagName的for循环绑定事件错误问题
- 一个有意思的小程序,考验多线程问题能力
- 一个有意思的问题
- 一个有意思的UNICODE问题:导出excel表格
- 记录面试中的一个有意思的问题
- 记录一个小有意思的改变路径的问题
- 一个有意思的汇编问题
- 今天有同学提了一个很有意思的问题, 涉及到曲线坐标, 我没做出来...
- 记录一个小有意思的改变路径的问题
- 一个有意思的Ruby Webdriver超时问题的解决过程
- 小数常量数据的一个有意思的问题