如何在一行中使用三元运算符?

pre*_*eys 3 c++ ternary operator-keyword

考虑这个int的const声明num:

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

我想要的是const int num遵循这个真值表(我道歉已经从我原来的问题编辑,以反映我的程序中的模式):

              b
  a      true   false
true      2      4
false     4      2
Run Code Online (Sandbox Code Playgroud)

如何修改上面的const int num声明来实现这个使用三元运算符?我知道如何在numlambda函数中使用lambda函数和嵌套的if语句或切换状态来声明这样的const,但我只是想知道如何使用三元运算符来完成它.作为奖励,如果要使用3个或更多这样的bool值(真值表中没有特定的模式)怎么办?

Dav*_*aim 6

const int num = a ? (b? 2 : 3) : (b? 4: 5);
Run Code Online (Sandbox Code Playgroud)

编辑:

作为奖励,如果使用3个或更多这样的bool值怎么办?

我根本不会使用这样的语法.我会把我的桌子宣布为

int truthTable[2][2]..[2] = {{..},...{..}}
Run Code Online (Sandbox Code Playgroud)

现在简单地说:
int res = truthTable[!true][!false]..[!true]

!true将成为0,!false将成为1,然后,正确的值将从阵列中拉出.


nhg*_*rif 6

David Haim的答案非常适合真值表中的许多其他值.然而,在这个特定的例子中,我们可以利用以下容易识别的数学关系:

const int num = (a ? 2 : 4) + (b ? 0 : 1);
Run Code Online (Sandbox Code Playgroud)

但是,我们在真值表中可能并不总是具有这种易于识别的关系.


上面的表达式基于问题的原始真值表,如下所示:

              b
  a      true   false
true      2      3
false     4      5
Run Code Online (Sandbox Code Playgroud)

鉴于此真值表:

b真假2 2 4 4 2

还有另一种方法可以为这个返回正确的值:

const int num (a == b) ? 2 : 4
Run Code Online (Sandbox Code Playgroud)

这个并不是真正的数学.它只是简单地认识到我们想要的时间a和时间b是相同的2,但是当我们想要的时候ab不同时4.这个真值表与==运算符的真值表完全相同,我们只是返回2/ 4而不是true/ false.