消息关闭
    暂无新消息!
#include<iostream>
const int strsize=20;
struct bop{
char fullname[strsize];
char title[strsize];
char bopname[strsize];
int preference;
};
int main()
{
using namespace std;
cout<<"Benevolent Order of Programmers Report\n"
<<"a. display by name b. display by title\n"
<<"c. display by bopname d. diplay by preference\n"
<<"q. quit\n";
char ch;
bop member[5]={
        {"Wimp Macho","English Teacher","DEMON",0},
        {"Raki Rhodes","Junior Programmer","BOOM",1},
        {"Celia Laiter","Super Star","MIPS",2},
        {"Hoppy Hipman","Analyst Trainee","WATEE",1},
        {"Pat Hand","Police","LOOPY",2}
    };
cout<<"Enter your choice: ";
while(cin>>ch&&ch!='q')
switch(ch)
{
case'a':
for(int i=0;i<5;i++)
{cout<<member[i].fullname<<endl;
break;}
case'b':
for(int i=0;i<5;i++)
{cout<<member[i].title<<endl;
break;}
case'c':
for(int i=0;i<5;i++)
{cout<<member[i].bopname<<endl;
break;}
case'd':
for(int i=0;i<5;i++)
{if(member[i].preference==0)
cout<<member[i].fullname<<endl;
else if(member[i].preference==1)
cout<<member[i].title<<endl;
else if(member[i].preference==2)
cout<<member[i].bopname<<endl;
break;}
}
system("pause");
return 0;
}

请教:在分支语句中的for循环,如果加上{}与去掉{}结果不一样是何原因?

7个回答

︿ 2
这个问题,只要搞懂{}和break的作用就明显了:
{}:有很多叫法,这里就叫它‘大括号’好了。大括号除了用在函数定义外,我通常用来隔离变量名的有效范围,例如:

void foo()
{ //函数定义
  int v1;
  { //此大括号范围内的变量名,在大括号外就不能访问了。
    int v2 = 1;
    v1 = v2;
  }
  //v1 = v2; //这里不能访问v2变量
  {
    int v2 = 2; //这里的v2和前面一个大括号内的v2同名,但并不冲突,因为有大括号进行隔离。
    v1 = v2;
  }
  assert(v1 == 2);
}


break:跳出循环或switch,注释中说明:

void foo()
{
  for(;;) //不用对此产生疑问,等效于while(1)
  {
    do();
    break; //跳出for循环
  }
  switch(c)
  {
    case 0:
      break; //跳出switch,不执行switch后续代码,比如case 1:
    case 1:
  }
  for(;;)
  {
    switch(c)
    {
    case 0:
      break; //跳出switch
    }
    break; //switch中的break出来后到这里,再跳出for循环
  }
}
︿ 1
当然是看作作用域了:
switch(ch) {
case 'a':
// 循环执行 1 次,继续走 'b' 的逻辑。
for(int i = 0; i < 5; i++)
{
cout << member[i].fullname << endl;
break;
}

case 'b':
// 循环执行 1 次,跳出 switch 的逻辑。
for(int i = 0; i < 5; i++)
{
cout << member[i].title << endl;
break;
}
break;

case 'c':
// 循环执行 5 次,跳出 switch 的逻辑。
for(int i = 0; i < 5; i++)
{
cout << member[i].bopname << endl;
}
break;

default:
break;
}
︿ 1
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
︿ 1
case'a':
            for(int i=0;i<5;i++)
            {cout<<member[i].fullname<<endl;
            break;}

这种写法应该不是你的本意,猜你应该是想写:

case'a':
            for(int i=0;i<5;i++)
            {cout<<member[i].fullname<<endl;}
            break;

在后面这种情况下,加上花括号与不加花括号结果应该是一样的。
︿ 1
测试代码:

#include <iostream>

using namespace std;

int main()
{
int a = 0;
switch(a)
{
case 0:
{
int b = 1;
a = b * b;
}
break;
default:
a = -1;
}
cout << a << endl;
    return 0;
}

编译结果:
1 中为不加 {}的编译提示
2 中为加{}提示

如果你能理解为什么 1 中编译错误,2 中正常,那就是你要找的原因了。
for(int i; i<10; i++) do(i);
 
等效于

int i;
for(i=0; i<10; i++)
  do(i);
︿ 1
for如果加上{} 会在{}里执行循环
去掉{} 默认循环范围是 一句话 就是  一行代码; 到第一分号