副作用
表达式的计算顺序由特定实现定义,但,在该语言确保计算期间特定顺序 (如 计算优先级和顺序中所述)。 例如,则在发生以下情况函数调用:
add( i + 1, i = j + 2 );
myproc( getc(), getc() );
函数的参数调用可以按任意顺序计算。 该表达式 i + 1 可以在 i = j + 2之前进行计算,或 i = j + 2 可以在 i + 1之前进行计算。 该结果不同。每种情况。 同样,一定不能将什么字符实际传递给 myproc。 如下面的示例所示,从一元运算符递增和递减运算涉及分配,这些操作可能产生副作用,例如:
x[i] = i++;
在此示例中,修改 x 的值是不可预知的。 该下标的值可以是 i的新功能或旧值。 该结果可能改变在不同的编译器或不同的优化级别下。
因为 C 不定义副作用的计算顺序,讨论的两个计算方法上面是正确的,并用于能实现。 若要确保,代码可移植的清晰,请避免依靠计算特定顺序副作用的语句。