C语言中三元运算符的嵌套细节说明 男娘i 2023-01-08 02:08 89阅读 0赞 ## 楔子 ## 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(); } 运行如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ3OTUzODU1_size_16_color_FFFFFF_t_70] **推论:** 由上面的代码我们可以看出,三元运算符是一个类似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,运行如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ3OTUzODU1_size_16_color_FFFFFF_t_70 1] 上面的代码充分的体现了三元运算的概念,接下来,我们来个不一样的,我们对上面的代码进行简单的改进: #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;我们运行一下代码,如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ3OTUzODU1_size_16_color_FFFFFF_t_70 2] 运行的结果为: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,如果说,我们的推论是正确的话,那么第三个三元运算的输出语句就不会打印,反之则会打印,并表示我们之前的推论是错误的(好家伙,突然有点慌了。。。) **运行结果:** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ3OTUzODU1_size_16_color_FFFFFF_t_70 3] 从运行结果可以看到:和我们推论的结果是一模一样的,那就证明了我的猜想是正确的。 -------------------- ## 总结 ## -------------------- 三元运算(又称三目运算)中,按照**真一假二**的方式进行【?】后面的语句执行,在嵌套三元运算中,从左往右开始执行,如果一直没有【?】前面的表达式为true的,那么就会一直往右执行,直到其中一个表达式为true,才会停下来。如果第一个三元运算的表达式就为true,那么其后面的所有的三元运算都不会再执行。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ3OTUzODU1_size_16_color_FFFFFF_t_70]: /images/20221119/050e35f56945443fa40e1558e3d2402d.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ3OTUzODU1_size_16_color_FFFFFF_t_70 1]: /images/20221119/8fb3b31097074e56b987cea9d6d9fd37.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ3OTUzODU1_size_16_color_FFFFFF_t_70 2]: /images/20221119/d8058a3617fa4bc4bfac49c0c2954572.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ3OTUzODU1_size_16_color_FFFFFF_t_70 3]: https://img-blog.csdnimg.cn/20210118155419710.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ3OTUzODU1,size_16,color_FFFFFF,t_70
还没有评论,来说两句吧...