楼主:
Ruid (这人生,烟花一场)
2018-06-21 17:47:07请问一下以下的问题
int a=4;
int b=10;
switch(a)
{
case 1:
cout<<"case 1"<<endl;
break;
case 2:
cout<<"case 2"<<endl;
break;
case 3:
cout<<"case 3"<<endl;
while(a<b)
case 4:
cout<<"case 4"<<endl;
{a+=5}
break;
case 5:
cout<<"case 5"<<endl;
default:
cout<<"default"<<endl;
break;
}
要请问的问题在于,a=4所以switch会到case 4:这个标签下执行
但却是一直在while无穷循环,在“c语法暨程式库标准辞典”这本书的第106页
有段说明“switch主体通常是case标签起始的区块陈述式,而且不会执行第一个
case标签之前的陈述式”
所以是从“case 4:”标签开始执行,那while判断式为什么会被执行到呢???
谢谢,麻烦各位了。
太厉害了真是奇葩 XDwhile无穷循环有没有输出什么
作者: jerryh001 2018-06-21 18:01:00
我猜啦 因为while后没分号 所以"下一个分号之前"是while的内容 所以就包含了 case4和cout case4两行
楼主:
Ruid (这人生,烟花一场)
2018-06-21 18:03:00是一直输出case 4这行
作者:
Yshuan (倚絃)
2018-06-21 18:14:00;
那就对啦 没有大括号的while只包含后面的cout而Case 4: 则被当成label处理a==4时 执行到switch (a) 相当于goto到Case 4:的位置跳进了while block就在里面出不来
楼主:
Ruid (这人生,烟花一场)
2018-06-21 18:52:00以goto来想可以了解,但书上说不会执行case之前的陈述式这点就不是很了解,因为while是在case 4之前应该不会执行先谢谢以上各位大大的解释了
楼主:
Ruid (这人生,烟花一场)
2018-06-21 19:25:00再请教一个问题,若是把cout<<"case 4<<endl;这行删除那{a+=5}这行的区块陈述式是属switch的还是while的,谢谢
作者: yvb 2018-06-21 19:27:00
把 while(a<b) 改成 while(cout<<"while"<<endl,a<b) 试试.labeled statements 就只是个让 goto 或 switch 跳到该处,你那本书的说明是它的说法, 原文标准应该没多做这样的解释.{a+=5} => {a+=5;} 你的while()后没大括号,只包含cout那一列.抱歉, 漏看 "...删除" 那一句. 该说同时属switch和while吧?
其实有搜寻到某网页 标题是不要用switch...case跳进循环中 示范的code是一个for loop 从第一个case尾巴拉到第三个case中间...其实这种笨的错误不是没机会发生尤其多人专案里面有人不分青红皂白乱删code的时候...
作者: yvb 2018-06-21 21:01:00
google: Duff's Device
作者:
LPH66 (-6.2598534e+18f)
2018-06-21 21:02:00一个这种性质滥用(O)的例子是 Duff's device
作者: yvb 2018-06-21 21:07:00
前几楼 M 大说的可能是 google: MSC20-C switch statement
楼主:
Ruid (这人生,烟花一场)
2018-06-22 06:35:00感谢以上各位大大的解释
作者:
cphe (魔鬼藏在垃圾筒里)
2018-06-22 10:28:00这例子实在是特例…一般正常写很难遇到~不过是不错的例子