3

私はいつもこれについて疑問に思っていました。変数(文字列の重み)と入力変数(intモード)があり、1または0の場合があるとします。

以下を使用することには明らかな利点がありますか?

weight = (mode == 1) ? "mode:1" : "mode:0";

以上

if(mode == 1)
    weight = "mode:1";
else
    weight = "mode:0";

コードの可読性を超えていますか?速度はまったく影響を受けますか?これはコンパイラーによって異なる方法で処理されますか(特定のswitchステートメントをジャンプテーブルに変換する機能など)?

4

3 に答える 3

3

条件演算子とif/elseブロックの主な違いは、条件演算子がステートメントではなく式であるということです。したがって、if/elseを使用できない条件演算子を使用できる場所はほとんどありません。たとえば、次のような定数オブジェクトの初期化:

const double biasFactor = (x < 5) ? 2.5 : 6.432;

この場合にif/elseを使用した場合は、biasFactor非定数である必要があります。

さらに、コンストラクタ初期化子リストは、ステートメントではなく式の呼び出しも行います。

X::X()
  : myData(x > 5 ? 0xCAFEBABE : OxDEADBEEF)
{
}

この場合、myDataには代入演算子または非定数メンバー関数が定義されていない可能性があります。そのコンストラクターがパラメーターを渡す唯一の方法である可能性があります。

また、最後にセミコロンを追加することで、どの式もステートメントに変換できることに注意してください。その逆は当てはまりません。

于 2012-11-24T22:03:09.500 に答える
0

いいえ、これは純粋に人間の読者にコードを提示することに関するものです。私は、どのコンパイラもこれらに対して同じコードを生成することを期待しています。

于 2012-11-24T21:45:34.520 に答える
0

mingwを使用すると、で生成されたアセンブリコード

const char *  testFunc()
{
    int mode=1;
    const char * weight = (mode == 1)? "mode:1" : "mode:0";
    return weight;
}

は:

testFunc():
0040138c:   push %ebp
0040138d:   mov %esp,%ebp
0040138f:   sub $0x10,%esp
10          int mode=1;
00401392:   movl $0x1,-0x4(%ebp)
11          const char * weight = (mode == 1)? "mode:1" : "mode:0";
00401399:   cmpl $0x1,-0x4(%ebp)
0040139d:   jne 0x4013a6 <testFunc()+26>
0040139f:   mov $0x403064,%eax
004013a4:   jmp 0x4013ab <testFunc()+31>
004013a6:   mov $0x40306b,%eax
004013ab:   mov %eax,-0x8(%ebp)
12          return weight;
004013ae:   mov -0x8(%ebp),%eax
13        }

そしてと

const char *  testFunc()
{
    const char * weight;
    int mode=1;
    if(mode == 1)
        weight = "mode:1";
    else
        weight = "mode:0";

    return weight;
}

は:

testFunc():
0040138c:   push %ebp
0040138d:   mov %esp,%ebp
0040138f:   sub $0x10,%esp
11          int mode=1;
00401392:   movl $0x1,-0x8(%ebp)
12          if(mode == 1)
00401399:   cmpl $0x1,-0x8(%ebp)
0040139d:   jne 0x4013a8 <testFunc()+28>
13              weight = "mode:1";
0040139f:   movl $0x403064,-0x4(%ebp)
004013a6:   jmp 0x4013af <testFunc()+35>
15              weight = "mode:0";
004013a8:   movl $0x40306b,-0x4(%ebp)
17          return weight;
004013af:   mov -0x4(%ebp),%eax
18        }

ほぼ同じコードが生成されます。アプリケーションのパフォーマンスは、このような細部に依存するべきではありません。

ですから、違いはありません。

于 2012-11-24T21:50:33.407 に答える