2017-01-03 75 views
4

我們都知道C具有if語句,並且該族的部分是else ifelse語句。 else本身檢查是否沒有值成功,如果是,則運行前面的代碼。Catch-all for if-else in C

我想知道是否有類似的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

這是行不通的,因爲一旦一個條件成立,它甚至不會檢查其餘的。這需要迫使它檢查所有條件,而不管哪種條件可能會導致性能下降。像Python這樣的高級語言爲此目的具有「全部」功能(儘管它的工作方式與您建議的不同)。 – Carcigenicate

+0

@abelenky。把它變成一個答案,這樣我可以upvote你:) –

回答

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語句中的括號內。例如,如果((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();