- ベストアンサー
C言語の副作用に関する未定義
- C言語で副作用を持つ演算を含む場合は、その副作用が実行されるタイミングが未定義となっている。
- 例えば、「a[i++] = i;」のようなコードでは、代入演算子の結合規則が右から左であるため、aのインデックスとしてiが参照されるよりも早くiの値が代入される。
- そのため、実行結果が予測できず、未定義の動作となる可能性がある。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
未定義ですね。 このURLを参考にしてください。 http://www.em.edu.waseda.ac.jp/~moriya/education/c/lesson4.html
その他の回答 (2)
演算子の優先順位にはいくつかの例外があり、後置インクリメント演算子もその1つです。 a[i++] = i; の i++ は優先順位が代入演算子よりもさらに低いので、a[i] = i; を実行したあとで i++ が実行されてしまいます。 また、未定義というのは「ゼロ」ではありません。 質問文は、「未定義の i に対して ++ を実行すると1が入る」という前提で話されていますが、特にC言語の場合は間違いです。 未定義値とは、本当に何が入っているか分からない値のことを指すので、もしかしたら、実行された段階で i の中に10とか50000とか3000とかが入っているかもしれないのです。 (VCの場合だと、作為的に 0x5F を入れたりしてるみたいですが) その場合、質問文中のプログラム自体が動作しないことになりますよね。
お礼
i=0; を記載するのを忘れていました。 すみません。 No1の方の内容で解決してしまいましたので、補足する間もありませんでしたが、お礼申し上げます。 ありがとうございました。
- arukamun
- ベストアンサー率35% (842/2394)
サンプルプログラムを組んで、確認してみるといいですね。 sample1() { int a[10] ; int i ; for (i= 0 ;i<10 ;i++) a[i] = 100 ; i = 0 ; while ( i < 10 ) a[i++] = i ; for (i=0 ;i<10 ;i++) printf("a[%d] = %d\n",i,a[i]); } sample2() { int a[10] ; int i ; for (i= 0 ;i<10 ;i++) a[i] = 100 ; i = 0 ; while ( i < 10 ) a[i] = i++ ; for (i=0 ;i<10 ;i++) printf("a[%d] = %d\n",i,a[i]); } sample1は a[0] = 1 a[1] = 2 a[2] = 3 a[3] = 4 a[4] = 5 a[5] = 6 a[6] = 7 a[7] = 8 a[8] = 9 a[9] = 10 sample2は a[0] = 0 a[1] = 1 a[2] = 2 a[3] = 3 a[4] = 4 a[5] = 5 a[6] = 6 a[7] = 7 a[8] = 8 a[9] = 9 を出力しました。
お礼
ありがとうございます。 ただ、副作用の作用順序の優先順位はANSIでも定まっていないと聞いていたので、恐らく処理系によって違うのだと思います。 No1の方の内容で解決してしまいましたので、補足する間もありませんでしたが、お礼申し上げます。 ありがとうございました。
お礼
ずばりとありがとうございました。 やはり値の評価に関する優先順位は定まっていないと見るべきなのですね。 疑問が解決しました。ありがとうございます。