0

c89 モードで gcc 4.7.0 を使用しています。

この if-else ステートメントがあり、2 つの質問があります。

  1. 最初に FALSE または TRUE 条件をテストする必要があるかどうか疑問に思っています。通常はどちらが優れていますか。大した違いはないことはわかっていますが、他のエンジニアは何をしているのでしょうか。以下の例では、最初に FALSE をチェックしています。

  2. 私はいつも防御的なプログラミングをするのが好きです。したがって、各条件を明示的に確認できる場合は常にそうします。たとえば、if() - else を実行するのではなく。私は if() - そうでなければ if() をします。以下の例では、条件は TRUE または FALSE のいずれかになります。ただし、else 条件をチェックして、それが TRUE であることを確認するのが好きです。これには本当の意味がありますか?

ご提案いただきありがとうございます。

if(event->status == FALSE) {
    g_release_call_test(module, channel_id);
}
else if(event->status == TRUE) {
    if(UNIT_TEST & KARAOKE) {
        if(g_record_karaoke(module, channel_id) == FALSE) {
            g_release_call_test(module, channel_id);
        }
    }
    else if(UNIT_TEST & RECORD) {
        if(g_record_file_test(module, channel_id) == FALSE) {
            g_release_call_test(module, channel_id);
        }
    }
    else if(UNIT_TEST & GET_DIGITS) {
        if(g_collect_digits_test(module, channel_id) == FALSE) {
            g_release_call_test(module, channel_id);
        }
    }
}
4

4 に答える 4

2
  1. 最初に FALSE または TRUE 条件をテストする必要があるかどうか疑問に思っています。通常はどちらが優れていますか。大した違いはないことはわかっていますが、他のエンジニアは何をしているのでしょうか。以下の例では、最初に FALSE をチェックしています。

    あなたの条件でプロファイリングを行います。20% のケースが False になり、80% のケースが true になるというデータがある場合は、true 分岐を最初の分岐に配置します。これにより、場合によってはパフォーマンスが向上することがあります。

  2. 私はいつも防御的なプログラミングをするのが好きです。したがって、各条件を明示的に確認できる場合は常にそうします。たとえば、if() - else を実行するのではなく。私は if() - そうでなければ if() をします。以下の例では、条件は TRUE または FALSE のいずれかになります。ただし、else 条件をチェックして、それが TRUE であることを確認するのが好きです。これには本当の意味がありますか?

    event->status が何らかのトリックの問題で破損する可能性があることを心配していない限り、ほとんどの場合、 if (!event->status) else スタイルを使用していると思います

于 2012-09-05T05:10:39.567 に答える
1

1) 最初に FALSE または TRUE 条件をテストする必要があるかどうか疑問に思っています。通常はどちらが優れていますか。大した違いはないことはわかっていますが、他のエンジニアは何をしているのでしょうか。以下の例では、最初に FALSE をチェックしています。

構文的には大きな違いはありません。プログラミングの賢明さは、一般的にはあまり重要ではありません。ただし、特定のユースケースでは、パフォーマンスに影響を与える可能性があります。例を考えてみましょう。メディア ファイルを再生していて、この条件がメディア フレームかヘッダーかをチェックする場合。ここで、ヘッダーの後に何百ものメディア フレームがあることがわかっているため、メディア フレームの次にヘッダーをチェックする必要があります。ヘッダーのチェックは、100 の冗長なチェック == 100 の冗長な CPU 命令を意味するため [さらに多くなる可能性があります]。一般的なことを書いている場合を除き、ユースケースに応じてコーディングすることをお勧めします。

2) 私はいつも防御的なプログラミングをするのが好きです。したがって、各条件を明示的に確認できる場合は常にそうします。たとえば、if() - else を実行するのではなく。私は if() - そうでなければ if() をします。以下の例では、条件は TRUE または FALSE のいずれかになります。ただし、else 条件をチェックして、それが TRUE であることを確認するのが好きです。これには本当の意味がありますか?

防御的プログラミングには、独自の長所と短所があります。上記のシナリオでは、コンパイラが必要な最適化を行います。

こちらを ご覧ください http://www.eventhelix.com/realtimemantra/basics/optimizingcandcppcode.htm#

乾杯..ハッピーラーニング

于 2012-09-05T05:00:32.003 に答える
1

1) コンパイラーがコードを最適化するため、どの条件を最初にチェックするかは問題ではありません。

2) 2 つの値 ( )statusしか持てない場合、平均的な読者にとっては少し混乱するようです。一方、他の値を持つことができる場合、3 番目の else 部分は. 一般に、アサートを追加することは、防御ツールボックスに追加して、誤った仮定を検出するための良い習慣です。TRUE/FALSEelse ifstatusassert()

于 2012-09-05T05:00:35.710 に答える
1

まず、ブール値に対してこれを行わないでください。

if (something == TRUE)
if (something == FALSE)

これらは次のようになります。

if (something)
if (!something)

ブール値には、 orifのようにステートメントが自然に読み取れるように、適切な名前を付ける必要もあります。何かがステータスを持っていることを示すことを意図していない限り、ブール値の良い名前ではありません。その場合でも、または同様のものを使用しますif (isFinished)while (stillSomeMoreToGo)statushasStatus

いずれにせよ、それがあなたの値と等しくなくても、Cでは何かが真になる可能性がありますTRUETRUE必要に応じて、1 つの値になりますが、C ではゼロ以外の場合は true と定義されます (2 32 -1異なる可能な値ですが、もちろんint仕様によって異なります)。

true または false を明示的にテストすることは、別のブール値を生成するだけなので、悪い考えです。どこで停止しますか?

if ((event->status == TRUE) == TRUE) ...
if (((event->status == TRUE) == TRUE) == TRUE) ...
if ((((event->status == TRUE) == TRUE) == TRUE) == TRUE) ...
if (((((event->status == TRUE) == TRUE) == TRUE) == TRUE) == TRUE) ...

あなたの具体的な質問に関しては、(1)については、パフォーマンスの観点からはおそらく少しの違いはありません。ただし、コードの可読性に影響を与える場合があります。「最も美しい」コードを生成する方法を選択し、ソースをネイティブ形式に変換する最適な方法をコンパイラーに判断させます。

私が最適化する最初のことは読みやすさです。読み取り可能なコードのプロファイルを作成し、パフォーマンスの問題があることが判明したら、改善方法を考えることができます。

しかし、このアドバイスを無料で提供します。最も印象的な改善は、通常、ミクロ レベル (true または false のテスト、代わりにカウント ダウン) ではなく、マクロ レベル (アルゴリズムの選択やデータ構造の選択など) で行うことができます。アップなど)。

読みやすさの例として、私は最初に短いものを作成する傾向があります (ブロック内のブロックifは比較的簡潔です)。また、インデントを減らすことが多いため、初期リターンも最初に行う傾向があります。つまり、次のようなものです。

def fn (x):
    if (x < MIN_X_ALLOWED):
        return -1

    # Now carry on, knowing that x >= MIN_X_ALLOWED.

(2)については、いいえ、これには本当のポイントはありません。ブール値が必要であり、可能なケースが 2 つしかないことを明示的に決定しました。あなたは不可能に対して防御しています。

それが整数で、値2357およびのみ11が許可されている場合、(たとえば) 値 に対して防御する必要があるため、それは異なります10

于 2012-09-05T05:00:55.227 に答える