关于逗号运算符和++的优先级
z=(y++,++y);
这里我的理解是自增自减的优先级要高于逗号运算符,所以应该是先执行++y得到z的值为2,但是结果确是3,当前置自加和后置自己一起的时候不是说要先执行前置加得到变量的值参与后置自加的运算吗?
像这个表达式一样,
y=1;
z=(y++)+(++y);先执行++y,得到y的值为2,然后z的结果为2+2=4.
另外,就是这个逗号运算符的和++的优先级谁能帮忙举个例子,谢谢 展开
你的这2个问题不仅牵扯到了操作符的优先级还牵涉到了顺序点的问题,你可以了解下顺序点的概念:顺序点的意思是在一系列步骤中的一个“结算”的点,语言要求这一时刻的宽脊洞求值和副作用全部完成,才能进入下面的部分。
从你的例子来说,第一个问题中','的优先级是最低的,它的执行顺序是从左到右,因此y++和++y是优先执行然后再从左至右进行的。
但你可能会认为y++是在整个语句执行完毕后才进行自增1的,这一点来说是不对的。因为','是一个顺序点,也就是所谓的结算点,在这点之前的操作都要完成,所以此时y++已经增加1,这样y在整个表达式结束前已经增加了2次,所以结果是3,没有问题。
至于第二个例子,我觉得你这样的写法不够野纤规范。顺序点的另一个规则:在两个顺序点之间,子表达式求值和副作用的顺序是不同步的。如果代码的结果与求值和副作用发生顺序相关,称这样的代码有不确定的行为(unspecified behavior).而且,假如期间对一个内建类型执行一次以上的写操作,则是未定义行为.
简单来说就是2个顺序点内,同优先级的操作执行顺序是未知的,依赖于编译器的实现。具体哪一个操作谁先发生谁后发生,谁也不知道,在编程中必须要注意并加以回避。
我举个例子,int i=0;int m=(++i)+(++i)+(++i)+(++i);printf("%d %d\n",m,i);
在gcc编译器中运行得到的结果是 11 4
而在Visual Studio 2008中运行得到的结果是 16 4
从这个例子就可以看出,不同的编译器,对于一个表达式内慎枯(2个顺序点之间)的执行顺序是不一样的。对于这种依赖编译器的情况是必须避免的,是相当不规范的编程。
我觉得你的第二例子有点过于依赖编译器了,换一个编译器就可能是其他的结果了,并不一定是你解释的那样发生的。在正式编程里,千万不要在一个表达式中用一个值会发生变化的变量2次以上,如a[i++]=i;等,都可能引起问题。
最后说一下,顺序点并不是一种技巧,而是辅助编译器的运算顺序制定的一个规则。它不是让你利用这个特点写出特殊的表达式,而是让你尽可能不写出这种特殊的带歧义的表达式。
【顺序点参考】 http://www.cnblogs.com/dolphin0520/archive/2011/04/20/2022330.html
对于第一个例子我现在明白了,就是您说的第二条那里。但是单纯的优先级逗号运算符比++低,这个在哪里能表现出来,还是说仅仅因为“++”高于赋值“=”,赋值高于逗号,所以“++”就高于逗号。
对于第二个例子,我试了一下,参与相加的“++”超过两项以上的话,不同的编译器确实是不同的解释,“千万不要在一个表达式中用一个值会发生变化的变量2次以上”这句话我记住了,谢了
优先级的高低,这个在各种语言中都有规定的,一般执行顺序都是按照这些法则进行的
C语言优先级:http://www.slyar.com/blog/c-operator-priority.html
关键这里是逗号运消表达式z=(y++,++y)
逗号表达式会从左到右依次求值, 返回最后旁颤知一项的值
也就是前面的y++也执行了的
y自洞闭增了两次, 故最后返回3