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
  

《C语言解惑》