如何看待問“a = a + b和a += b有什麼區別”的Java面試官?

黃鑫


說實話,如果你的面試官喜歡問這種問題,你可以得到一個結論和做一個決定了!

這個結論是:這個面試官水平應該不算高!

這個決定是:這家公司不要去了吧!

中國大學編程基礎教學最大誤區之一:糾結於各種a++和++a等遊戲

我曾經大學的時候,學習C語言的時候,就是用的某著名教授的暢銷千萬冊的書籍,那時候給我的感覺就是這本書我真的是看不懂,感覺看得是迷迷糊糊的,完全不知道在講什麼,到了重點的指針什麼的也感覺都是猶抱琵琶半遮面。

那時候我的C語言老師,最喜歡搞這種a++和++a的遊戲,而且幾乎每一次上機測驗一定會有一個題目是關於這個的題。

甚至一度我都懷疑是我自己不行,因為聽不懂,感覺老師講的都是天書,而且感覺老師總是要花時間講一些奇奇怪怪知識點,這就是我那時候對於C語言這門課最大的感覺。甚至一度連我這個曾經中學時代就看過一些VB書籍,而且自認為中學時代數學、物理好到爆的學生,都開始懷疑自己,是不是我邏輯思維有問題。

關鍵是按照老師的做,居然還能考高分,更可怕的是考了高分以後都不知道自己為什麼考到的高分,是真的C語言學好了嗎?顯然不是!

後來我實在感覺已經快失去對C語言的最後一點信心了,只是覺得這樣下去不行,我只好自己去百度、去Google,然後自己找資料,現在想想應該感謝這麼課,然後我自己找到了C Primer Plus,最後找到了K&R C,讓我明白不要過分糾結於語法遊戲,對於真正學會編程到底是有多重要。

並且因為這門課讓我沒有被禁錮住,養成了我大學幾年堅持用GitHub、stack overflow、Google、以及學會使用查官方文檔的好習慣。

中國大學編程基礎教學最大誤區之二:萬年不變VC6.0

這是我學生時代經歷的又一大痛楚!

那個年代macOS不能用VC,Windows7上安裝VC6.0也是極為痛苦的,我記得第一次上機實驗的時候,我用codeblocks寫了程序然後交上去,老師又讓我用VC6.0重寫了,於是我只好跑到機房去用那個windows XP上的VC6.0又把作業重新做了一遍提交上去。

我當時就在想,為什麼我們的老師不能為了適應一下時代,就算是不用Xcode這種,用一下比較新版本的codeblocks/devc++,或者是用新一點的visual studio 2008也行啊,要知道VC6.0從1998年發佈到現在足足二十年了!

總之,我覺得編程,應該更多的關注到編程本質上來,而不是糾結於那些對於編程水平並沒有實質性提高的語法細節,多關注關注算法、數據結構我覺得價值更高!


EmacserVimer


哼哼哼,本姑娘,被Java吊打了兩年的計算機專業學生來告訴你:千萬別以為a=a+b和a+=b是一樣的!

事實上,它們有一些類型和精度上的差異。

這兩種形式的主要區別在於是否進行數據類型的自動轉換,當兩個操作數同類型時這兩種形式的運算結果是沒有差別的,當兩個操作數數據類型不同時,且左操作數即保存結果的操作數的數據精度要低,此時這兩種形式就有區別了。

上面這段話有點繞,舉個例子:

public classDemo

{

public static void main(String[] args) {

short a=4;

int b=5;

a+=b;

System.out.println(a);

}

}

看這個簡單的小程序,定義a是short型的變量,b是int型的變量,當執行a+=b時,能輸出答案為9,程序沒有問題的。

但是!!!

如果把代碼稍微變一變:

public classDemo

{

public static void main(String[] args)

{

short a=4;

int b=5;

a=a+b;

System.out.println(a);

}

}

變成a=a+b之後,就會產生錯誤:



類型不匹配。

原因是:“+=”這個運算符在Java中是一個運算符,而不是兩個,程序在執行“+=”時,會自動向高精度進行數據類型轉換。所以第一個程序在執行時編譯器沒有報錯。

而“=”呢,它要求=兩邊類型一致!我們的代碼中,因為a是short類型的變量,而b為int類型的變量,short類型+int類型結果肯定會自動轉換成int類型啦,此時就存在數據類型不一致的問題,用short類型的變量去保存int類型的變量編譯器當然會報錯了。

就好比你用裝一兩水的杯子去裝二兩水,當然是裝不下的,如果你非要用裝一兩水的杯子去裝二兩水,肯定可以硬到進去,但是肯定會灑掉一部分水。所以如果這裡非要用short類型的變量去裝int類型的數據,可以用強制轉換,確定是會丟失精度。

以下是強制轉換後的結果:

public classDemo

{

public static void main(String[] args)

{

short a=4;int b=5;

a=(short)(a+b);

System.out.println(a);

}

}

強制轉換之後,還是可以的了啦。

看到這裡,你明白這兩者的區別了嗎?

沒有明白的話,紅紅火火恍恍惚惚,問吧,還有哪裡不明白!!!


日常程序媛


你好,技術面試的話,針對java面試,我是深有體會的,因為我被別人面試過,反過來,我也面試過別人,這種面試既是對參加面試者的考驗,也有很大程度是對面試官的一個考驗,因為作為java面試官,一般他已經坐到了技術經理的位置,或則是一個公司的資深研發級別了。接下來我們從幾個方面分析下問a+=b這種問題的java面試官。

