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

时间:2015-06-28 14:28:11

标签: c++ operator-keyword ternary

考虑这个int num的const声明:

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语句或切换状态,但我只是想知道如何使用三元运算符来完成它。作为奖励,如果使用3个或更多这样的bool值(真值表中没有特定的模式)怎么办?

4 个答案:

答案 0 :(得分:6)

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,然后,正确的值将从数组中提取。

答案 1 :(得分: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     假4 2

我们可以通过另一种方式为这一个返回正确的值:

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

这个实际上不是任何数学。只是简单地认识到当ab相同时,我们需要2,但当ab不同时,我们需要{{1 }}。此真值表与4运算符的真值表完全相同,我们只是返回== / 2而不是4 / true

答案 2 :(得分: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

答案 3 :(得分:1)

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

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