前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >if(a==1&&a==2&&a==3),有没有可能为true?

if(a==1&&a==2&&a==3),有没有可能为true?

作者头像
业余草
发布2021-12-06 17:14:58
3630
发布2021-12-06 17:14:58
举报
文章被收录于专栏:业余草

最近无意间看到一个有趣的帖子:

代码语言:javascript
复制
var a = ???;
if(a == 1 && a == 12){    
    console.log(a);
}

这是一个 JS 社区抛出来的问题。第一眼看到这个问题的时候,感觉这似乎是一个无稽之谈,一个变量怎么可能会同时满足俩个条件呢!

不过后来深入思考一下,发现这类问题有点意思...

❝ 如果你也觉得不可能的话,一起随着文章看下去。你也会觉得有点意思~ ❞

下文不仅仅涉及的是 JS,还有 Java 等等其他语言~

正文

接下来咱们来尝试解决这个问题。假设 if(a==1&&a==12)是等于 true 的,那么 a 肯定不可能是一个“普通的变量”。它势必要有能力在执行的时候能够动态改动值。

JS 版本

如果出于这种出发点,我们是不是能够假设:如果能够重新类似 a 方法的执行方法似乎就能够做到这种结果。

接下来这里贴一种答案:

看到这个答案,我猜搞 Java 或其他面向对象语言的同学有些“懵逼”。不过如果仔细看,仔细想其实也是可能从中看出一些解题思路的

❝ 当然可能有 JS 的小伙伴想要求解答,这里碰巧写过解析,这里就贴出他的文章地址 ❞

看了 JS 的答案,我一直顺着这个解题思路再想:Java 中有没有可能完成这个等式?只能说自己“功力太浅”始终没有找到合适的解决方式...因此自己就 Google 了一下,发现果然有“闲的蛋疼”的人提供了答案,甚至还提供了多种版本:

Java 版本

这里就直接贴答案了,虽然不能说非常的贴近于题目,但也着实展示了其中的巧妙:

代码语言:javascript
复制
Class cache = Integer.class.getDeclaredClasses()[0];
Field c = cache.getDeclaredField("cache");
c.setAccessible(true);
Integer[] array = (Integer[]) c.get(cache);
// array[129] is 1
array[130] = array[129]; 
// Set 2 to be 1 
array[131] = array[129]; 
// Set 3 to be 1 
Integer a = 1;
if(a == (Integer)1 && a == (Integer)2 && a == (Integer)3){
    System.out.println("Success");
}

说白了,其实就是利用了 Integer 中的 Cache 数据,让 Cache 数组中对应的元素设置成需要比较的内容就会让 if 条件 为 true。Integer cache 在 Integer 类里面是静态代码段中初始化的,为了自动装箱使用。通过反射机制强行把 cache 数组中的内容改变。

另一个答案,说实话比较“牛逼”了:

❝ 这里用到了 PowerMockRunner,也算是咱们解题思路的上最直接的帮手... ❞

尾声

写这篇文章其实并不是为了去深挖这些语言特性,只是单纯的觉得很有意思。

如果从这个题目本身出发,它既可以考察解题者的语言特性掌握程度;也可以考察出解题者对待问题,尝试解决问题的方法论。学习这条路上,任重而道远。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正文
  • JS 版本
  • Java 版本
  • 尾声
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档