break的一个奇怪问题

来源:百度知道 编辑:UC知道 时间:2024/06/07 08:23:24
原来的程序是:
main()
{
int i,j,p,q,s,n,a[11]={127,3,6,28,54,68,87,105,162,18};
for(i=0;i<10;i++)
{ p=i;q=a[i];
for(j=i+1;j<10;j++)
if(q<a[j]) {p=j;q=a[j];}
if(p!=i)
{
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%d ",a[i]);
}
printf("\ninput number:\n");
scanf("%d",&n);
for(i=0;i<10;i++)
if(n>a[i])
{for(s=9;s>=i;s--) a[s+1]=a[s];
break;}
a[i]=n;
for(i=0;i<=10;i++)
printf("%d ",a[i]);
printf("\n");
}
但是把18句开始改成
for(i=0;i<10;i++)
{
if(n>a[i])
{for(s=9;s>=i;s--) a[s+1]=a[s];
break;}
a[i]=n;
}
for(i=0;i<=10;i++)
printf("%d ",a[i]);
printf("\n");
}
结果就完全不同了
但是这样改应该是没什么区别把都是跳出那条for语句吗???
那加了{}后不也是包含了if(n>a[i])
{for(s=9;s>=i;s--) a[s+1]=a[s];
break;}
a[i]=n;

for(i=0;i<10;i++)
{
if(n>a[i])
{for(s=9;s>=i;s--) a[s+1]=a[s];
break;}
a[i]=n;
}
重点在花括号{}里是否包含了a[i]=n;
如果你把上面的改成:
for(i=0;i<10;i++)
{
if(n>a[i])
{for(s=9;s>=i;s--) a[s+1]=a[s];
break;} }
a[i]=n;
那么就和你没改之前的结果一样!

原因是for的循环体:是下面的((一句及其包含的小体系))或者((是一个{}内的内容!))

原来的for 只包含条件语句(条件语句的{}里含两个语句):

for(i=0;i<10;i++)
if(n>a[i]) {
for(s=9;s>=i;s--) a[s+1]=a[s];
break;
}

for 不包含 a[i]=n;

把18句开始改成
for(i=0;i<10;i++)
{
if(n>a[i]) {for(s=9;s>=i;s--) a[s+1]=a[s];
break;}
a[i]=n;
}
多 了 a[i]=n; 情况就变了。

如果for循环不带{},则其作用范围只包含其下面的一句。
break的作用是跳出包含它的第一个循环体,如For,While等。