考虑这个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值(真值表中没有特定的模式)怎么办?
答案 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
这个实际上不是任何数学。只是简单地认识到当a
和b
相同时,我们需要2
,但当a
和b
不同时,我们需要{{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;