Page List

Search on the blog

2012年1月29日日曜日

C言語の副作用完了点

以下のようなコードを書いたところ、"operation on 'i' may be undefined"というwarningが出ました。

  1. int main() {  
  2.     int a[10];  
  3.   
  4.     int i = 0;  
  5.     a[i] = i++;  
  6.   
  7.     return 0;  
  8. }  

調べてみると、「ある変数に 対して副作用が生じるような式においては、他の箇所でその変数を参照すること はできません。その結果は未定義とされています。」ということだそうです。

ちなみに、ある時点においてそこまでの副作用が全て完了することが保証されている区切 りのことを、副作用完了点(sequence point)と呼ぶそうです。後置インクリメントは次の副作用完了点の前までに実行されることは保証されています。しかし、後置演算の該当部分が読み込まれてすぐ、かつ、他の部分が評価される前に実行されるとは限らないということです。

上の例の他にも以下のような処理も同様の理由で未定義となります。

  1. int main() {  
  2.     int x, y;  
  3.   
  4.     x = 0;  
  5.     printf("%d\n", x + x++);   // NG  
  6.   
  7.     y = x + ++x;     // NG  
  8.       
  9.     return 0;  
  10. }  

参考サイト:

0 件のコメント:

コメントを投稿