1.技術經理

java面試其實也分幾種初中高級別,作為一個公司的技術經理的話,如果是這種位置的人去面試你,問你這種a=a+b和a+=b區別的問題,一般他就是想看看你基礎紮實不,如果他問出你這樣的問題,那麼在他心裡他都會給你事先定好了一個級別了,初級,如果好一點的話,最多能給你定箇中級java開發。技術經理是有這個權利的。你不要去想面試你的人水平怎麼樣,你作為應聘者,只管回答好面試官的問題好了。

2.資深研發

面試你的人也有可能是一個公司的資深研發,他看完你的簡歷,當你介紹完你的工作經歷後,如果還問你這種a+b的問題,那麼他很有可能只是想緩解下緊張的氣氛,以這種他認為很簡單的問題去打開你們之間的交流,讓你不要那麼緊張而已,這種情況,你就放平心態,好好回答就行了,當然了,這個問題也直接關乎你們接下來他會問你什麼難度的問題,如果你答得很符合他的預期,他對你就很滿意了,接下來也不會多麼的難為你,可能會問你更加深入的問題,但是你答出個大概,加上他的提示你能繼續下去,這個面試也就八九不離十了,當然,他是沒權利給你定級別的,他會把你的面試情況反饋給上級,由上級決定你的級別。

其他情況,面試官問你這種問題,在中小型公司他也有可能只是一箇中高級開發,或則是個項目經理也是有可能出現的。只是這種情況相對較少,我們就不多做描述了。

本人閱歷有限,如各位看官有其他看法,歡迎多多指教,不勝感激。


IT講壇


a=a+b 是加法運算,需要兩次尋址。a+= b是增量運算,有寄存器優先時,只有一次尋址。賦值運算是一樣的。一般情況下可認為兩者一樣。但前者與數學算法描述更接近,相對來說更嚴謹。後者書寫快捷,但可讀性略有下降。綜合考慮,還是用a= a+ b形式更好,畢竟可讀性更好,效率差異微乎其微,在高速運算時代基本可忽略。


散居獵人


java不太清楚,c/c++裡面考慮的話a=a+b會先生成一個臨時變量a然後a=a+b,而a+=b不會產生臨時變量,直接在變量a上加b,效率會高一些。這就好比寫一個循環的時候,++i比i++效率高一樣


管理員賬號


估計提問的人,才做Java沒幾年,問有什麼區別並不是真的難為你,而是想問你基礎紮實還是不紮實,Java代碼細節很重要,要不然bug找起來起來很困難,很簡單的道理,如果做一個銀行結算功能,你不知道i++和++i的區別,就有可能把錢算錯,測試出問題需要花費大量的時間排查是數據庫數據有問題?還是算法問題?或者界面傳值有問題?結果查了一天發現是自己寫的循環有問題,這還是發現出來的,如果測試量少,沒有發現呢?

還有如果你不知道arrayList和linkedList的區別,不知道stringbuffer和stringbuilder的區別,不知道map擴容機制,然後你就會發現,你的代碼最爛,bug最多,效率最底下,項目組也會計算成本與人工花費的!代碼的細節真的很重要!

最後一句話,如果你知道可以不屑回答,但是,不知道還是安心的補充知識吧!


霧隱江南27967034


糾結這種炫技大於實用的東西有什麼意義?這不就跟茴香豆的茴字有幾種寫法一樣嗎?如何在最短的時間內寫出來符合用戶需求的系統並且把它賣出去,還得保證代碼沒有bug避免過多的售後技術支持成本,這才是企業最應該做的。


萬政通達


回答沒區別的,初級程序員。說了一堆類型轉換問題的,中級程序員。在知道類型轉換後,給出建議,代碼要求儘量用a+b的,高級程序員(因為高級程序員有可能不是寫java出身,可能真的不知道java類型轉換問題)。所以說,這個考點還是有意義的。初級程序員,對編碼熟悉,中級對語言熟悉,高級就要考慮軟件部署運維問題了。


滄海孤煙


是先後的區別,++在前的都是先幹了再說,++在後就是先說好了再幹。

在單獨計算是沒有區別的,在拿去跟一些計算運用起來,就有區別了。


瘋狂大世界


怎麼思考重要于思考什麼問題。

細節關鍵成敗;嚴謹細緻是應有的態度;全局考慮是應有的思考;時間成本是最大的成本。

面試官肯定是在項目中被如此的細節虐過的人,數值計算看似簡單,加上類型與精度,變量上的傳遞,不注意錯誤就會一層層的被包裹黑匣子。產生不必要bug,無形增加時間成本。

面試官還是個項目經理人,他了解精度問題一半是在客戶應用時才容易被發現:例如財務會計是不許有一分錢的差異的,而這樣的結果需要更多的實際數據才會出現(稅的計算是小數點後四位)。

面試官知道系統開發到客戶手中運行再運維,使用更長時間,任何一個返工都是編寫的幾十倍的時間成本。

面試官還希望你看到過程質量控制體系的重要。

面試官問什麼問題其是有原因的就看你:

怎麼思考,而不僅是思考什麼問題。

基於從上向下、橫向聯繫、實際出發來分析一下這個問題。

或許是我小題大作了!


分享到:


相關文章: