2009年12月31日

[C#] 算術運算子的先後順序

今天坎尼看到一題很詭異的題目
但老師說他不會解,只會用程式跑
所以坎尼就來試解一下 ^^

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 則留言:

Unknown 提到...

第三個值和地四個值,你的抓圖示一致的,但是跟文字說明好像不太一致@@?

坎尼 提到...

第三個和第四個值的算法,主要是差別在 z++ 的位置
第三個值因為後面有運算式在等著,所以它就先做完 ++
第四個值則因為在式子的最後,所以做完運算之後再把 z 值 ++

我想我再寫一篇用程式來說明好了 XD

Unknown 提到...

我把我的疑問抓圖寄給你啦!另外建議你的 Cnosole 輸出可以註明「output:0, Z:-1」之類的,這樣比較清楚~~

坎尼 提到...

還真的沒注意到,筆誤了,感謝提醒 (已修正)
本篇直接從問題上 copy 到 code 裡,所以就少了說明
下篇就清楚多了 :)

Ruby 提到...

記得無解是因為有些 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

Unknown 提到...

就上面那些意見來看,考這題目也沒太大意義啦 ... 這種東西實務上碰到的時候再去釐清就好,真正重要的是演算法的精神,而不在這些枝微末節的地方。

不過為了應付考試,還是要在腦中切割一塊記憶體來記憶一下這種討厭的題目 =.=a

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D