讀古今文學網 > C語言解惑 > 3.6 不要用錯逗號運算符 >

3.6 不要用錯逗號運算符

原設計下面的程序輸出「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