学习笔记|复杂嵌套的三目表达式如何分割?

举报
悦来客栈的老板 发表于 2021/09/01 23:54:26 2021/09/01
【摘要】 下面的这段代码是从某前端的混淆代码里复制下来的,略有修改: 2 == r ? o = 0 : 2 > r ? 0 == r ? o = c ? 3 : 24 : r > 0 && (o = void 0) : 3 == r ? o = 8 : r > 3 && (c = c[p]...

下面的这段代码是从某前端的混淆代码里复制下来的,略有修改:

2 == r ? o = 0 : 2 > r ? 0 == r ? o = c ? 3 : 24 : r > 0 && (o = void 0) : 3 == r ? o = 8 : r > 3 && (c = c[p],o = 16)

  

代码很简短,但是足够让人头皮发麻,不知道该如何分析。

有些朋友可能不知道什么是三目表达式,某百科解析的非常清楚:


   
  1. 三目运算符,又称条件运算符,是计算机语言(c,c++,java等)的重要组成部分。
  2. 它是唯一有3个操作数的运算符,有时又称为三元运算符。
  3. 一般来说,三目运算符的结合性是右结合的。

以及其定义:


   
  1. 对于条件表达式b ? x : y,先计算条件b,然后进行判断。
  2. 如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。
  3. 一个条件表达式绝不会既计算x,又计算y。
  4. 条件运算符是右结合的,也就是说,从右向左分组计算。
  5. 例如,a ? b : c ? d : e将按a ? b : (c ? d : e)执行。

简单的解读下就是,三元运算符是 "?:"  ,? 后面必定会跟一个   :    。

 而对于上面的混淆代码,?后面连续跟了好几个?,这就让人有点懵逼了。

其实很简单,我们把"?" 和 ":" 当成一个整体就行了。换句话说,当你遍历到一个?的时候,需要找到与之匹配的 : ,然后把 ? 和与之匹配的 : 之间的代码看成一个整体,把 : 后面的代码看成一个整体 。

那如何找到 与当前的? 匹配的 : ? 

其实很简单,有点类似于 括号匹配,在 leetcode上面的难度级别是 简单

简单的思路:

  1. 定义一个stack,用于存放  ? 和 : 的差值,个数为0时,则说明找到了匹配的 :,直接break;

  2. 如果检测到?,stack += 1;

  3. 如果检测到:,则stack -= 1;

  4. 其它字符继续检测,直到遍历结束

  5. 如果 是嵌套的三目表达式,则按上面的方法继续遍历 consequent 和 alternate 分支。

从上面的思路来看,它是一个递归算法,退出条件是当前代码段中不包含? 字符。

也许你有个疑问,如果到当前代码段中包含字符串,而该字符串恰好包含?字符,那就错乱了。

想要通用,则需要加另外的判断了,本文不做延伸,感谢阅读。

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/120030727

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。