关于switch的一个问题

CoolEgos 2011-12-13 11:03:06
#include <stdio.h>
int main()
{
int n='c';
switch(n++)
{
default:printf("error");break;
case'a':case'A':case'b':case'B':printf("good");break;
case'c':case'C':printf("pass");
case'd':case'D':printf("warn");
}
return 0;
}//结果是passwarn为什么不是pass??switch(n++)这个 n++执行后面时不是d了吗?还是a?解释下
...全文
273 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamnobody 2011-12-14
  • 打赏
  • 举报
回复
}//结果是passwarn为什么不是pass??switch(n++)这个 n++执行后面时不是d了吗?还是a?解释下


有两个地方你需要理解:

1.n++与++n是不同的,(n++)的值是是n自增前的值(++n)的值是自增后的值。。switch(n++);传给switch的是n之前的值 ,所以跳到d:
2.如果case 语句后面没有接break;,那么就会一直执行下去,直到遇到break;或到switch结束。
Gloveing 2011-12-14
  • 打赏
  • 举报
回复
#include <stdio.h>
int main()
{
int n='c';
switch(char(n++))
{
default:
printf("error\n");break;
case'a':
case'A':case'b':case'B':
printf("good\n");break;
case'c':
case'C':
printf("pass\n");break;
case'd':
case'D':
printf("warn\n");break;
}
return 0;
}
msrend 2011-12-14
  • 打赏
  • 举报
回复
二楼正解
菜鸟1v1 2011-12-14
  • 打赏
  • 举报
回复
没有break;就会继续往下一个case执行
feidaosh 2011-12-14
  • 打赏
  • 举报
回复
少了个break.
jiutianc 2011-12-14
  • 打赏
  • 举报
回复
+[Quote=引用 10 楼 conpgy 的回复:]

switch(n++): 首先 ++ 产生 n 的一份拷贝;然后在使 n 的值加 1;然后switch 与他的拷贝执行操作。还有一个例子:char ch = 'a'; char *cp = &ch; *cp++ 执行的步骤为:(1)++操作符长生cp的一份拷贝;(2)然后++操作符增加cp的值;(3)最后,在cp的拷贝上执行间接访问操作。
[/Quote]
绿野耕夫 2011-12-14
  • 打赏
  • 举报
回复
第一,n++是先先用后加(它实际的执行过程是,先把n拷贝一份出来,然后将n加1,你实际用的时候用的是拷贝值),switch的时候还是原来的值,因此执行case'c';
第二,case语句会一直执行(case实际相当于是一个入口,如果满足入口,那就从这里进去,但是并没有限制必须要从这里出来,而break相当于是出口,执行到这里就跳出去),直到遇到break,因此执行了printf("pass");和printf("warn");
mtj520 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 conpgy 的回复:]
switch(n++): 首先 ++ 产生 n 的一份拷贝;然后在使 n 的值加 1;然后switch 与他的拷贝执行操作。还有一个例子:char ch = 'a'; char *cp = &ch; *cp++ 执行的步骤为:(1)++操作符长生cp的一份拷贝;(2)然后++操作符增加cp的值;(3)最后,在cp的拷贝上执行间接访问操作。
[/Quote]
解释得很清楚了!
无着无依 2011-12-14
  • 打赏
  • 举报
回复
switch(n++): 首先 ++ 产生 n 的一份拷贝;然后在使 n 的值加 1;然后switch 与他的拷贝执行操作。还有一个例子:char ch = 'a'; char *cp = &ch; *cp++ 执行的步骤为:(1)++操作符长生cp的一份拷贝;(2)然后++操作符增加cp的值;(3)最后,在cp的拷贝上执行间接访问操作。
自信男孩 2011-12-14
  • 打赏
  • 举报
回复
n++表达式,++是后缀,所以先求表达式的值然后n自身自增1,;所以输出"pass",然而后面没有break;不跳出switch,所以它会自动向下执行。同样也输出了"warn".
你的default选项最好放在最后,这样也容易理解。
鲤鱼 2011-12-14
  • 打赏
  • 举报
回复
结果是passwarn为什么不是pass??
因为缺少了break;switch语句会从进入口一直执行到break,会结束

switch(n++)这个 n++执行后面时不是d了吗?还是a?解释下
n++是先代入值,再自加,所以switch(n++)相当于switch(n);n=n+1;
txzsp 2011-12-14
  • 打赏
  • 举报
回复
很简单的C语言的switch贯穿效果,解决方法是增加break语句。
一鸣惊人 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sw1024 的回复:]
case'c':case'C'后面缺少break分支
n++的话,是先取出N值来使用,这样进入switch的值仍然为‘c’
[/Quote]
+
sw1024 2011-12-13
  • 打赏
  • 举报
回复
int i=3;
i++;=========这儿执行完拉++了
printf("%d\n",i);
//i=4;
难道这两个我弄混了啊

你可以改成这样试试
int i=3;
printf("%d\n",i++);
//i=3;
CoolEgos 2011-12-13
  • 打赏
  • 举报
回复
int i=3;
i++;
printf("%d\n",i);
//i=4;
难道这两个我弄混了啊
sw1024 2011-12-13
  • 打赏
  • 举报
回复
case'c':case'C'后面缺少break分支
n++的话,是先取出N值来使用,这样进入switch的值仍然为‘c’

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