2017-01-03 8 views
4

Cはifステートメントを持ち、そのファミリの一部はelse ifelseステートメントです。 elseは、それ自身が成功した値がないかどうかをチェックし、成功した場合は、そのコードを実行します。Cでのelseのcatch-all

値のすべてがどれもそれらののではなく、成功したかどうかを確認するelseの反対のようなものがあります場合、私は思っていました。

だが、私はこのコードを持っているとしましょう:

if (someBool) 
{ 
    someBit &= 3; 
    someFunction(); 
} 
else if (someOtherBool) 
{ 
    someBit |= 3; 
    someFunction(); 
} 
else if (anotherBool) 
{ 
    someBit ^= 3; 
    someFunction(); 
} 
else 
{ 
    someOtherFunction(); 
} 

確かに、私はこれを短縮することができます:

  • goto(ジー、私はそれをしないだろう、なぜかしら)
  • 書き込みif (someBool || someOtherBool || anotherBool)(乱雑で遠隔移植はできません)。

私はこのような何かを書くためにはるかに容易になるだろう考え出し:

if (someBool) 
    someBit &= 3; 
else if (someOtherBool) 
    someBit |= 3; 
else if (anotherBool) 
    someBit ^= 3; 
all // if all values succeed, run someFunction 
    someFunction(); 
else 
    someOtherFunction(); 

んCは、この能力を持っていますか?

+4

などのような**ありません**それはしていません。 – abelenky

+4

これは動作しません。なぜなら、1つの条件が真であれば、それは残りをチェックしないからです。これは、潜在的にパフォーマンスを低下させる可能性のあるすべての条件をチェックすることを余儀なくさせる必要があります。 Pythonのような上位レベルの言語は、この目的のために 'all'関数を持っています(あなたの提案とは異なっていますが)。 @ abelenky。 – Carcigenicate

+0

それを答えにして、私はあなたにアップヴォートすることができます:) –

答えて

7

これは、追加の変数を使用して行うことができます。例えば

int passed = 0; 

if (passed = someBool) 
{ 
    someBit &= 3; 
} 
else if (passed = someOtherBool) 
{ 
    someBit |= 3; 
} 
else if (passed = anotherBool) 
{ 
    someBit ^= 3; 
} 

if (passed) 
{ 
    someFunction(); 
} 
else 
{ 
    someOtherFunction(); 
} 

warning: suggest parenthesis around assignment valueを示すからGCCを停止するため、((passed = etc))として各(passed = etc)を書き込みます。

+0

ああ、悪くない! GCCがあなたに叫んでもらえない、これを行う方法は? –

+3

@Redesign AFAIKあなたはifステートメント内のかっこで囲みを囲む必要があります。たとえば、if((pass = expression)) –

+0

いいえ。ありがとうございました。 –

0

これを試してください。

int test=0; 

if (someBool) { 
    test++; 
    someBit &= 3; 
    someFunction(); 
} 

if (someOtherBool) { 
    test++; 
    someBit |= 3; 
    someFunction(); 
} 

if (anotherBool) { 
    test++; 
    someBit ^= 3; 
    someFunction(); 
} 

if (test==0) { 
    noneFunction(); 
} else if (test==3) { 
    allFunction(); 
} 
1

あまりにも遅いですが、自分のバージョンも追加します。

return 
someBool?  (someBit &= 3, someFunction()) : 
someOtherBool? (someBit |= 3, someFunction()) : 
anotherBool? (someBit ^= 3, someFunction()) : 
someOtherFunction(); 

またはその

(void(*)(void) 
someBool?  (someBit &= 3, someFunction) : 
someOtherBool? (someBit |= 3, someFunction) : 
anotherBool? (someBit ^= 3, someFunction) : 
someOtherFunction 
)(); 

またはその

void (*continuation)(void) = 
someBool?  (someBit &= 3, someFunction) : 
someOtherBool? (someBit |= 3, someFunction) : 
anotherBool? (someBit ^= 3, someFunction) : 
someOtherFunction; 
continuation(); 
関連する問題