0%

C语言 唯一的三元操作符

C语言唯一的三元操作符

如果有两个变量,我希望打印出最大的一个,怎么做呢,很简单一个if-else语句搞定,嗯嗯,👍。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*beginner/ternary/ternary1.c*/
#include <stdio.h>

int main()
{
int a = 5;
int b = 7;
if (a > b)
printf("Bigger is %d\n", a);
else
printf("Bigger is %d\n", b);

return 0;
}

今天来一个比较搞定的三元操作符,前面有提过什么事三元操作符,参考逻辑运算符原文,简单的理解就是:a?b:c,如果a为真就返回b,如果a为假就返回c。

所以rst = a?b:cif-else来表达就是:

1
2
3
4
if (a)
rst = b;
else
rst = c;

所以上面的程序可以简化为:

1
2
3
4
5
6
7
8
9
10
11
12
/*beginner/ternary/ternary2.c*/
#include <stdio.h>

int main()
{
int a = 5;
int b = 7;

printf("Bigger is %d\n", a > b ? a : b);

return 0;
}

看到没有,奇迹就是用1行能写出4行的效果。

或许你会说用python可以1行写出c语言10行甚至100的功能,这个我承认,所以下一阶段开讲Python

或许你问了,有了if-else还要这个干吗,简单,我们可以做很多事情,比如在宏定义里面定义下面的一行

1
#define MAX(a,b) a>b?a:b

后面直接调用MAX就可以得出最大值了,不过这个写法目前看来OK,如果严谨说起来是有bug的,且听下回分解。

另外一个比较有用的例子如下,我觉得很适合英语国家,在我们中国不存在这个问题,就是如果你有一个叔叔和几个叔叔的表达方式不一样:

  • 中文:我有一个叔叔,我有N个叔叔(N>1)
  • 英文:我有一个uncle,我有N个uncles(N>1)

看到没有,有好几个叔叔就要加个s,这个怎么来办呢,有了三元操作符,解决方案如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*beginner/ternary/ternary3.c*/
#include <stdio.h>

int main()
{
int n1 = 1;
int n3 = 3;

printf("I have %d uncle%s\n", n1, n1==1 ? "" : "s");
printf("I have %d uncle%s\n", n3, n3==1 ? "" : "s");

return 0;
}

编译

编译也有所不同,方法为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#beginner/ternary/Makefile
ALL : ternary1 ternary2 ternary3

ternary1: ternary1.c
gcc -o ternary1 ternary1.c

ternary2: ternary2.c
gcc -o ternary2 ternary2.c

ternary3: ternary3.c
gcc -o ternary3 ternary3.c

.PHONY : clean

clean:
rm -f ternary1 ternary2 ternary3

这会产生可执行程序,当程序被执行时,它会产生下列结果:

1
2
3
4
5
6
7
8
9
$ ./ternary1
Bigger is 7

$ ./ternary2
Bigger is 7

$ ./ternary3
I have 1 uncle
I have 3 uncles
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道