1 c语言没有指定同一运算符中多个操作数的计算顺序(&& 、||、?:和,运算符除外。例如,在形如
x = f ( ) + g ( );
的语句中,f ( )可以在g ( )之前计算,也可以在g ( )之后计算。因此,如果函数 f 和 g 改变了另一个函数所使用的变量,那么x的结果可能会依赖于这两个函数的计算顺序。为保证特定的计算顺序,可以把中间结果保存在中间变量中。
类似地,c语言也没有指定函数各参数的求值顺序。因此,下列语句
printf ( "%d %d \n", ++n, power ( 2,n )); //错
在不同的编译器中可能会产生不同的结果,这取决于n的自增运算在power调用之前还是之后执行。解决的办法是把该语句改写成下列形式:
++n;
printf ( "%d %d \n", n, power( 2,n));
还有类似地 a[i] = i++;
问题是:数组下表i是引用旧值还是新值?对这种情况编译器的解释可能不同,并因此产生不同的结果。
c院标准对大多数这类问题有意未作具体规定。
表达式何时会产生这种副作用(对变量赋值),将由编译器决定,因为最佳的求值顺序同机器结构有很大关系。
2 逗号运算符“ , ”,也是C语言优先级最低的运算符,在for语句中经常会用到它。被逗号分隔的一对表达式将按照从左到右的顺序进行求值,各表达式右边的操作数的类型和值即为其结果的类型和值。
在某些情况下的逗号并不是逗号运算符,比如分隔函数参数的逗号,分隔声明中的变量的逗号等,这些逗号并不保证各表达式按从左至右的顺序求值。
3 break语句可用于从for、while、do-while、switch等循环中提前退出。
continue语句用于使for、while、或do-while语句开始下一次循环的执行。在while与do-while语句中,continue语句的执行意味着立即执行测试部分;在for循环中,则意味着使控制转移到递增循环变量部分。continue语句只用于循环语句,不用于switch语句。某个循环中包含的switch语句中的continue语句,将导致进入下一次循环。