去年曾經一道c++的題目在網上引發衆多碼農的熱議,題目就是兩個函數,在第一個函數中定義了變量a與b的值,而且調用了第二個函數,而第二個函數是一個空函數,有兩個參數a與b, 第一個函數末尾打印出了a與b的值,要求同個實現第二個方法,達到打印出來a,b的值是交換後的效果。java
打開百度App,看更多圖片python
針對這樣一個題目,有好多c++的碼農們爭相討論,當時有部分人耍了一點小聰明,實現思路是在第二個函數中直接將a,b的直交換而後打印出來,並退出整個程序,讓第一個函數中的打印再也不繼續執行,雖然這樣的作法不是出題人預想的套路,可是確實也達到了要求的結果,只有少人碼農網友給出了正確答案,那就是經過內存尋址的方式直接調整a與b的值,想必這個思路纔是出題人想要的那種吧。c++
很巧的是,這個題目今年又有人出了一個java版的,既然兩種語言不同,固然實現思路也是不同了,咱們把這個java版的題目貼出來,看看碼農們都是怎麼回答的吧,讓咱們一塊兒看看他們的思路是什麼吧。程序員
網友一:這個題目寫a=a+b,b=a-b,a=a-b基本能夠斷定java還沒入門了。算法
上世是朵花:固然,這種狀況下是值傳遞,徹底達不到意想的效果。函數
網友二:就是爲了交換值類型把值類型封裝成引用類型,再把引用類型指向的內存地址的值交換的無聊操做設計
上世是朵花:雖然思路是這樣,可是java與c的實現方式差異很大。對象
網友三:python的變量也是引用類型啊,a,b=b,a就完事了圖片
上世是朵花:沒錯,若是是python的話,解決這個問題就顯得更爲直接了。內存
網友四:考java語法有啥意義,還不如考算法。
上世是朵花:這樣的題目只能是拿出來交流用,在實際工程中壓根碰不上這樣的場景,若是出現這樣的場景,只能說程序者的設計思路太奇葩了
網友五:可能有些人不會Java,只是按照本身熟悉的語言理解,你只站在本身視角來看未免太狹隘
上世是朵花:沒錯,從上面的回答就能看出有的網友是其餘語言的思路。
網友六:光從題目看,+-^多種作法,學的時候或者培訓的都講過,不管是c仍是Java,考新人見過,寫反射的那個從題目上沒毛病,體現多會一點
上世是朵花:這個題目有網友用反射的思路實現了,請看上面的那個圖。
網友七:異或就能夠
上世是朵花:是不能夠的,若是在第二個方法中去實現的話,傳值的方式,在第二個方法任憑你怎麼修改就是沒法改變的哦。
網友八:涉及到引用,值傳遞,IntegerCache還有反射這些知識點。並非用異或或加減操做一下就能夠的。仍是要動手,要認識到你是苦逼的javaer,並非c。
上世是朵花:沒錯,這名網友的觀點是正確的,針對一樣的題目,java天然有java的思路。
可見這個題目,回答正確的人並非不少啊,大多數人都知道a=a+b,b=a-b,a=a-b 這樣的方式是不能夠的,但是有部分人卻誤認爲a=a^b;b=a^b;a=a^b;這種方式是能夠的,其實否則,若是是放在第一個方法中去實現,這兩種方式顯然是均可以的,可是在第二個方法中去實現就徹底是另外一種思路,首先經過簡單的值傳遞,不論你怎麼努力,倒是絲絕不會改變a與b的值的,c++中的思路是經過直接修改內存的方式來修改a與b的值,而java呢,固然java中全部對象都算是一個引用,可是這裏交換對象的自己,針對這樣的場景,java自有java的思路,提到反射來講,其餘語言的程序員可能以爲過於複雜了點,不過,話又說回來,這樣的題目也只能在平時交流時提提而已,實際的項目工程中絕對不會出現這種場景的,若是要是出現了,只能說設計程序人思路很奇葩,這是本身在給本身找困難,針對這樣的問題,不一樣語言有不一樣的語言的解決辦法,只不過有的語言相對輕鬆,而有的語言就須要費一番周折了。
以上全部圖片均來之互聯網
你們好,我是「上世是朵花」。若是你有什麼好的見解或者觀點能夠在評論區展示你的才華,互動交流,若是想進一步瞭解我,那就關注我吧!