----一道错题,-----
我个人很赞同BlueGuy说的.
先不说x*=x++/--y这个式子.C语言中有2个这样的概念:序列点和副作用.
序列点:用来表示某个时间点,在这个时间点时所有变量的状态都是已经确定的,也可以这样理解这时候的变量的值是可以预测的.序列点之前的副作用全部结束,新的副作用还没开始.这些
情况会有一个序列点: 语句分割符;
,
运算符&&
,
运算符||
,
运算符?:
,
逗号运算符,
。
副作用:对某个变量值的改变.只要变量的值变了,就产生了副作用.一个赋值语句也会有副作用.这几种情况会有副作用:赋值语句,++(--)这样的语句,函数调用(可能还有其他情况一下没想
到).
C语言中有这样一条语法:两个相临的序列点之间对一个确定的变量最多只能有1次副作用.否则那是一个未定义的行为(这并不是非法语句,只是不能预测其行为,是编译器设计者自己实现的,也就是说不同编译器可能有不同结果。)
看一个例子:
int i =0 ; /*这里有一个序列点,记为A*/
i = i++ ; /*这里有一个序列点,记为B*/
序列点A到B之间,变量i有2次副作用(“i=”和“i++”),因此这不是一个符合标准C语言的语句。在序列点B时,i的值可能是0,也可能是1。
经常看到这样有人问这样的语句printf( "%d %d ",i++,++i )输出的结果为什么会不同,现在应该很清楚了吧。建议,不要把过多的时间浪费在这方面上 。我想没人会写出printf( "%d %d ",i++,++i )这样的语句吧。
对于C语言的求值顺序,也不要过分的相信。给出运算符优先顺序和结合顺序(尤其是结合顺序)只是做一个参考,绝大多数情况是那样的,还是有些情况是编译器设计者根据实际情况来实现的。不过这几个运算符号(它们有相应的序列点) ,
&&
||
?:
。