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

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

本文关键字:运算符 三元 一行      更新时间:2023-10-16

考虑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声明以使用三元运算符实现这一点?我知道如何使用lambda函数将这样的num声明为const,并在lambda函数中嵌套if语句或switch语句,但我只想知道如何使用三元运算符。作为奖励,如果要使用3个或更多这样的布尔值(在真值表中没有特定的模式),该怎么办?

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

编辑:

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

我根本不会使用这样的语法。我会把我的桌子申报为

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

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

!true将变为0!false将变为1,然后,将从数组中提取正确的值。

David Haim的答案对于真值表中的许多其他值来说都很好。然而,在这个特定的实例中,我们可以使用一个易于识别的数学关系:

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

然而,在真相表中,我们可能并不总是有这样一种容易识别的关系。


上面的表达式是基于问题的原始真值表,它看起来像这样:

              b
  a      true   false
true      2      3
false     4      5

给定这个真值表:

b真的假的真2 4错误的4 2

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

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

这不是真正的数学。这只是简单地认识到,当ab相同时,我们想要2,但当ab不同时,我们需要4。这个真值表与==运算符的真值表完全相同,我们只是返回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;