if(a==1且a==2且a==3)如果等於true,你覺得奇怪嗎?

前言

最近無意間看到一個有趣的帖子:

<code>var a = ???;
if(a == 1 && a == 12){
console.log(a);
}/<code>

這是一個JS社區拋出來的問題。第一眼看到這個問題的時候,感覺這似乎是一個無稽之談,一個變量怎麼可能會同時滿足倆個條件呢!

不過後來深入思考一下,發現這類問題有點意思...

如果你也覺得不可能的話,一起隨著文章看下去。你也會覺得有點意思~

下文不僅僅涉及的是JS,還有Java等等其他語言~

正文

接下來咱們來嘗試解決這個問題。假設 if(a==1&&a==12)是等於 true的,那麼a肯定不可能是一個“普通的變量”。它勢必要有能力在執行的時候能夠動態改動值。

一、JS版本

如果出於這種出發點,我們是不是能夠假設:如果能夠重新類似a方法的執行方法似乎就能夠做到這種結果。

接下來這裡貼一種答案:


if(a==1且a==2且a==3)如果等於true,你覺得奇怪嗎?

看到這個答案,我猜搞Java或其他面嚮對象語言的同學有些“懵逼”。不過如果仔細看,仔細想其實也是可能從中看出一些解題思路的。

當然可能有JS的小夥伴想要求解答,這裡碰巧寫過解析,這裡就貼出他的文章地址

看了JS的答案,我一直順著這個解題思路再想:Java中有沒有可能完成這個等式?只能說自己“功力太淺”始終沒有找到合適的解決方式...因此自己就Google了一下,發現果然有“閒的蛋疼”的人提供了答案,甚至還提供了多種版本:

二、Java版本

這裡就直接貼答案了,雖然不能說非常的貼近於題目,但也著實展示了其中的巧妙:

<code>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");
}/<code>

另一個答案,說實話比較“牛逼”了:

這裡用到了PowerMockRunner,也算是咱們解題思路的上最直接的幫手...


if(a==1且a==2且a==3)如果等於true,你覺得奇怪嗎?


尾聲

寫這篇文章其實並不是為了去深挖這些語言特性,只是單純的覺得很有意思。

如果從這個題目本身出發,它既可以考察解題者的語言特性掌握程度;也可以考察出解題者對待問題,嘗試解決問題的方法論。學習這條路上,任重而道遠...


分享到:


相關文章: