• a+++b 在编译基础上的讨论


    关于讨论代码中的 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;
    .
    .
    .
  • 相关阅读:
    pandas中expand的作用
    pandas中DataFrame的stack()、unstack()和pivot()方法的对比
    Django在windows下用Apache 部署
    pandas分组统计
    DataFrame中的空值处理
    Django signals 监控模型对象字段值的变化
    django+uwsgi+daphne+supervisor生产环境部署
    Django-Channels使用和部署
    Django使用Channels实现WebSocket的方法
    python 操作es
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/1782105.html
Copyright © 2020-2023  润新知