如何在一行中使用三元运算符
How to do this with the ternary operator in one line?
考虑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
这不是真正的数学。这只是简单地认识到,当a
和b
相同时,我们想要2
,但当a
和b
不同时,我们需要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;
相关文章:
- 三元运算符和 if constexpr
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 三元运算符在返回语句中给出意外的结果
- Boost Spirit x3 条件(三元)运算符解析器
- 递归中三元运算符的奇怪行为
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- 错误:三元运算符无法在对象中正常工作"cout"
- 是否允许三元运算符在C++中计算两个操作数?
- 有条件地选择带有 decltype() 和三元运算符的类型
- 三元运算符在C++中的意外行为
- 有没有办法将 for 循环结果返回到像三元运算符这样的函数中?
- 变量值,在三元运算符之后
- 是否可以在C++中使用三元运算符在 if 语句中选择比较运算符?
- c++中的增量和三元运算符优先级
- C++中三元运算符的意外行为
- 用于返回开关的三元运算符
- 替换模板元编程中的三元运算符
- 三元运算符 '?:' 在 4.9.0 之前的 GCC 版本中推断出不正确的类型?
- 在 std::map 上使用三元运算符和 std::更大的附加参数
- C++中的三元条件运算符问题