原設計下面的程序輸出「2,000」,結果給出一個奇怪的數字。
#include <stdio.h> void main () { int a ; printf ("%d\n" ,a= (2 ,000 )); a=2 ,000 ; printf ("%d\n" ,a ); }
輸出結果如下。
0 2
即使錯誤,兩個表達式的結果也應該一樣啊?為何第1次輸出是「0」,第2次是「2」呢?仔細分析一下,發現數字的表示錯誤,不能用日常的計數分隔符「,」。C語言恰巧有逗號運算符,從而造成輸出怪異。
為何「a=(2,000)」不等於「a=2,000」呢?
逗號表達式的一般形式如下所示。
表達式1 ,表達式2
逗號表達式的求解過程是:先求解表達式1,再求解表達式2。整個表達式的值是表達式2的值。假設逗號表達式為
a=2*4 ,a*3
先求解a=2*4,得a的值為8,然後求解a*3,得24。整個表達式的值為24。注意:表達式的值為24,但a的值是8。不要搞混表達式的值和變量的值。以此可以推出對於表達式
a= (2 ,000 );
而言,應先求逗號表達式
2 ,000
的值,這個表達式的值是0,然後再將這個表達式的值賦給變量a,第1個輸出語句輸出的是表達式的值0。
對於表達式
a=2 ,000 ;
而言,是先把2賦給a,形成表達式
a ,000
這個表達式的值是0,而a的值是2。所以第2條語句輸出的是2。
【例3.12】分析下面程序的輸出。
#include <stdio.h> void main () { int a={1 ,3 ,5 ,7 ,9} ; int b[2][2]={{1 ,2} ,{3 ,4}} ; printf ( "%d\n" ,a[1 ,2] ); printf ("%d\n" ,b[1][1] ); printf ("%d\n" ,b[2 ,1] ); printf ("%d\n" ,b[1] ); }
【分析】按照逗號運算符,a[1,2]就是a[2],內容為5。b[1][1]表示的是行列式的第2行第2列,內容為4。b[2,1]使用逗號運算符,結果也是b[1],b[1]代表存儲第2行元素的首地址,「%d」是使用十進制輸出這個地址值,所以最後兩條語句的輸出是一樣的,即
5 4 1245028 1245028
【例3.13】下面這個程序有沒有錯誤?錯在哪裡?
#include <stdio.h> void main () { int i ,j ,sum ; i=12 ,j=15 ,sum=0 ; printf ("%d %d\n" ,i ,j ); for (i=1 ,j=1 ;i<=10 ;i++ ,j++ ) sum=sum+i+10*j ; printf ("%d %d %d\n" ,i ,j ,sum ); }
語句
int i=12 ,j=15 ,sum=0 ;
是對的,語句
i=12 ,j=15 ,sum=0 ;
的寫法也是對的,這裡逗號的作用與語句
i=12 ;j=15 ;sum=0 ;
的效果相同。同理,for語句也是標準的使用方法,程序沒有錯誤,輸出結果為
12 15 11 11 605