如何在一行中使用三元运算符来做到这一点?
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
这不是真正的数学。只是简单地认识到当a
和b
相同时,我们想要2
,但是当a
和b
不同时,我们想要[=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;
考虑 int num
:
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
这不是真正的数学。只是简单地认识到当a
和b
相同时,我们想要2
,但是当a
和b
不同时,我们想要[=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;