2012-03-30 16 views
2
a[i] = i++; 

なぜ上記のコードは機能しませんか?なぜこのコードはありません:a [i] = i ++;作業?

上記のコードに問題がありますか?私は私の知識を改善するためにこの質問をしています。

+1

どのようなエラーが表示されますか? – Habib

+0

すべての変数を宣言しましたか? – Ben

+2

あなたは何をしているのですか?あなたが得ているエラー、または期待した結果が得られていません。 – Vijay

答えて

9

ISO規格では、介入するシーケンスポイントなしで変数を複数回変更する(または変更して使用する)ことはできないと述べているためです。

ia[i]に使用し、ii++に変更した場合のシーケンスポイントはありません。

C11からシーケンスポイントのリスト(実際にはC99以来、そのあまり変わっていない)附属書Cに記載されている:関数呼び出しと実際の呼び出しで関数指定子の評価と実引数の間

  • 次の演算子の第1オペランドと第2オペランドの評価の間:論理AND & &;論理OR ||コンマ 、。
  • 条件付きの?:演算子の最初のオペランドと、2番目と3番目のオペランドのどちらかの評価の間に評価されます。
  • 完全な宣言子の終わり:宣言子。
  • 完全な式と評価される次の完全な式の評価の間。以下は完全な式です:イニシャライザ。式の中の式。選択文の制御式(ifまたはswitch)。 while文またはdo文の制御式。 for文のそれぞれの式。 return文での式
  • ライブラリ関数が返される直前。
  • 各フォーマット済みの入出力関数変換指定子に関連付けられたアクションの後。
  • 比較関数の各呼び出しの直前および直後、および比較関数の呼び出しとその呼び出しの引数として渡されたオブジェクトの移動の間でも同様です。

5.1.2.3 Program execution状態:

評価A及びBは不定AがBの前または後のいずれかに配列決定された場合に配列決定し、それは指定されていないれます。

式AとBの評価の間のシーケンスポイントの存在は、Aに関連するすべての値の計算と副作用が、Bに関連するすべての値の計算と副作用の前に順序付けられることを意味します。6.5 Expressionsほとんど

節は、あなたの正確なケースを取り上げます。

表現の部分式の複数の許容順序がある場合は、そのようなunsequenced副作用が順序のいずれかで発生した場合、動作は未定義です。

この段落はi = i + 1;a[i] = i;を可能にしながら、このようなi = ++i + 1;a[i++] = i;として未定義の文の表現をレンダリングします。

1

正常に動作しますが、期待通りに動作しない可能性があります。問題は、割り当ての前にiがインクリメントされているかどうかが不明な場合です。インクリメントされている場合は、a[i]が配列の次の項目を参照します。

あなたの質問は非常に簡潔でしたので、詳しい情報が必要な場合は、それを拡張することができます。しかし、構文が割り当てられるaの要素を正確に伝えるのは難しいです。

+0

いいえ、動作しません。 *未定義の動作*です。 –

+3

@Adam:動作が標準で定義されていないという理由だけで、動作しないということはほとんどありません。実装によっては、非常にうまくいくかもしれません。 (*がうまくいかないという事実を気にしない*はひどい説明であり、技術的な問題を記述しようとする開発者は決して使用しないでください)。 –