私は次のようなものを書いていることを知っています
++a = a++;
読めないだけでなく、c/c++ シーケンス ポイントにも違反しています。
これらの制限はどこから来るのでしょうか? それらをバグとして見つける前に、これらの「問題」をどのように見ることができますか?
私は次のようなものを書いていることを知っています
++a = a++;
読めないだけでなく、c/c++ シーケンス ポイントにも違反しています。
これらの制限はどこから来るのでしょうか? それらをバグとして見つける前に、これらの「問題」をどのように見ることができますか?
基本的に、各ステートメント間にC++03シーケンスポイントがあります。詳細については、SO C++FAQを参照してください。さらに詳しい情報については、C ++標準を参照してください。また、C ++ 11標準では、シーケンスポイントがリレーションの前にシーケンスされ、後にシーケンスされることに置き換えられていることに注意してください。
問題を回避するために、各式で多くのことを行うことについてあまり賢くならないようにしてください。
コンパイラの仕事をしようとしないでください。それはコンパイラに任せてください。あなたの仕事は、他の人間が簡単に理解できるコード、つまり明確なコードを書くことです。複数の更新と副作用のある演算子の不必要な使用は、それと互換性がありません。
ヒント:const
可能な限りほぼすべての場所に振りかけます。
これは、読者が考慮しなければならない可能性のある状態変化を制約します。
これらは、効果的にシーケンス ポイントをリストする C または C++ 標準に由来します。1 いくつかの単純なケースでは、未定義の動作を呼び出していることをコンパイラが警告できる場合がありますが、一般的なケースではそうではありません。
ただし、例のような「興味深い」コードを書いている場合は、通常、シーケンスポイントの要件に違反しているだけです。言語標準は、このようなコードに特定の制約を課す可能性があります (これは Java などの言語が行うことです)。
それらをバグとして見つける前に、これらの「問題」をどのように見ることができますか?
プログラムを最も厳しいレベルでコンパイルし、すべての警告がエラーとして指摘されるように設定を有効にします。ほとんどの主流のコンパイラは、シーケンス ポイントによる未定義の動作エラーを指摘します。
gcc では以下を使用できます。
-Wsequence-point
これは、シーケンス ポイントの問題を指摘します。を使用する場合、デフォルトで有効になっていることに注意してください-Wall
。
もちろん、最善の方法は、シーケンス ポイントのミス アドベンチャーを回避する、より読みやすいコードを作成することです。