a+++b 在编译基础上的讨论
2015-09-24 14:04
169 查看
关于讨论代码中的 c = a+++b 这个表达式的面试题一直都在出现。从很直观的角度上来说你可以理解成为以下的两种形式
一个是 c = (a++) + b; 另一种是c = a + (++b);
其实做过编译程序的人可以考虑以下过程,在词法分析阶段要进行的是将输入的文件切成token,并形成token序列,你可以知道
对+进行处理的时候将执行以下的代码,当编译程序读到+的时候,首先期望得到的是 = ,如果是,那么好, 是+=如果不适,那么期望得到的是 + ,如果是,那么得到的是 ++; 以上都不是 则后退返回。可见当编译程序遇到上面的表达式的时候,设当前读入字符是第一个+,那么编译程序期望得到的是=或者+,显然可以得到+,那么构成++,存入token,继续进行。所以上述表达式理解成为 c = (a++) + b;是正确的。
一个是 c = (a++) + b; 另一种是c = a + (++b);
其实做过编译程序的人可以考虑以下过程,在词法分析阶段要进行的是将输入的文件切成token,并形成token序列,你可以知道
对+进行处理的时候将执行以下的代码,当编译程序读到+的时候,首先期望得到的是 = ,如果是,那么好, 是+=如果不适,那么期望得到的是 + ,如果是,那么得到的是 ++; 以上都不是 则后退返回。可见当编译程序遇到上面的表达式的时候,设当前读入字符是第一个+,那么编译程序期望得到的是=或者+,显然可以得到+,那么构成++,存入token,继续进行。所以上述表达式理解成为 c = (a++) + b;是正确的。
. . . case '+'://如果加号后面是 = 那么处理成为 += if( CTokenizer::NextToken() == '=' ) { m_token.str = "+="; m_token.type = PLUS_ASSIGN; } else { CTokenizer::PushBack(); //如果加号后面是 + 那么处理成为 ++ if( CTokenizer::NextToken() == '+' ) { m_token.str = "++"; m_token.type = PLUS_PLUS; } else CTokenizer::PushBack(); } break; . . .
相关文章推荐
- 往linux上部署项目
- setRequestedOrientation设置屏幕方向
- JS原型与原型链终极详解(转)
- Diesel-engined is recognised as amongst the largest sized keep an eye on makes using this society
- 谷歌/微软/必应web页面免费翻译插件
- 企业发布流程
- 在Struts2访问 HttpServletRequest、HttpSession、ServletContext三个域对象
- MediaPlayer error类型汇总
- 进制转换TestCode
- STM32 keil5编译优化
- rsyncd.conf
- 递归反转字符串
- 启动PLSQL时提示NLS_LANG在客户端不能确定的解决办法
- 微信开发的资料
- ExtJS学习--窗口,windows组件
- unity_NGUI动态字体制作与字体清晰的几点要素
- 【转】C#结构体和类
- 如何引入android-support-v4/Fragment
- 快速批量把jpg转换成pdf的方法
- insert into from和select from into的区别