背景介绍
在调试公司代码时,发现一个奇怪的问题,在用break退出for循环后,通过循环变量i、j的值访问数组中的内容,和实际想象中的值不一样,得到的值明显是错误的。
错误原因
经过仔细查看代码和调试,发现在试图退出双重for循环时只用了一个break。
要想退出双重for循环,只在内层break是不够的,这时外层for循环并没有退出,还会继续循环,导致使用i、j值访问数组的内容时,得到的值并不是break时的值。
示例代码
#include<stdio.h>
void main()
{
int i,j;
int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}};
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(arr[i][j] == 4)
{
break;
}
}
}
printf("i=%d, j=%d, arr[i][j]=%d\n", i, j, arr[i][j]);
}
这段代码的本来意图是,当在二维数组中找到志威值为4的元素时,就退出,然后打印出i、j的值,期望输出:
i=1, j=0, arr[i][j]=4
但是实际上输出的是:
i=3, j=3, arr[i][j]=4195968
解决方法
c语言中并没有退出双重for循环的语句,除非用goto语句。
这里我们可以加一个flag,当在内层for循环中找到4后标记flag,然后再外层for循环判断flag的值,若被标记,则也退出。