某通信公司switch笔试题
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");
}
这个运行结果是,请给出原因,不要告诉我用VS运行(已运行过)
[最优解释]
弱弱的问一句,不用执行default后面的printf("error");的吗
[其他解释]
是passwarn,因为你后面没有了break;
另外,你的n初始为 'c'
当然执行一次后,n为'd'了,但这不影响结果!
毕竟,根据switch的特性,在【开始端直到完全结束或break结束】
[其他解释]
输出结果是passwarn
因为你的case后面没有加break,所以程序会顺序执行后面的语句
[其他解释]
这里就是passwarm,n的值传进来时是c,下面case又没有break语句,所以会输出下面的
[其他解释]
passwarn 在linux下编译执行
原因 case ‘c'后没有 break;
case ’d'继续执行
[其他解释]
"c" : 之后的顺序执行一次
passwarn
[其他解释]
其实很多人不是已经回答了么 ...
首先:你要考虑顺序执行,所以第一个default被直接滤过去了
其次:你要考虑n的初始值,所以从'c'开始查找输出,所以输出pass
最后:你要注意有没有break,没有?那么继续输出后面的,所以输出warn
------
你做个试验,在case 'c':case 'C':printf("pass");这一句后面简单的加一句printf("\n");
你会看到,结果变成:
pass
warn
而不是passwarn,这样做,你就能体会什么叫顺序执行 ...
[其他解释]
不过就是case语句的fall down而已.
[其他解释]
passwarnwarn
[其他解释]
一个冒号只算一个
[其他解释]
passwarnwarn,因为C把case语句当作真正意义的标号,相当于先查找标号,找到之后顺序执行。先找到case c:然后执行下面的语句,直到结束
[其他解释]
好像 挺简单的
[其他解释]
passdwarn
[其他解释]
怎么我觉得是warn的...
不是switch(n++)吗?
[其他解释]
先取n的值 再++
[其他解释]
为什么会有人居然会觉得是2次warn
[其他解释]
如果是++n 就按你说的了
ps:到底结果是passwarn还是passwarnwarn
我觉得是前者
[其他解释]
是n++,是先执行n,然后在++
[其他解释]
正确答案应该是passwarn,按switchcase的规则是这样。
可是这个default我受教了!default在前面和后面的结果也不一样,以前没注意过。。。
------其他解决方案--------------------
你有一个错误,你没有考虑顺序执行。
[其他解释]
这个需要什么解释
[其他解释]
答案这个,请大家不要说两个warn了,继续坐等大牛解释
[其他解释]
又没有循环 直接一次性输出 就考了个n++ 和switch
[其他解释]
确实多了一个warn,看到前面的顺手粘贴 复制了一下,分析应该是没错的。
[其他解释]
可是case‘C’的值不符合switch括号里的值
[其他解释]
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");
}
这个程序执行case 'c':case 'C':printf("pass");
那case‘c’执行然后case‘C’执行吗?
[其他解释]
看汇编代码.
[其他解释]
我怎么觉得也是warn啊
看看这个程序
#include <stdio.h>
int main(void)
{
int i=1;
while(i++<10)
{
printf("%d,",i);
}
return 0;
}
输出的就是2到10啊,这里也不输出1的
不应该是判断之后就是加1然后进入循环体吗?
[其他解释]
这个我知道啊,入口的时候n不是加1了吗
进入之后难道不是变成100吗?为什么还要执行99的时候的语句呢?
我设置成整型数之后结果就不是这样了
[其他解释]
楼主的程序没有循环 第一眼有时会看错
[其他解释]
该回复于2012-11-19 14:02:49被管理员删除
[其他解释]
我怎么觉得也是warn啊
看看这个程序
C/C++ code?
12345678910
#include <stdio.h> int main(void) { int i=1; while(i++<10) { printf("%d,",i); } return 0; }
输出的就是2到10啊,这里也不输出1的……[/quote]
i++,1<10,之后i+1=2了。所以输出是2吧!
------其他解决方案--------------------
switch(i++)
这个句子条件的时候输入进switch这个语句的是i,也就是case的i.
然后i才++.
而你举的例子,
for(i++)
printf(i);
这时候printf的i已经是++后的i了.
[其他解释]
新手巩固了~~
[其他解释]
没有break,要直接往后运行
[其他解释]
当然是一个warn啊,你的这句
case 'c':case 'C':printf("pass");
后面没有加break,所以就是一个warn啦。
[其他解释]
别误导人啊..就一个warn
[其他解释]
额,我这句话也误导人了.Passwarn.一个warn.
[其他解释]
呵呵呵 ...
[其他解释]
先取值 在switch结束后 再+1
[其他解释]
你上面的几位都解释的这么清楚了,还解释啥呢,真好笑
[其他解释]
这种坑爹的代码工作中谁写谁倒霉
[其他解释]
passwarn大家都说了
[其他解释]
答案就是passwarn;没有任何别的异议?
case 1:case 2: case 3: case 4: print("a");
j就是说switch接受到的1234中的任何一个,都会打印出a?
是这样吗?
[其他解释]
是passwarn,
[其他解释]
懂了
------其他解决方案--------------------
这个要解释啥。。
[其他解释]
如果是吧printf换成一个计算式的话,比如就是一个加法吧k=i;这时候k是等于i还是加了1之后的?
[其他解释]
那如果for里面不是输出的话,就是一个简单的运算表达式的话,那也是先用i然后再加1吗?
不过好像不是吧?
[其他解释]
这是C语言的多做之过(参见c专家编程),switch的fall through原则,关键是break。
一方面是没有break导致的顺序执行,另外就是没有default,会导致空指针之类的问题
[其他解释]
那上面那个题目并不难啦
[其他解释]
对的。注意在后边加break,如果没有break,会顺序执行后边的case。
[其他解释]
在VS里看了看,
switch(n) 和 switch(n++),结果是一样的,都是 passwarn, switch(n) 之后n是c,switch(n++)之后n是d。
switch(++n)的结果是warn,n是d,因为先++了。
[其他解释]
正确答案,首先第一这个是switch,不是while,我第一次看错了,所以只会执行一次,n++其实还是‘c’,故执行case 'c':;因为后面没有break,所以继续执行case 'd':;因此打印出来passwarn
[其他解释]
++
[其他解释]
我以前也曾有过这样的疑问,后来实验发现default 是否执行 和放的地方没有关系
[其他解释]
passwarn
switch,csae语句没有循环,只会运行一次。因为定义的是n='c',而n++是先运行在++.即进入switch语句的仍是c。故走case'c':输出pass,因没有break,仍会继续走case‘d’:即输出warn。然后就是程序结束啦。
[其他解释]
请问你截图的书叫什么名字?
[其他解释]
这语句写的真蛋疼啊,格式排好点,一目了然
[其他解释]
passwarnbogon
------其他解决方案--------------------
应该是pass wam 但 n的值是d
因为是n++ 程序运行一遍了 n的值才自加
[其他解释]
c专家编程
[其他解释]
输出结果为passwarn。
首先,n++是取n的值作为表达式的值,然后n自增1;而++n是n自增1,然后作为表达式的值。那么传递个switch的就是'c'。
其次,case 'c'和case'C'的执行语句之后没有break,那么程序会继续向下执行,直到switch结束。
[其他解释]
passwarn 因为case都没有break语句
[其他解释]
正解啊
[其他解释]
前者
[其他解释]
null