但老師說他不會解,只會用程式跑
所以坎尼就來試解一下 ^^
I. 題目
首先來看一下題目請問上述四個列印值各為何?
前兩個應該不用講,有問題的應該是第三及第四個列印值
答案如下
II. 解法
糾竟~ 最後兩個值是怎麼運算的呢? 坎尼用中斷點及監看式一一道來print 第一行之前,z = -1
但由於此處用 ++z => 先進行 z = z + 1 運算,再進行列印
得到列印值為 0,此時 z 也為 0
print 第二行之前,z 為 0
此處用 z-- => 先列印出值,再進行 z = z - 1 運算
列印值為 0,此時 z 的值為 -1
第三行,尚未進行運算之前,z 為 -1
但 z++ + z 的計算順序呢?
(可以看到 visual studio 很貼心的把計算式排過,題目上是 z+++z )
依執行先後,可以把式子看成 (z++) + z在這邊 z++ 後面因為還有運算式,所以程式就先進行 z = z + 1 的動作 => 得到 z = 0
接著再去加後面的 z => -1 + 0 = -1
得到列印值 = -1 , z = 0
最後一行, z + z++,此時 z = 0
由於 z++ 後面沒有式子,所以先做完 0 + 0 之後直接列印,再進行 z = z + 1
得到列印值為 0,z = 1
III. 小結
這是西元 2009 年的最後一篇 blog 文,再數十分鐘就是 2010 年的到來 (in Taiwan)Tim 在半年前跑去準備研究所考試
坎尼也因工作忙碌+怠惰使得今年文章產量比顯減少了很多 ^^" (汗
接下來新的一年,坎尼會盡量加油分享心得
向其他技術 blog 看齊 ^^
參考連結:MSDN ++ operator
7 則留言:
第三個值和地四個值,你的抓圖示一致的,但是跟文字說明好像不太一致@@?
第三個和第四個值的算法,主要是差別在 z++ 的位置
第三個值因為後面有運算式在等著,所以它就先做完 ++
第四個值則因為在式子的最後,所以做完運算之後再把 z 值 ++
我想我再寫一篇用程式來說明好了 XD
我把我的疑問抓圖寄給你啦!另外建議你的 Cnosole 輸出可以註明「output:0, Z:-1」之類的,這樣比較清楚~~
還真的沒注意到,筆誤了,感謝提醒 (已修正)
本篇直接從問題上 copy 到 code 裡,所以就少了說明
下篇就清楚多了 :)
記得無解是因為有些 compiler 會先計算兩數相加,再做累加,依據每個人 compiler 不同,最後的答案可能會不同。
這題是 java program,依據官網說明
<15.7 Evaluation Order> 發現 java 似乎不受 compiler 影響,一樣是由左到右開始做演算處理(有誤解原文意思請糾正我^^):
int z=-1;
println( ++z )
println( 0 [and z=0 now] )
println( 0 )
println( z-- )
println( 0 [and z=-1 now] )
println( 0 )
println( z++ +z )
println( -1 [and z=0 now] +z )
println( -1+0 )
println( -1 )
println( z+ z++ )
println( 0+0 [and z=1 now] )
println( 0 )
----------------- 傳說中的分隔線 -------------------
當初我是這樣去解釋這題~
實際開發程式有人這麼寫的話,應該會被維護的人扭斷脖子吧.....
java 和 c# 的 compiler 執行結果一樣
現在還沒測過其他的編譯器,大概就只能先用這樣的方式去解釋
話說後面的演算法裡就有很多 ++ -- 的寫法
老師自己都教到快哭了 (台下眼神已死 XD
就上面那些意見來看,考這題目也沒太大意義啦 ... 這種東西實務上碰到的時候再去釐清就好,真正重要的是演算法的精神,而不在這些枝微末節的地方。
不過為了應付考試,還是要在腦中切割一塊記憶體來記憶一下這種討厭的題目 =.=a
張貼留言