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;
.
.
.
【推荐】AI 的力量,开发者的翅膀:欢迎使用 AI 原生开发工具 TRAE
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C#性能优化:为何 x * Math.Sqrt(x) 远胜 Math.Pow(x, 1.5)
· 本可避免的P1事故:Nginx变更导致网关请求均响应400
· 还在手写JSON调教大模型?.NET 9有新玩法
· 复杂业务系统线上问题排查过程
· 通过抓包,深入揭秘MCP协议底层通信
· AI 的力量,开发者的翅膀:欢迎使用字节旗下的 AI 原生开发工具 TRAE
· 「闲聊文」准大三的我,思前想后还是不搞java了
· C#性能优化:为何 x * Math.Sqrt(x) 远胜 Math.Pow(x, 1.5)
· 千万级的大表如何新增字段?
· 《HelloGitHub》第 112 期