【Java】批判一个有关++的Java选择题
又是++,木有營養啊……
這是在CSDN的Blink看到的題:
這位童鞋選錯了,其實可能是他不會做選擇題,這起碼你不能選100吧,這種題必然坑題啊,再加上他給的是j++,不是++j,顯然選A啊。
你覺得答案是A?
那你就錯了,真不是……我只是講了一下作為一個選擇題你拿不準怎么去解,這答案可不對呦。
其實我是同情這位童鞋的,他是無辜的啊,畢竟答案都錯了……誰叫他/她有一個不著調的老師呢?
實踐出真實,大力出奇跡
既然覺得題不太對,那就——
測試測試測試!!!
我們先用jshell測試(預期可能是9/10/11):
答案不是99/100/101嗎?咋是0?
我寫錯了?莫得莫得,暈了,再來,可能是jshell變量處理太隨意了吧,我們再來:
還是……我%#%¥……#……2@@@#
那好,我們一句一句來:
我絕望了,上IDE吧:
一口老血噴出來,那好,我們做個對照實驗:
竟是一樣的!!也就是說這個100的來源真實是j++; 而非j = j++; ,j = j++; 真的是得到 j=0!!!
把 j++ 換成 ++j 試試:
Warning……醉了:The assignment to variable j has no effect.(翻譯過來是:變量j的賦值無效。)
問題分析+吐槽亂噴
皮完了,下面來分析一下問題。
這個問題主要是j = j++; ,這個語句太狗了,這不神經病嗎?
你++還不完,還得賦值,&&¥%#@¥@!@!#%**……
本身很簡單,一個與求值變量(j)無關的變量(i)作為for循環的counter啟動100次循環,反復執行這么個沒營養的語句然后求值。
問題是:j = j++; 這玩意到底是啥?
首先,我們要知道運算符優先級,++、–這種單目運算符是優先于=這種賦值運算符的(注意+=、-=的優先級則是低于=),所以會先執行++后賦值。
那么問題又來了,我們有些初學者對b = a++; 的理解可能是先賦值再自增,而b = ++a; 則是先自增再賦值,這就會引發困惑啊。
其實這種理解是不正確的,可能有的大學老師為了方便入門萌新理解,會這么說,其實自增是優先的,我們應該換個角度這么理解這件事(我個人的理解):
雖然是先自增,我們能不能吧++當成一個函數呢?
- b = a++; 中,a自增以后返回一個原來的a值給b。
- b = ++a; 中,a自增以后返回一個自增后的的a值給b。
這樣,問題就顯得清楚了很多:
對于j = j++; ,j++,j變成了1,但是返回的是原先的j,值為0,相當于又重新把原值0賦給了j,這樣,每一次循環下來j的結果永遠是0,導致了輸出是0。
結論
這是一個極其沒有營養的題,做錯的孩紙我同情你,不容易哇……
反正這種題我是看惡心了,沒事干誰天天寫這種垃圾語句,怕不是得被同事打死……實際開發誰有功夫研究這個東西怎么用,真是的。。。
就到這里,溜了……
總結
以上是生活随笔為你收集整理的【Java】批判一个有关++的Java选择题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OJ】洛谷试炼场の新手村整合(Java
- 下一篇: 管理软件实施(2)——开发包括哪些成本