張慧的博客

          張慧的博客

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            45 Posts :: 0 Stories :: 24 Comments :: 0 Trackbacks

          文章的樓主連左值都可以運算,還若無其事得當作可以編譯,在那講解,若無其事就算了,可以當做沒有發現編譯問題,但是那講解也太誤導人了吧?然后我跟帖的樓下還出現一個“石破天”,以教導式的口吻,在那講解,不知道的人豈不是就信了嗎?真真一群害人之馬,當然我只是指其中幾位,很多跟帖的朋友,我自認還是不如的。

          就為了這個影響廣泛的害人帖子(在csdn上彈框出來,影響能不小嗎?),我也來探討一下i++,我是菜鳥,我不會用教導式口吻來講解。

          首先說文章樓主提到的

          if((i++=j++)!=4){}  

          看到這句代碼我真想噴,因為這讓我對自己產生了不自信,還去編譯了一下,果然是錯誤的,左邊怎么能夠進行運算呢?樓主真強大...為什么昨天沒有寫文章,沒有情緒激動,因

          為我知道C++風格也是這樣賦值,不知道能不能編譯過去,但是今天看到跟帖的朋友說,VC98過不去,DEV-C++也過不去,我才感到真有一種被耍的感覺。“左值能運算嗎?What  the hell!"這一句,只是罵我自己懷疑自己,沒有對其他任何人。

          假設,樓主是手誤,咱們來一個正確的能編譯的代碼討論一下:

          int i=4,j=3;   
          if((i = j++) != 4) {}  

          j++的具體動作應該是怎樣的,我想看過《Thinking in Java》的朋友都掌握得還不錯,如果實在想找更深入一點探討i++的書,個人看過《Java程序員面試寶典》,里面有提到i++這個部分,講得很仔細。j++,是一個依賴于java里面的“中間緩存變量機制”來實現的,很多人都會念++在前就是“先加后賦”,++在后就是“先賦后加”,但是這個“賦”和這個“加”是針對哪個對象呢,有幾個人能清楚的解釋?“寶典”這本書上面的解釋,個人覺得非常好,就來這里秀一段。首先,像文章中2樓所說那樣:++的時間是以整個語句為衡量的,所以,什么時候自增,跟一整句運算語句有關,現在的情況是 i = j++:這樣一句應該被拆分為:

           

          temp = j;//先賦
          j = j + 1;//后加
          i = temp;

           

          再來一個i = ++j:這一句應該被拆分為:

          j = j + 1;//先加
          temp = j;//后賦
          i = temp;

          用這樣的語句,來解釋“賦”跟“加”應該是很明了的吧?記住,“加”只涉及了本身,“賦”涉及本身和中間緩存變量。

          如何理解“++的時間是以整個語句為衡量的”?咱們來一段復雜的就可以很好地理解了,就拿那個被我噴的“石破天”的吧。

           

          /* 這個是原式,尊重版權,但是誤導人*/
          int i=10;
          i=i++ + i++;//20  --這里應該會是21,note by jacob
          i=++i + ++i;//44  --這里應該會是45,note by jacob
           

           

          首先咱們把這都拆開來理解:

          /* 細說第一個 i = i++ + i ++; */
          temp1 = i;//temp1 == 10
          i = i + 1;//i == 11;
          temp2 = i;//temp2 == 11
          i = i + 1;//i == 12;
          i = temp1 + temp2;//i == 21

          /*第二個 i = ++i + ++i;*/
          i = i + 1;
          temp1 = i;
          i = i + 1;
          temp2 = i;
          i = temp1 +temp2;


          這樣的例子,應該算是比較復雜的吧?如果需要,還可以來一個更加復雜的,不過不再詳細解釋,大家可以拿來推敲一下:

          int j =0,k = 0,h=0;
          k = k++ + k++ + k++ + ++k;//k == 7
          j = ++j + j++ + j++ + j++;//j ==7;
          h = ++h + ++h;
          posted on 2012-08-01 21:56 張慧 閱讀(2833) 評論(1)  編輯  收藏

          Feedback

          # re: 探討i++和++i 2012-08-02 12:37 Unmi
          ++ 拿出來做學術研究還是可以的,但它也是依賴于編譯器的,是怎么個理,反匯編,或是看看字節碼碼就知道的清清楚楚了。

          但要是工程中也寫出 ++,-- 隨意飛的代碼,那就要拖出去打屁股了,當然學生除外。  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 太康县| 焉耆| 桦甸市| 清丰县| 芦溪县| 德兴市| 萝北县| 阳春市| 进贤县| 紫金县| 冷水江市| 西乌珠穆沁旗| 玉门市| 霞浦县| 青冈县| 贵港市| 新田县| 会昌县| 镇坪县| 洞口县| 进贤县| 桐乡市| 忻州市| 隆昌县| 上蔡县| 油尖旺区| 石河子市| 新宾| 什邡市| 上虞市| 大连市| 惠州市| 石林| 荃湾区| 开原市| 揭西县| 正定县| 萝北县| 大庆市| 济阳县| 宜都市|