鱼C论坛

 找回密码
 立即注册
查看: 1674|回复: 3

[已解决]求助

[复制链接]
发表于 2021-10-24 23:04:33 | 显示全部楼层 |阅读模式
3鱼币
哪个大佬能给我解释一下这题是为什么?我运行出了结果但不知道原因
#include<stdio.h>

int main(void)
{
           int a = 1;
           int b = 2;
           int flag = 1;
           switch (flag)
           {
                      case 1 /* constant-expression */:
                               a+= printf("1234");
                               printf("\n");
                      case 2:
                               a+= printf("%d", printf("1234\n"));
                               printf("\n");
                      default:
                               a+= (a>b ? 1:2);
                               break;
           }
           printf("%d", a);
}
运行结果:1234
                1234
                5
                7
最佳答案
2021-10-24 23:04:34
本帖最后由 番杰 于 2021-10-25 14:22 编辑

从程序中的switch语句开始说:
(1)执行到switch语句,对flag进行判断,flag初始化为1,所以执行case 1:后的语句;

(2)执行a+ = printf(“1234”)这条语句;
   首先需要知道printf函数返回值是实际打印的字符数(不包含表示字符串结束的 '\0');
   所以这条语句就相当于:
printf("1234");  //1  2  3  4  四个字符,所以返回值为4(int类型)
a = a + 4 ;
   执行后:会在屏幕上打印出1234,并且此时的a的数值为1+4 = 5 ;

(3)接着执行printf("\n");这条语句没有什么好说的就是一个换行,使下次打印从下一行开始。

(4)而后会执行case 2中的  a+= printf("%d", printf("1234\n"));
(因为,在switch中程序会顺序执行,而在case 1 的代码后的没有break;所以程序会按顺序继续执行;)
  这条语句跟上面那条语句一样,只不过printf(“1234\n”)中多了一个‘\n’,'\n'相当于一个字符,
  所以这个printf的返回值为5,所以这条语句就可以拆分为:
printf("1234\n");
printf("%d",5);  //这个printf的返回值为1 ,因为只打印了一个数字5;
 a = a + 1; 
  执行后:打印出1234,换行,接着打印出5,此时的a = 5+1 = 6  ;

(5)printf("\n"),换行

(6)顺序执行至default:a+ = (a > b ? 1 : 2)
  等号后面的a > b ? 1 : 2是一个三目运算式:作用就是判断a是否大于b,若大于则为1;若小于则为2;
  而此时的a = 6;b = 2;
  a 妥妥的大于 b,所以该表达式值为1:
  所以,该语句想当于:
a = a + 1; //这个1就是三目运算式的结果。
  执行后:a  = 6 +1 =7;

(7)执行break语句,退出switch

(8)顺序执行:printf("%d", a);很简单,打印出a的值,
  此时a的值为7,所以就会打印出7.

最佳答案

查看完整内容

从程序中的switch语句开始说: (1)执行到switch语句,对flag进行判断,flag初始化为1,所以执行case 1:后的语句; (2)执行a+ = printf(“1234”)这条语句; 首先需要知道printf函数返回值是实际打印的字符数(不包含表示字符串结束的 '\0'); 所以这条语句就相当于: 执行后:会在屏幕上打印出1234,并且此时的a的数值为1+4 = 5 ; (3)接着执行printf("\n");这条语句没有什么好说的就是一个换行, ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-24 23:04:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 番杰 于 2021-10-25 14:22 编辑

从程序中的switch语句开始说:
(1)执行到switch语句,对flag进行判断,flag初始化为1,所以执行case 1:后的语句;

(2)执行a+ = printf(“1234”)这条语句;
   首先需要知道printf函数返回值是实际打印的字符数(不包含表示字符串结束的 '\0');
   所以这条语句就相当于:
printf("1234");  //1  2  3  4  四个字符,所以返回值为4(int类型)
a = a + 4 ;
   执行后:会在屏幕上打印出1234,并且此时的a的数值为1+4 = 5 ;

(3)接着执行printf("\n");这条语句没有什么好说的就是一个换行,使下次打印从下一行开始。

(4)而后会执行case 2中的  a+= printf("%d", printf("1234\n"));
(因为,在switch中程序会顺序执行,而在case 1 的代码后的没有break;所以程序会按顺序继续执行;)
  这条语句跟上面那条语句一样,只不过printf(“1234\n”)中多了一个‘\n’,'\n'相当于一个字符,
  所以这个printf的返回值为5,所以这条语句就可以拆分为:
printf("1234\n");
printf("%d",5);  //这个printf的返回值为1 ,因为只打印了一个数字5;
 a = a + 1; 
  执行后:打印出1234,换行,接着打印出5,此时的a = 5+1 = 6  ;

(5)printf("\n"),换行

(6)顺序执行至default:a+ = (a > b ? 1 : 2)
  等号后面的a > b ? 1 : 2是一个三目运算式:作用就是判断a是否大于b,若大于则为1;若小于则为2;
  而此时的a = 6;b = 2;
  a 妥妥的大于 b,所以该表达式值为1:
  所以,该语句想当于:
a = a + 1; //这个1就是三目运算式的结果。
  执行后:a  = 6 +1 =7;

(7)执行break语句,退出switch

(8)顺序执行:printf("%d", a);很简单,打印出a的值,
  此时a的值为7,所以就会打印出7.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-24 23:49:50 | 显示全部楼层
switch (x)根据x的内容来选择匹配的case,从该case开始执行,比如flage = 2时就会从这里开始执行
case 2:
                               a+= printf("%d", printf("1234\n"));
                               printf("\n");
          default:
                     a+= (a>b ? 1:2);
                    break;
一般来说,一个case语句后面就要接一个break,避免bug
比如你这个代码,它会先执行case 1 的语句块的代码,a+= printf("1234"); => 先打印1234 ,a+=4 = 5, 因为printf()这个函数室友返回值是,该值等于输出字符个数
然后就会跳到case 2: 在这句中
a+= printf("%d", printf("1234\n"));
先执行 printf("1234\n") 打印 1234 然后返回一个 5 即
a+= printf("%d", 5));
此时a += 1 = 6
最后执行default:
 a+= (a>b ? 1:2);
这句的意思等价于
if (a>b) 
        a = 1;
else
        a = 2;
所以就变成 a = 2 + 2 =4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-25 22:14:27 | 显示全部楼层
感谢番杰的答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表