7

次のコード行を記述しました。

if (++(data_ptr->count) > threshold) { /*...*/ } // example 1

私の意図は、と比較する前にポイントするcountデータ構造内の変数をインクリメントすることであり、このコード行は機能します。data_ptrthreshold

data_ptr代わりに、比較を行う前にインクリメントしたい場合は、次のように記述します。

if ((++data_ptr)->count > threshold) { /*...*/ } // example 2

好奇心から、私は次のコード行も試しました。

if (++data_ptr->count > threshold) { /*...*/ } // example 3

そして、それが最初のものとまったく同じように動作することを発見しました。

最初の質問: 例3が例1と同じように機能するのはなぜですか?それはオペレーターの優先順位の問題ですか?標準に何かありますか?答えがはっきりしなかったので、簡単なテストプログラムを書かなければなりませんでした。

2番目の質問:ifこのステートメントを別の方法で書く必要がありますか?混乱を避けるために、最初に独自の行でインクリメントを実行してから、条件をテストすることができます。これは必要ですか、それとも最初の2つの例はそれ自体で十分に明白ですか?

4

4 に答える 4

11

1)優先順位

2)好み

于 2009-12-16T21:55:23.707 に答える
5

はい、これは演算子の優先順位の問題です。矢印演算子は、インクリメント演算子よりも優先されます。

2番目の質問に答えるために、私は通常、このタイプの構成を2つの別々のステートメントに分けます。

++(data_ptr->count);
if(data_ptr->count > threshold) { /*...*/ }

これは何が起こっているかを強調し、起こりうる混乱を排除します。ただし、これはおそらく好みの問題です。

于 2009-12-16T21:54:13.537 に答える
5
  1. 演算子の優先順位によって、観察した動作が決まります。
  2. この例で増分を比較から分離してもそれほど問題はありませんが、一連の条件の途中で増分を含む条件が必要な場合があります。その後、増分をテストから分離しようとすると、問題が発生する可能性があります。そうでなければ不要なネストを導入することによるコードの可読性。

例えば:

if (...1...)
    ...2...
else if (++data_ptr->count > threshold)
    ...3...
else
    ...4...

対:

if (...1...)
    ...2...
else
{
    ++data_ptr->count;
    if (data_ptr->count > threshold)
        ...3...
    else
        ...4...
}
于 2009-12-16T21:56:47.713 に答える
3
  1. ->演算子は、++よりも厳密にバインドします。
  2. どちらも明確に定義されており、読みやすいと思います。同じ式にdata_ptrへの追加の参照がある場合にのみ、問題が発生します。
于 2009-12-16T21:53:44.907 に答える