关于讨论代码中的 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;
.
.
.

 

相关文章:

  • 2022-01-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-11
  • 2021-07-19
  • 2021-11-23
猜你喜欢
  • 2022-12-23
  • 2021-08-05
  • 2022-12-23
  • 2021-07-03
  • 2022-12-23
  • 2022-02-08
  • 2022-12-23
相关资源
相似解决方案