求助
哪个大佬能给我解释一下这题是为什么?我运行出了结果但不知道原因#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-25 14:22 编辑
从程序中的switch语句开始说:
(1)执行到switch语句,对flag进行判断,flag初始化为1,所以执行case 1:后的语句;
(2)执行a+ = printf(“1234”)这条语句;
首先需要知道printf函数返回值是实际打印的字符数(不包含表示字符串结束的 '\0');
所以这条语句就相当于:
printf("1234");//1234四个字符,所以返回值为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 (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 感谢番杰的答案!
页:
[1]