• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の副作用に関する未定義)

C言語の副作用に関する未定義

このQ&Aのポイント
  • C言語で副作用を持つ演算を含む場合は、その副作用が実行されるタイミングが未定義となっている。
  • 例えば、「a[i++] = i;」のようなコードでは、代入演算子の結合規則が右から左であるため、aのインデックスとしてiが参照されるよりも早くiの値が代入される。
  • そのため、実行結果が予測できず、未定義の動作となる可能性がある。

質問者が選んだベストアンサー

  • ベストアンサー
  • manayu
  • ベストアンサー率53% (79/148)
回答No.1

未定義ですね。 このURLを参考にしてください。 http://www.em.edu.waseda.ac.jp/~moriya/education/c/lesson4.html

参考URL:
http://www.em.edu.waseda.ac.jp/~moriya/education/c/lesson4.html
tamanegi_majin
質問者

お礼

ずばりとありがとうございました。 やはり値の評価に関する優先順位は定まっていないと見るべきなのですね。 疑問が解決しました。ありがとうございます。

その他の回答 (2)

noname#25358
noname#25358
回答No.3

 演算子の優先順位にはいくつかの例外があり、後置インクリメント演算子もその1つです。  a[i++] = i; の i++ は優先順位が代入演算子よりもさらに低いので、a[i] = i; を実行したあとで i++ が実行されてしまいます。  また、未定義というのは「ゼロ」ではありません。  質問文は、「未定義の i に対して ++ を実行すると1が入る」という前提で話されていますが、特にC言語の場合は間違いです。  未定義値とは、本当に何が入っているか分からない値のことを指すので、もしかしたら、実行された段階で i の中に10とか50000とか3000とかが入っているかもしれないのです。 (VCの場合だと、作為的に 0x5F を入れたりしてるみたいですが)  その場合、質問文中のプログラム自体が動作しないことになりますよね。

tamanegi_majin
質問者

お礼

i=0; を記載するのを忘れていました。 すみません。 No1の方の内容で解決してしまいましたので、補足する間もありませんでしたが、お礼申し上げます。 ありがとうございました。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.2

サンプルプログラムを組んで、確認してみるといいですね。 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 を出力しました。

tamanegi_majin
質問者

お礼

ありがとうございます。 ただ、副作用の作用順序の優先順位はANSIでも定まっていないと聞いていたので、恐らく処理系によって違うのだと思います。 No1の方の内容で解決してしまいましたので、補足する間もありませんでしたが、お礼申し上げます。 ありがとうございました。

関連するQ&A