2017-08-05 7 views
2

私は、条件をチェックし、条件が真であれば真を返し、条件が偽であれば偽を返す単純な関数を持っているとしましょう。ブール関数でelsesを使うC++

bool myfunction(/*parameters*/) { 
    if (/*conditional statement*/) { 
     return true; 
    } 
    return false; 
} 

またはこのタイプ:

bool myfunction(/*parameters*/) { 
    if (/*conditional statement*/) { 
     return true; 
    } 
    else return false; 
} 

それともそれは本当に違いはありません

は、それはこの種のコードを使用することをお勧めしますか?また、「if ... else if」と「if else ...」と「switch」のどちらを選択するかを決める際には、留意すべきことは何ですか?

+6

「return conditional_expression;」という単純な理由はありません。 –

+0

リバースエンジニアリングのモデリングツールの視点として、2番目の方法は両方のパスを与えます –

+0

@Someprogrammerdudeそれはあまりにも意味をなさないので。 :P –

答えて

1

これは同じです。いつでもあなたが言うことを覚えておいてください。

return boolean; 

この機能は終了し、呼び出し元の回線に戻ります。 それを他に入れたり、単に入れたりするのは同じです。

は、関数を見れば密接にあなたが数がSQRT(N)の範囲内の任意の値を適切に分割されている場合、それは数としてfalseを返します知っている私たちは首相

bool isPrime (int n){ 
    for (int i = 2; i <= sqrt(n); i++){ 
     if (n % i == 0) 
      return false; 
    } 
    return true; 
} 

を確認したいと言います素数ではありません。 分割できない場合、ループは何の干渉もなく終了し、数がプライムであると言います。したがって、この機能は適切に機能します。

+0

具体的にしてください –

+0

私はあなたが探している値を返すために条件を置く方が良いということを意味しました。たとえば、あなたのケースは特定の条件では 'true'、他の条件では' false'です。関数内で 'true'をいっぱいにするという条件だけを入れれば、たくさんのコードを書くのが簡単になります。そしてきれいなコード。 – Shafi

0

与えられた2つの回答のいずれも爪に当たっていないので、もう1つ答えます。

最近のコンパイラの両方のバージョンが同一であると仮定して、コード(またはコンパイラの)ビューから見てください。コンパイラはifバージョンをreturnバージョンに最適化します。違いはデバッグ中です。使用しているデバッガでは、戻り値にブレークポイントを設定できない場合があります(たとえば、真の値だけを返す場合にブレークポイントを設定する場合など)。 ifバージョンは、異なる行に2つのreturn文を与えますが、正常なデバッガはブレークポイントをちょうど良いところに設定します。

7

はまた、任意の条件で、すべてのことなくこれを書くことができます。

bool myfunction(/*parameters*/) { 
    return /*conditional statement*/; 
} 

この方法で、あなたは完全に条件を避けます。

もちろん、条件付きで必要な別の機能を扱っている場合は、違いはありません。現代のコンパイラはいずれの方法でもうまく動作します。

switch-if-elseを使用する限り、スイッチは単一のものにジャンプできるようにすることで多くのケースがある場合に効率を上げ、すべてのケースを実行しないことで実行を高速化します。低い(ハードウェア/コンパイラレベル)では、switch文を使用すると、単一のチェック/ジャンプを行うことができます。if文が多数ある場合は、多くのチェック/ジャンプを行う必要があります。

0

第2の関数の "else"は効果がないため、コンパイラによって適用された最適化に関係なく、どちらの関数も同じです。条件が満たされるとすぐに関数を終了すると、この場合は他のブランチに入ることはないので、最初のバージョンでは "else"が暗黙的になります。 したがって、私は最初のバージョンを好むでしょう。なぜなら、もう一方の "else"は誤解を招くからです。

しかし、この関数の代わりに単純なブール条件を使うことができるので、この種の関数(両方の変形)が意味をなさないことに私は同意します。

0

コンパイルに関しては、if-else構文で選択する特定の形式では大きな違いはありません。最適化パスは、通常、任意の違いを消去します。あなたの決定は、代わりにビジュアルフォームに基づいて行う必要があります。

他の人が既に指摘しているように、このような単純な条件がある場合は、計算を直接返してifの文を避けることをお勧めします。

直接返すことは、ブール演算がある場合にのみ機能します。代わりに、異なるタイプを返す必要があります:

int foo(/*args*/) { 
    if(/*condition*/) { 
    return bar(); 
    } 
    return 0; 
} 

代わりにあなたは三項演算子?:を使用することができますが、表現ならば、それは明らかなようではないかもしれません。

短い戻り値(評価が関数の最後に到達しない)を使用することによって、いくつかの条件と評価を順序付けることもできます。

int foo(/*args*/) { 
    if(/*condition1*/) { 
    return 0; 
    } 

    if(/*condition2*/) { 
    return 3; 
    } 

    int common = bar(/*args*/); 
    if(/*condition3*/) { 
    return 1-common; 
    } 

    return common; 
} 

最も論理的な意味に基づいてフォームを選んで、これをどのようにコンパイルするかを無視してください。次に、視覚的な複雑さを最小限に抑えるようにフォームをマッサージすることを検討します(あまりにも多くのインデントや深い分岐を避ける)。