C语言中三元运算符的嵌套细节说明

楔子

2021-1-18,天气晴
        呼姆!今天又是个好天气,我久违的早起一次去外面吃早餐,因为疫情的原因,我最喜欢的那家兰州拉面至今仍是歇业状态,内心感到有点可惜,胡乱的在街上买了点吃的之后就回家了。(嗯,不错,又是流水账一样的的记录,但还是会坚持写的,感觉不写点什么,心里就空落落的,每天看着屏幕上不断跳动着的代码,就感觉好空虚,于是我总会幻想着,如果又一天,我写的代码变成了卡哇伊的女孩子出现在我面前,然后温柔的对我说,欧尼酱:你能帮人家改BUG吗?…Stop,别想多了,你还得写代码,为了美好的明天,冲吧,代码人)。

三元运算符的细节说明

三元运算符书写规范: 表达式1?表达式2:表达式3

三元运算符的简单说明:如果表达式1结果为true,那么就会执行表达式2,如果为false,则执行表达式3,下面写一段代码案例:

#include <stdio.h>
void main() {
	int x = 10;
	int y = 5;
	int d = x > y ? printf("aaa") : printf("bbb");
	printf("\n");
	getchar();
}

运行如下:
在这里插入图片描述
推论: 由上面的代码我们可以看出,三元运算符是一个类似if语句的表达式;


**三元运算符嵌套:**当多个三元运算嵌套在一起时,会发生什么呢?我们写一段代码来进行分析(以下分析较长,如果您想直接看推论结果请往下滑动):

#include <stdio.h>
void main() {
	int x = 10;
	int y = 5;
	int c = x < y ? x++ : 1 ? x--:y--;
	printf("x=%d,y=%d",x,y);
	getchar();

**分析:**通过分析代码可以知道,在三元表达式x<y ? x++ : 1 ? x-- : y–中,x<y结果为0,故执行?后面的表达式【1】,1默认为true,故执行x–,所以我们最终得到的结果为x=9,y=5,运行如下:
在这里插入图片描述
上面的代码充分的体现了三元运算的概念,接下来,我们来个不一样的,我们对上面的代码进行简单的改进:

#include <stdio.h>
void main() {
	int x = 10;
	int y = 5;
	int c = x > y ? x++ : 1 ? x--:y--;
	printf("x=%d,y=%d",x,y);
	getchar();
}

分析: 在上面的代码中,我们只是相对之前的代码将x<y改写成了x>y罢了,但这时结果就完全不一样了,我们按照之前的推论对它进行分析:x>y,结果为非0,也就是true,执行?前面的语句x++,x++=11,(任何非0的数都表示true),故执行第二个三元运算?前面的表达式x–,按照这种猜想结果应该为x=10,y=5;我们运行一下代码,如下:
在这里插入图片描述
运行的结果为:x=11,y=5,这和我们猜想的结果不一样,那么,这是为什么呢?我们来对比一二两个例子,从他们的不同点进行分析:

  1. 例1:int c = x < y ? x++ : 1 ? x–:y–;
  2. 例2:int c = x > y ? x++ : 1 ? x–:y–;

推论: 之前我们说过,他们主要的不同就在于第一个三元表达式不同,也就是x<y和x>y,下面我们分别对他们进行分析:

  • 例1: 因为x<y不成立,所以为false,接着它就按**“真一假二”**进行了第二个三元运算,最后执行了x–;
  • 例2:因为x>y成立,所以为true,接着,它同样按照一真二假进行了?后面的表达式的执行,但是,我们发现,它并没有执行第二个三元运算,这是为什么呢?

大致推论: 综合以上来看,他们唯一的区别在于第一个判断的表达式的值不同,分别为true和false,当表达式的结果为true时,没有进行第二次三元运算,而是按真一假二执行完?后面的表达式执行后就结束了;当表达式的结果为false时,在执行完真一假二的表达式后,进行了第二次三元运算,于是,我们可以大胆的猜测一下:在多个三元嵌套运算中,如果任意一个三元运算的结果为true,则在执行完其?后的表达式后就停止执行,即不会再执行其他的三元运算了,如果一直到最后,所有的三元运算的前面的判断条件都为false,则会执行所有的三元运算?后面的语句


**验证:**实践才算检验真理的唯一标准,我们来测试一下:

#include <stdio.h>
void main() {
	int x = 10;
	int y = 5;
	int c = x < y ? 4 < 3 : 4 > 3 ? printf("aaa") : 0 < 5 ? printf("aaa") : printf("bbb");
	printf("\n");
	printf("x=%d,y=%d",x,y);
	getchar();
}

观察以上代码,根据我们推论出来的结论进行分析:x<y不成立,执行?后面的语句后仍会执行第二个三元运算,因为x<y为false,所以执行4>3,结果为true,执行printf(“aaa”),我们知道,在c语言中,所有的非0都表示true,如果说,我们的推论是正确的话,那么第三个三元运算的输出语句就不会打印,反之则会打印,并表示我们之前的推论是错误的(好家伙,突然有点慌了。。。)

运行结果:
在这里插入图片描述
从运行结果可以看到:和我们推论的结果是一模一样的,那就证明了我的猜想是正确的。


总结


三元运算(又称三目运算)中,按照真一假二的方式进行【?】后面的语句执行,在嵌套三元运算中,从左往右开始执行,如果一直没有【?】前面的表达式为true的,那么就会一直往右执行,直到其中一个表达式为true,才会停下来。如果第一个三元运算的表达式就为true,那么其后面的所有的三元运算都不会再执行。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值