如何在一行中使用三元运算符来做到这一点?

How to do this with the ternary operator in one line?

考虑 int num:

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

我想要的是 const int num 遵循这个事实 table(我很抱歉已经从我原来的问题中编辑以反映我程序中的模式):

              b
  a      true   false
true      2      4
false     4      2

如何修改上述 const int num 声明以使用三元运算符实现此目的?我知道如何使用 lambda 函数和嵌套的 if 语句或 lambda 函数中的 switch 语句将这样的 num 声明为 const,但我只是想知道如何使用三元运算符来做到这一点。作为奖励,如果要使用 3 个或更多这样的布尔值(实际上没有特定模式 table)怎么办?

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

编辑:

As a bonus, what if 3 or more such bool values were to be used?

我根本不会使用这样的语法。 我会将我的 table 声明为

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

现在只需:
int res = truthTable[!true][!false]..[!true]

!true 会变成 0 , !false 会变成 1 , 然后从数组中取出正确的值

David Haim 的回答对于许多其他真实价值来说都很好 table。然而,在这个 具体 实例中,我们可以利用一个易于识别的数学关系:

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

虽然我们可能并不总是在真相中拥有如此容易识别的关系table。


以上表达式是基于问题的原始真相table,看起来像这样:

              b
  a      true   false
true      2      3
false     4      5

鉴于这个事实table:

b 真假 真 2 4 假 4 2

还有另一种方法我们可以 return 这个值的正确值:

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

这不是真正的数学。只是简单地认识到当ab相同时,我们想要2,但是当ab不同时,我们想要[=18] =].这个真理 table 与 == 运算符的真理 table 完全相同,我们只是 returning 2/4 true/false.

你可以这样写声明

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

在这种特殊情况下,我会选择:

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