副作用

表达式的计算顺序由特定实现定义,但语言保证特定的计算顺序时除外(如计算的优先级和顺序中概述)。 例如,下列函数调用中将出现副作用:

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 未定义副作用的计算顺序,因此上面讨论的两种计算方式都是正确的,并且其中一个是可以实现的。 若要确保你的代码可移植且清晰明了,请避免使用依赖于副作用的特定计算顺序的语句。

另请参阅

表达式计算