在 C++ 中使用三元运算符代替 if-else
Use of ternary operator instead of if-else in C++
我刚看到以下(匿名的)C++ 代码:
auto my_flag = x > threshold;
my_flag ? do_this() : do_that();
这是标准的 C++ 习语而不是使用 if-else:
if (x > threshold)
{
do_this();
}
else
{
do_that();
}
尽管它只有两行,但我不得不回去重新阅读它以确保我知道它在做什么。
不,它不是 if-else
的标准替代品
但是是的,它运行得非常好。
例如我有这个示例 C++ 代码
#include <iostream>
using namespace std;
void test1(){
cout<< "test 1"<<endl;
}
void test2(){
cout<< "test 2"<<endl;
}
int main() {
1>2?test1():test2();
}
这是输出
test 2
这和这样做是一样的
#include <iostream>
using namespace std;
void test1(){
cout<< "test 1"<<endl;
}
void test2(){
cout<< "test 2"<<endl;
}
int main() {
if(1>2){
test1();
}else{
test2();
}
}
但是使用 if-else 块使它更容易阅读,即使它使它更长一些。
没有。通常,条件运算符不能替代 if-else
.
最显着的区别是条件运算符的最后两个操作数需要具有共同的类型。您的代码不适用于:
std::string do_this() {return {};}
void do_that() {}
会出现错误,因为 void
和 std::string
没有共同的类型:
<source>: In function 'int main()':
<source>:15:22: error: third operand to the conditional operator is of type 'void', but the second operand is neither a throw-expression nor of type 'void'
15 | my_flag ? do_this() : do_that();
| ~~~~~~~^~
此外,条件运算符通常可读性较差。
条件运算符可用于复杂的内联初始化。例如你不能写:
int x = 0;
int y = 0;
bool condition = true;
int& ref; // error: must initialize reference
if (condition) ref = x; else ref = y; // and even then, this wouldn't to the right thing
但你可以写
int& ref = condition ? x : y;
我的建议是,与 if-else
相比,不要使用条件运算符来节省一些击键次数。它并不总是等价的。
PS:该运算符称为“条件运算符”。术语“三元运算符”更通用,如一元或二元运算符。 C++恰好只有一个三元运算符(即条件运算符)。
它们确实大致相同。请注意,对于三元条件运算符,两个分支需要具有足够相关的类型,以便可以为整个表达式1 估算一个公共类型。如果您的用户定义类型带有带有副作用的转换运算符,您可以设计出三元条件运算符的行为,使其完全不同:
#include <iostream>
struct do_this
{
operator int() const
{
std::cout << "Pay me a bonus";
return 0;
}
};
struct do_that
{
operator int() const
{
std::cout << "Reformat my hard disk";
return 0;
}
};
int main()
{
true ? do_this() : do_that();
}
因此,如果不需要三元条件的结果,应该认为 if
块更清晰。
1参考:https://en.cppreference.com/w/cpp/language/operator_other
if-then和三元条件最大的区别在于意图:
- if-then: 根据条件
做
- 三元条件:return基于条件的东西
所以:
if (want_to_do_this) {
do_this();
} else {
do_that();
}
int result = want_to_get_this? get_this(): get_that();
int my_int_max(int i1, int i2) { return i1 > i2? i1: i2; }
我认为这是普遍预期的,但我在已经给出的答案中没有看到这一点。
我刚看到以下(匿名的)C++ 代码:
auto my_flag = x > threshold;
my_flag ? do_this() : do_that();
这是标准的 C++ 习语而不是使用 if-else:
if (x > threshold)
{
do_this();
}
else
{
do_that();
}
尽管它只有两行,但我不得不回去重新阅读它以确保我知道它在做什么。
不,它不是 if-else
的标准替代品但是是的,它运行得非常好。
例如我有这个示例 C++ 代码
#include <iostream>
using namespace std;
void test1(){
cout<< "test 1"<<endl;
}
void test2(){
cout<< "test 2"<<endl;
}
int main() {
1>2?test1():test2();
}
这是输出
test 2
这和这样做是一样的
#include <iostream>
using namespace std;
void test1(){
cout<< "test 1"<<endl;
}
void test2(){
cout<< "test 2"<<endl;
}
int main() {
if(1>2){
test1();
}else{
test2();
}
}
但是使用 if-else 块使它更容易阅读,即使它使它更长一些。
没有。通常,条件运算符不能替代 if-else
.
最显着的区别是条件运算符的最后两个操作数需要具有共同的类型。您的代码不适用于:
std::string do_this() {return {};}
void do_that() {}
会出现错误,因为 void
和 std::string
没有共同的类型:
<source>: In function 'int main()':
<source>:15:22: error: third operand to the conditional operator is of type 'void', but the second operand is neither a throw-expression nor of type 'void'
15 | my_flag ? do_this() : do_that();
| ~~~~~~~^~
此外,条件运算符通常可读性较差。
条件运算符可用于复杂的内联初始化。例如你不能写:
int x = 0;
int y = 0;
bool condition = true;
int& ref; // error: must initialize reference
if (condition) ref = x; else ref = y; // and even then, this wouldn't to the right thing
但你可以写
int& ref = condition ? x : y;
我的建议是,与 if-else
相比,不要使用条件运算符来节省一些击键次数。它并不总是等价的。
PS:该运算符称为“条件运算符”。术语“三元运算符”更通用,如一元或二元运算符。 C++恰好只有一个三元运算符(即条件运算符)。
它们确实大致相同。请注意,对于三元条件运算符,两个分支需要具有足够相关的类型,以便可以为整个表达式1 估算一个公共类型。如果您的用户定义类型带有带有副作用的转换运算符,您可以设计出三元条件运算符的行为,使其完全不同:
#include <iostream>
struct do_this
{
operator int() const
{
std::cout << "Pay me a bonus";
return 0;
}
};
struct do_that
{
operator int() const
{
std::cout << "Reformat my hard disk";
return 0;
}
};
int main()
{
true ? do_this() : do_that();
}
因此,如果不需要三元条件的结果,应该认为 if
块更清晰。
1参考:https://en.cppreference.com/w/cpp/language/operator_other
if-then和三元条件最大的区别在于意图:
- if-then: 根据条件 做
- 三元条件:return基于条件的东西
所以:
if (want_to_do_this) {
do_this();
} else {
do_that();
}
int result = want_to_get_this? get_this(): get_that();
int my_int_max(int i1, int i2) { return i1 > i2? i1: i2; }
我认为这是普遍预期的,但我在已经给出的答案中没有看到这一点。