前言
相信大家都知道并且使用过我们今天的主角——三目运算符? :,但是除了可以用它代替if... else...之外,他还有着更强大的 奇怪的功能,相信大家在leetcode刷题的时候也能不时地遇见他们。今天就来给大家总结下他的奇怪用法。如有错误,请在留言或私信中指出!感激不尽!
使用方法
代替if...else...
这是最基本的使用方法。
a?b:c当a的值为真时,返回b,当a的值为假时,返回c;
示例:
//完整可执行源码请看篇末
int a=0;
//if...else...语句
if(a)
cout<<("a为真\n");
else
cout<<("a为假\n");
//三目运算符代替if...else...语句
a?cout<<("a为真\n"):cout<<("a为假\n");
return 0;
在三目运算符中使用函数(指针)
三目运算符中可以使用函数,但是需要保证前后的返回值类型相同。
//完整可执行源码请看篇末
//三目运算符中使用函数,三目运算符的前后值类型要一致。(这里的int()可以随便一个整数代替
bool flag=true;
flag?Test1():int();
flag?Test():void();//也可以使用空变量
//函数指针。这行语句也可以写成这样:auto func=flag?&Test:nullptr;
void (*func)()=flag?&Test:nullptr;
//注意,对于函数指针来说,要提前判空才能去调用
if(func!=nullptr){
func();
}
//或者使用三目运算符写成以下这样
func?func():void();
逗号表达式
这是一种能够将你的代码压缩到一行的方法,在三目运算符中,逗号表达式内的最后一个值才会被返回,而前面的语句只会被执行。
//完整可执行源码请看篇末
//逗号表达式,逗号表达式仅最后的值有效,前面的单纯是执行而已。
flag?(Test1(),Test2(),NULL):NULL;
//逗号表达式中甚至可以赋值,用以下方式
flag?((res=10),Test1(),Test2(),NULL):NULL;
cout<<res<<endl;
完整源码
#include <iostream>
using namespace std;
void Test(){
cout<<"Test called\n";
}
int Test1(){
cout<<"Test1 called\n";
return 0;
}
int Test2(){
cout<<"Test2 called\n";
return 0;
}
int main(){
bool a=true;
int res =0;
//if...else...语句
if(a)
res = 1;
else
res = 2;
//三目运算符代替if...else...语句
res = a?1:2;
cout<<res<<endl;
//三目运算符中使用函数,三目运算符的前后值类型要一致。(这里的int()可以随便一个整数代替
bool flag=true;
flag?Test1():int();
flag?Test():void();//也可以使用空变量
//函数指针。这行语句也可以写成这样:auto func=flag?&Test:nullptr;
void (*func)()=flag?&Test:nullptr;
//注意,对于函数指针来说,要提前判空才能去调用
if(func!=nullptr){
func();
}
//或者使用三目运算符写成以下这样
func?func():void();
//逗号表达式,逗号表达式仅最后的值有效,前面的单纯是执行而已。
flag?(Test1(),Test2(),NULL):NULL;
//逗号表达式中甚至可以赋值,用以下方式
flag?((res=10),Test1(),Test2(),NULL):NULL;
cout<<res<<endl;
return 0;
}
(今天看见一张不错的图分享下,侵删。图源:https://twitter.com/miku_emori/status/1077144148694642688)
版权声明:本文为weixin_50632121原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
