注册 登录
编程论坛 C++教室

高手帮忙解释一下这个简单的程序.

one_june 发布于 2010-03-24 10:33, 925 次点击
#include<stdio.h>
int main()
{
    int i;
    for(i=0;i<3;i++)
    switch(i)
    {
        case '0': printf("%d",i);
        case '2': printf("%d",i);
        default:printf("%d",i);
    }
}

这个程序我用TC2.0  C-Free4.1  code::blocks 运行结果都是  012
而书上的答案却是 000122  麻烦高手给解释一下这个switch是怎么循环的  谢谢...


[ 本帖最后由 one_june 于 2010-3-24 10:35 编辑 ]
11 回复
#2
apull2010-03-24 11:07
如果没有break,所以会一直执行下一个case,直到遇到break或者退出。。
这里结果应就是012
case '0' 和 case '2' 都是字符类型,因此每次都执行的是default,所以输出是012
要是改成case 0 和 case 2,结果就是000122。

这是书上的错误。。
#3
xichong2010-03-24 11:11
楼上正解!
#4
one_june2010-03-24 11:23
回复 2楼 apull
我明白了,非常感谢你的回答...
#5
雪色朝阳2010-03-24 17:17
要在case语句后加break,否则程序会一直运行下去!
#include<stdio.h>
int main()
{
    int i;
    for(i=0;i<3;i++)
    switch(i)
    {
        case 0: printf("%d",i);break;
        case 2: printf("%d",i);break;
        default:printf("%d",i);
    }
}

这样运行的结果才是012
#6
月光3212010-03-25 15:20
在前两个case语句后加 “break;”即可
#7
风行2010-03-26 04:49
没有break;
#8
胡马平2010-03-26 10:03
一楼对啊!
#9
vincentfon2010-03-26 10:14
以下是引用apull在2010-3-24 11:07:12的发言:

如果没有break,所以会一直执行下一个case,直到遇到break或者退出。。
这里结果应就是012
case '0' 和 case '2' 都是字符类型,因此每次都执行的是default,所以输出是012
要是改成case 0 和 case 2,结果就是00012 ...
不错不错。
#10
Cmoniker2010-03-27 12:25
我觉得这里主要 case的是数字1 2   不是字符  所以不要加‘’号     否则就不清楚 要干什么了
#11
hyb85552010-03-30 18:17
我是一个新手,所以试着从新手的角度来理解程序,希望这样“笨拙”的思路对同样是新手的人有所帮助,愿大家共同进步。如果理解有误,希望高手给与指正。谢谢大家!~
#include<stdio.h>
int main()
{
    int i;
    for(i=0;i<3;i++)
    switch(i)
    {
        case 0: printf("%d",i);
        case 2: printf("%d",i);
        default:printf("%d",i);
    }
}

如果不加 break,每次switch中会从第一个满足条件的语句执行到它后面的每一条printf语句,而不去管case的条件是否满足了。所以上面程序输出的会是000122.具体解释如下:i=0时,第一个满足条件的语句是case 0: printf("%d",i); ,并且case 2: printf("%d",i);  
                                                  default:printf("%d",i);也会由于没break而顺序执行。i值为0,故输出000. 当在进入for循环时,i值自增为1,switch中第一条满足条件的是只有default:printf("%d",i);所以输出一个1。当再次进入for循环,i自增为2,第一个满足条件的语句是case 2: printf("%d",i);  
                                                  并且default:printf("%d",i);也会由于没break而顺序执行。所以这两句执行结果是输出22,最后结果为000122.

#include<stdio.h>
int main()
{
    int i;
    for(i=0;i<3;i++)
    switch(i)
    {
        case 0: printf("%d",i);break;      
        case 2: printf("%d",i);break;   
        default:printf("%d",i);
    }
}
上面的程序由于加了break,当第一次执行for循环时,i=0,进入switch中,case 0满足条件,执行printf("%d",i);输出0,再执行break;退出switch,不再执行下面两句。当for执行i=1时,case 0,case 2都不满足条件,只有执行最后一句 default:printf("%d",i); 输出1,由于执行的是switch中的最后一句,执行完自行退出switch。再次执行for循环,i自增到2,进入switch中,case 2满足条件,执行printf("%d",i);输出2,再执行break;退出switch,不再执行下面一句,退出switch,i自增到3时,退出for循环。程序至此输出结果 0 1 2 。



#12
hyb85552010-03-30 18:18
回复 楼主 one_june
我是一个新手,所以试着从新手的角度来理解程序,希望这样“笨拙”的思路对同样是新手的人有所帮助,愿大家共同进步。如果理解有误,希望高手给与指正。谢谢大家!~
#include<stdio.h>
int main()
{
    int i;
    for(i=0;i<3;i++)
    switch(i)
    {
        case 0: printf("%d",i);
        case 2: printf("%d",i);
        default:printf("%d",i);
    }
}

如果不加 break,每次switch中会从第一个满足条件的语句执行到它后面的每一条printf语句,而不去管case的条件是否满足了。所以上面程序输出的会是000122.具体解释如下:i=0时,第一个满足条件的语句是case 0: printf("%d",i); ,并且case 2: printf("%d",i);  
                                                  default:printf("%d",i);也会由于没break而顺序执行。i值为0,故输出000. 当在进入for循环时,i值自增为1,switch中第一条满足条件的是只有default:printf("%d",i);所以输出一个1。当再次进入for循环,i自增为2,第一个满足条件的语句是case 2: printf("%d",i);  
                                                  并且default:printf("%d",i);也会由于没break而顺序执行。所以这两句执行结果是输出22,最后结果为000122.

#include<stdio.h>
int main()
{
    int i;
    for(i=0;i<3;i++)
    switch(i)
    {
        case 0: printf("%d",i);break;      
        case 2: printf("%d",i);break;   
        default:printf("%d",i);
    }
}
上面的程序由于加了break,当第一次执行for循环时,i=0,进入switch中,case 0满足条件,执行printf("%d",i);输出0,再执行break;退出switch,不再执行下面两句。当for执行i=1时,case 0,case 2都不满足条件,只有执行最后一句 default:printf("%d",i); 输出1,由于执行的是switch中的最后一句,执行完自行退出switch。再次执行for循环,i自增到2,进入switch中,case 2满足条件,执行printf("%d",i);输出2,再执行break;退出switch,不再执行下面一句,退出switch,i自增到3时,退出for循环。程序至此输出结果 0 1 2 。
1