9

次の C 式について警告が表示されます。

*p0++ = mult(*p0, psign[i1]); 

警告は次のとおりです。

unsequenced modification and access to 'p0' [-Wunsequenced]

式は次のように変更する必要があると思います。

*p0 = mult(*p0, psign[i1]);
p0++;

(変更後の) 動作は意図したとおりになりますか? p0 が指す値が更新された後に、ポインターのインクリメントが発生するはずだと思います。

4

1 に答える 1

15

上記で提供したスニペットは、未定義の動作を呼び出します。C標準によると

C11: 6.5 式:

スカラー オブジェクトに対する副作用が、同じスカラー オブジェクトに対する別の副作用または同じスカラー オブジェクトの値を使用した値の計算と比較して順序付けされていない場合、動作は未定義です。式の部分式に複数の順序付けが許可されている場合、いずれかの順序付けでそのような順序付けされていない副作用が発生した場合の動作は未定義です。84)

式では、代入演算子の左側の*p0++ = mult(*p0, psign[i1])への変更は、式の右側の の使用の前または後に配列されません。したがって、スニペットp0p0

*p0++ = mult(*p0, psign[i1]);   

と同等ではありません

*p0 = mult(*p0, psign[i1]);
p0++;                       // Side effect to p0 is guaranteed after the use  
                            // of p0 in mult function
于 2015-08-14T19:48:23.410 に答える