逗号表达式

这段程序的运行结果是什么?0么?请看下面的截图
 
没错,不是0,是1!
你可能会怀疑:为什么是1不是0?暂且我们不谈这个。
p=a[0]=&a[0][0]这个想必大家都知道,于是p[0]也就代表着*(p+0)也就是*(&a[0][0]),由*与&互为逆运算可知p[0]就是a[0][0]。
那么问题来了!a[0][0]是什么?
很多人可能会以为a[0][0]是0,实则不然。在下图这种情况下
 a[0][0]的确是0,细心观察可以发现两端代码之间的微小差异,没错,就是()与{ }的差别。
我们在初始化二维数组的时候 ,对同一行的元素都用{ }进行聚合,{ }的作用是划分区域,每个{ }内为一行的元素,此外  { }并不是运算符。而()为优先级一级的运算符,但并不能在初始化二维数组的时候划分每行元素。That is to say...int a[3][2]={(0),(1),(2)};和.int a[3][2]={0,1,2};是完全等价的......
但是...那个逗号是怎么回事呢!?
说到这里,就不得不提到一个很容易被我们忽视的运算符“,”了。它叫做逗号运算符,又名顺序求值运算符,在所有的运算符中优先级是最低的(第15级)。由逗号运算符构成的表达式也叫逗号表达式(顺序表达式),形式为
表达式1,表达式2,……,表达式 n
在使用的时候,按顺序依次求出表达式1,2,3,......,n的值并取表达式n的值作为整个逗号表达式的值。

看完了这里想必大家也就明白了为何习题4的结果是1不是0了吧,实际上
也可以写为int a[3][2]={1,3,5};
仅仅对a[0][0],a[0][1],a[1][0]分别赋值了1,3,5,其余元素值为0。所以输出a[0][0]的值当然就是1咯~

另附一道思考题:

main()
{
int x,y,z;
x=y=1;
z=x++,y++,++y;
printf("%d,%d,%d ",x,y,z);



上述程序的输出结果是:

正确答案应该是2,3,1

原文地址:https://www.cnblogs.com/mxy2014/p/4146435.html