2015-06-28 59 views
3

考慮的INT num這個常量聲明:如何在一行中使用三元運算符做到這一點?

int main() { 
    bool a = true, b = false; 
    // ... 
    const int num = a ? (b? 2 : 4) : 4; 
    std::cout << num; 
} 

我要的是const int num遵循這個道理表(我很抱歉,從我原來的問題已經被編輯以反映我的節目模式):

   b 
    a  true false 
true  2  4 
false  4  2 

如何修改上面的const int num聲明使用三元運算符來實現這個?我知道如何聲明這樣的num是使用lambda函數和lambda函數內的嵌套if語句或switch statenents的常量,但我只是想知道如何使用三元運算符來完成此操作。作爲獎勵,如果要使用3個或更多這樣的bool值(在真值表中沒有特定的模式)會怎麼樣?

+0

'一個? (b?2:3):(b?4:5);' –

回答

3

您可以編寫

const int num = (a^b) ? 4 : 2; 

聲明它至少是更清晰比

const int num = a ? (b? 2 : 4) : 4; 

這裏是一個示範項目

#include <iostream> 

int main() 
{ 
    std::cout << (false^false ? 4 : 2) << std::endl; 
    std::cout << (true^false ? 4 : 2) << std::endl; 
    std::cout << (false^true ? 4 : 2) << std::endl; 
    std::cout << (true^true ? 4 : 2) << std::endl; 
} 

程序輸出是

2 
4 
4 
2 
6
const int num = a ? (b? 2 : 3) : (b? 4: 5); 

編輯:

作爲獎勵,如果3個或更多這樣的布爾值將被使用?

我根本不會使用這樣的語法。 我將宣佈我的表作爲

int truthTable[2][2]..[2] = {{..},...{..}} 

,現在乾脆:
int res = truthTable[!true][!false]..[!true]

!true將成爲0!false將成爲1,那麼,正確的值將被從陣列中拉出。

+0

在這裏是否評估過一次或兩次?有沒有辦法只寫一次'b'? – prestokeys

+1

我不知道,我認爲編譯器或者根本不會優化,部分優化或者完全優化代碼。因此 - 我們無法知道。 –

+0

看看生成的程序集來知道。 –

6

David Haim的答案對真值表中的很多其他值很有用。然而,在這特定例如,有一個容易識別的數學關係,我們可以利用:

const int num = (a ? 2 : 4) + (b ? 0 : 1); 

我們可能並不總是有真值表這樣一個容易識別的關係雖然。


上述表達式是基於問題的原始真值表,這是這樣的:

   b 
    a  true false 
true  2  3 
false  4  5 

鑑於這種真值表:

b 真正的假 真2 4 false 4 2

還有另外一種方式,我們可以爲這一個返回正確的價值觀:

const int num (a == b) ? 2 : 4 

這個人是不是真的任何形式的數學。這只是簡單地認識到,當ab是相同的,我們想要2,但是當ab是不同的,我們想要4。這個真值表與==運營商的真值表完全相同,我們只是返回2/4而不是true/false

+0

@ nhgrif。我編輯了我的問題以反映我的程序中的實際模式。所以當b是假時,2,4就會翻轉。我們可以利用什麼數學關係來寫一次b? – prestokeys

+0

@prestokeys查看我更新的答案。 – nhgrif

1

井這一特定情況下,我會去的:

const int num = (a == b) ? 2 : 4; 
+0

編輯了數字,這就是爲什麼。 –

+0

沒錯,我的不好。但是也很瞭解一般情況下的解決方案。 – prestokeys