C語言中,a=b=c,a=b==c,a==(b=c),a==(b==c)有什麼區別 main(){inta=1,b=2,c=3;printf("%d,%d,%d,%d\n",a=b=c,a=b==c,a==(b=c),a==(b==c));}... 百度知道: 首先謝謝樓主,這個問題真好!我剛纔的回 ...
C語言中,a=b=c,a=b==c,a==(b=c),a==(b==c)有什麼區別
main(){inta=1,b=2,c=3;printf("%d,%d,%d,%d\n",a=b=c,a=b==c,a==(b=c),a==(b==c));}...
百度知道:
首先謝謝樓主,這個問題真好!我剛纔的回答錯了,現在刪了重答,不過執行的結果還是3,1,0,0 這個我實際操作過了。首先=和==的意思樓上各位已經說的很清楚了,一個是賦值,一個是判斷,==的優先順序高於=,==兩邊的值若相等,則判斷為真,整個表達式的值為1,否則為0。這是前提,下麵來看這個問題。剛纔我的錯誤在誤以為printf函數是自左向右執行,就像我們的書寫習慣一樣,不過實際不是。由於printf執行參數輸出時是壓棧操作(為了支持不定個數的參數的輸出,故從後向前執行),所以會先對最後一個進行操作,也就是從右向左輸出(臉紅,老師貌似也講過,不過。。。悔不該當初啊)。所以整個printf執行步驟如下:第一步是最後一個a==(b==c),b是2,c是3,明顯不等,所以b==c的值是0,然後a是1,和0又不等,所以整個式子值為0;第二步為倒數第二個,a==(b=c),先將c賦給b,此時b和c都為3,再判斷a與b是否相等,a為1,不等,整個式子為0;第三步:a=b==c,經過上一步,此時b和c都為3,所以判斷b==c為真,值為1,然後將1賦給a,輸出a,就是1;第四步:a=b=c,自右向左,先將c值賦給b,再將b值賦給a,輸出a,即為3,結果3,1,0,0。這個題目告訴我們上課一定要認真聽講(再次臉紅)。累死我了。
這是錯誤的,但也八九不離十了。
這是群友發出的問題,首先我也以為是3 1 0 0
首先在程式run time,調用printf函數時,會從右到左把參數壓棧,這個只要學過一些彙編就瞭解了。
所以是a==(b==c)首先執行,這個和答案。
但是最後的3,3,0,0是因為函數還沒有完全執行完,在現場恢復前,才會將a輸出,而最後的a=b=c最終賦值a=3,然後在輸出a=b=c,a=b==c(輸出的是a的值)
因此是3 3 0 0
這是群友的圖
這就是 罠わな,註意了