例題
逗號表達式本身不難,常常與 賦值運算符一起考,考查學生對這兩個知識點的理解和考生觀察是否細心。如下題:
題目:以下程式的輸出結果是:
main () { int x,y,z; x=y=1; z=x++,y++,++y; printf("%d,%d,%d\n",x,y,z); } |
[A]2,3,3 [B]2,3,2 [C]2,3,1 [D]1,1,1
解析:
x和y的值經過自增以後分別為2和3,D可以排除。剩下3個選項選擇什麼呢?
如果是(x++,y++,++y)實際上可以看成(1,1,3)整個逗號表達式的值應該是3,那么選A。
如果是(x++,++y,y++)實際上可以看成(1,2,2)整個逗號表達式的值應該是2,那么選B。
但這是錯的,這兒還有 賦值運算符。 賦值運算符的優先權是14,而逗號表達式的優先權是15,也就是說上面的表達式中應該等價於這樣的結合:(z=x++),y++,++y;如果這樣寫的話,則答案很清晰,為:2,3,1
正確答案選C。
PS:據我統計,這種類型的題目錯誤率超過70%.
與逗號表達式有關的題
例題1:(a = 3,b = 5,b+ = a,c = b* 5),求逗號表達式的值?
答案:40。前兩個表達式只是賦值,從第三個開始計算,b+=a,即b=b+a,即b=5+3,b=8,求最後一個表達式,c=b*5=8*5=40.因為逗號表達式的值是最後一個表達式的值,所以整個逗號表達式的值為40,其他各變數最後的值依次為:a=3,b=8,c=40
例題2:若已定義x和y為double類型,則表達式:x=1,y=x+3/2的值是
A) 1 B) 2C) 2.0D) 2.5
分析:該表達式是一個逗號表達式,所以先運算x=1,結果變數x中的值為1.0,然後運算y=x+3/2,其結果是變數y中的值為2.0(這個運算過程可參閱本專題的“整數除法的注意事項”——整數相除,捨入法取整數部分),注意此時表達式y=x+3/2的值即等於變數y的值為2.0。最後,整個逗號表達式的值應該等於最後一個表達式的值2.0,所以,正確答案是C)。
註:該題曾在1998年4月和2000年9月的二級C考試中兩次出現過。
例題3:若t為double類型,表達式t=1,t+5,t++的值是
A) 1B) 6.0C) 2.0D) 1.0
分析:該題的表達式也是一逗號表達式,運算過程同例題1。需要注意的是,其中的第二個表達式(t+5)對整個表達式的運算結果不產生任何影響,因為它沒有改變變數t的值(t的值仍為1.0),最後一個表達式(t++)的值為變數t進行自增運算前的值1.0,所以整個表達式的值為1.0。
例如運行以下程式:
int a,b;
b=( a=1,a+1,a++);
printf("%d,%d\n",a,b);
輸出列印:
2,1
註:這是1998年4月二級C考試中的一道選擇題。
例題4:有如下函式調用語句
func(rec1,rec2+rec3,(rec4,rec5));
該函式調用語句中,含有的實參個數是
A)3 B)4C)5D)有語法錯誤
分析:C語言規定,函式調用時實參與實參之間是用逗號隔開的,所以,本題的函式調用語句中包含3個實參,其中第一個實參是rec1,第二個實參是rec2+rec3,第三個實參是(rec4,rec5),這裡的第三個實參就是一個逗號表達式,根據逗號表達式的運算規則,第三個實參的值應該等於rec5的值。
註:這是2000年9月二級C考試中的一道選擇題。
例題5:有如下函式調用語句
fun(a+b,(x,y),fun(n+k,d,(a,b)));
在此函式調用語句中實參的個數是
A)3 B)4C)5D)6
正確答案應該是A)。
註:這是1997年9月二級C考試中的一道選擇題。