a[i] = i++;
なぜ上記のコードは機能しませんか?なぜこのコードはありません:a [i] = i ++;作業?
上記のコードに問題がありますか?私は私の知識を改善するためにこの質問をしています。
a[i] = i++;
なぜ上記のコードは機能しませんか?なぜこのコードはありません:a [i] = i ++;作業?
上記のコードに問題がありますか?私は私の知識を改善するためにこの質問をしています。
ISO規格では、介入するシーケンスポイントなしで変数を複数回変更する(または変更して使用する)ことはできないと述べているためです。
i
をa[i]
に使用し、i
をi++
に変更した場合のシーケンスポイントはありません。
C11からシーケンスポイントのリスト(実際にはC99以来、そのあまり変わっていない)附属書Cに記載されている:関数呼び出しと実際の呼び出しで関数指定子の評価と実引数の間
と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;
として未定義の文の表現をレンダリングします。
正常に動作しますが、期待通りに動作しない可能性があります。問題は、割り当ての前にi
がインクリメントされているかどうかが不明な場合です。インクリメントされている場合は、a[i]
が配列の次の項目を参照します。
あなたの質問は非常に簡潔でしたので、詳しい情報が必要な場合は、それを拡張することができます。しかし、構文が割り当てられるa
の要素を正確に伝えるのは難しいです。
いいえ、動作しません。 *未定義の動作*です。 –
@Adam:動作が標準で定義されていないという理由だけで、動作しないということはほとんどありません。実装によっては、非常にうまくいくかもしれません。 (*がうまくいかないという事実を気にしない*はひどい説明であり、技術的な問題を記述しようとする開発者は決して使用しないでください)。 –
どのようなエラーが表示されますか? – Habib
すべての変数を宣言しましたか? – Ben
あなたは何をしているのですか?あなたが得ているエラー、または期待した結果が得られていません。 – Vijay