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

這是群友的圖


這就是 罠わな,注意了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/52972.html
標籤:C
