关于二维数组赋值的一个陷阱:
int a[3][2]={(0,1),(2,3),(4,5)};
int *p;
p=a[0];
printf("%d\n",p[0])
程序的输出结果:
1
程序示例如下:
int a[3][2]={{0,1},{2,3),{4,5));
int *p;
p=a[0];
printf("%d\n",p[0]);
程序的输出结果:
0
上述两段代码很类似,为什么输出却有这么大的不同?两者的区别在于二维数组的初始化问题,第一种情况由于是逗号表达式,所以数组的元素等价于{{1,3},{5,0),{0,0}},与第二种情况不一样。
C语言提供一种特殊的运算符——逗号运算符,优先级别最低,它将两式连接起来。例如,(3+4,2+8)称为逗号表达式,其求解过程是先求表达式1的运算结果,然后求解表达式2的结果,而整个表达式的值为表达式2的值,如(3+4,2+8)的值是10。(a=3*5,a*4)的值为60。
在使用逗号表达式时,首先需要弄清楚其表示形式,其表示形式如下:
表达式1,表达式2,表达式3……表达式n
使用逗号表达式,需要注意以下3个方面的事项:
1)逗号表达式的运算过程为从左往右逐个计算表达式。
2)逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。
3)逗号运算符的优先级别在所有运算符中最低。
例如,语句i=1,2;虽然是逗号表达式,但是赋值符的优先级更高,所以i的值为1,接着执行常量2的运算,运算结果会被丢弃。在编译器中,虽然这种语句的写法是合法的,但是是不提倡。再例如,语句(a=3*5,a*4)和语句b=(a=3*5,a*4)意义不一样,第一个语句中a的值为15,第二个语句a的值为15,但b的值为60。
引申:int i=(j=4,k=8,1=16,m=32),则i的值是多少?
输出结果为32。当一个语句是由多个被逗号运算符隔开的表达式组成时,此语句的值为最后一个表达式的值。
首先看一个例子,int i=(j=4),它等价于i=j=4语句,即int j=4与int i=i。而inti=(j=4,1(=8,l=16,m=32)则等价于:int j=4,k=8,l=16,m=32,i=m=32,所以输出为32。例如,int a=3,则执行a+=a-a+=a*a运算后,a的值变为0,因为这个连续运算语句可以转换为以下3个语句:首先计算a+=a*a,把a的值3带入,a+=3+3*3,则a的值变为12,然后计算a-=a,此时a的值变为0,最后执行a+=a操作,a的值最终变为0。