C语言, 最后一步,当n是3的时候,k是2,那么先遇到的default,它先于case2,所以先走

C语言,
最后一步,当n是3的时候,k是2,那么先遇到的default,它先于case2,所以先走它,那么n=0;k=1
又因为没有break,所以继续下边的走,那么n是2,k是0,最后输出232
但答案怎么是235呢,是忽略了default么

C是编译语言而不是解释语言,先后问题不全是按照源代码的书写顺序进行的。在switch语句中,无论default写在“体”中的哪个地方,编译时编译器都要先编译case语句,最后才编译default语句。结果是执行时在“体”中找不到匹配的 case时才执行default选项!追问

嗯 好 同样的道理 这题选哪个呢

追答

选D。

追问

是呀 看见default了,在前边 其他的case不是就屏蔽了么

不是跟这题一个道理么

追答

C的语法有很多细节,得搞清楚哟!因为v4++;后面没有break;,所以把v1++、v2++、v3++都编译到default之下了……你可以试试:把default: v4++;放在v1++;后面,那结果肯定是v1=0!若在原来位置的v4++;后加一条break;,那v1、v2、v3就都是0……

追问

对呀 我就是觉得看见default在最前边,那就先执行它

追答

找不到匹配的了不执行default执行谁?

追问

因为switch中default在前,且没有break中断,所以后面的case X等于没有冒号前的部分只有冒号后的部分,等同于
default:v4++;v1++;v2++;v3++;
因此这4个数都执行了8次加1操作

default的含义,意思就是,不论switch的中的变量值是多少都匹配,都执行这个分支
所以无论switch中的变量值是多少,都会先执行default分支,然后由于没有break,将逐个执行后面的每个分支直至遇到break或反大括号

所以我还是依旧没转过来,认为default在前,多少都会匹配,第2道题如此,进行8次加1操作,那第1道题亦然啊,当k为2的时候,它是顺序执行的,先遇到的default,那么就先执行default分支,因为后边无break,那么再继续执行后边的语句,直至遇到break终止呀

我说的不对么?

追答

不对。switch的执行过程比较复杂:

    无论default写在哪里,都先检查case语句,当有匹配时则执行case后的语句直到遇到一个break或switch的最后一个}跳出。

    当找不到匹配的case时才执行default:后的语句,同样直到遇到一个break或switch的最后一个}跳出。

其实你这样理解就好了:把default当作case看待,只是它后面的“匹配值”不是所有case后面的“匹配值”就行了。这样理解就消除了default写在不同位置时的纠结。比如这个题,你在case 3: v3++;后再写一句case 49: ;,就会得到所有的值都是4。因为字符串里有4个'1',所以与case 49:匹配4次而不会执行default了,尽管它还是写在前面。

追问

啊。。。。之前的思维已经根深蒂固了。。。。你要是不把default先执行的话,如果找匹配的话,答案肯定出不来4个8

那就先找匹配,即使default在最前边,case在最后边,能匹配的话,还是先找case,跟顺序无关的

那个是字符型的 而匹配的case是int型的,自然匹配不上哦

追答

怎么就不是4个8?给你说了那么多一点都不开窍?
第一次进入:因为s[0]=='1'=49而!=1,也!=2,!=3,所以3个case都无法执行,只能执行default后面的语句v4++;、v1++;、v2++;、v3++;,使它们都为1。
第二次进入:因为s[1]=='2'=50而!=1,也!=2,!=3,所以3个case都无法执行,只能执行default后面的语句v4++;、v1++;、v2++;、v3++;,使它们都为2。
……
这种情况一直待续到k=7,这不使v4、v1、v2、v3都为8了吗?让你在v3++;后加一句case 49: ;验证一下到底是先执行case还是先执行default你琢磨了吗?

追问

我知道我哪里错了,就是把那个字符数组里的char型的字符和case里的int型的数找匹配了,这样错的!

当在最后,case49: ;的时候,因为1的ASCII码是49,所以当这个字符串出现1的时候,那么那些变量都不累加,总共是8个字符,其中4个1字符都是1,那么v1,v2,v3,v4都是4

追答

OK!

温馨提示:答案为网友推荐,仅供参考
相似回答