天地不仁_以_万物为刍狗
{int a[20]={1,2,3,4,5,-1,-2,-3,-4,-5,1,2,3,4,5,-1,-2,-3,-4,-5};
int i,m,n,f=0;
scanf("%d",&n);
for(i=0;i<20;i++)
if(a[i]==n){
f=1;
m=i;
//输出结果是4,14,而不是4,5----是因为当在控制台输入了4的时候,进入for循环,进行if判断,从数组a[20]中寻找符合 if(a[i] == n),即a[i] == 4的数组元素;从数组中可以看出,符合条件的数组元素有两个:分别为a[3]、a[13],当a[3] == 4满足if判断的时候,执行if语句内部的代码片段(此时的【 i == 3 ,n == 4 ,m == i == 3 】);【重点到了】:当i == 3执行完之后,此时for循环并没有结束条件(即 break跳出for循环),此时for循环继续向下执行,i == 3,i++之后为4,不满足判断条件,然后i++之后为5,还是不满足判断条件......直到a[13] == 4的时候,满足判断条件,然后执行if内部代码片段(重复一遍,此时的 m === 3!!!依旧是上一次i == 3的时候赋的值),当执行到m==i的时候,变量m重新赋值为i的当前值(即13),到了此处if语句的内部代码片段不会再执行,直到for循环结束。
//此时的 f == 1 , i == 19(因为for循环执行到最后) , m == 13(即第二次重新赋的值)
//结论:然后代码执行到下面的【printf("%d,%d\n", n,m+1);】语句 ,n == 4, m+1 =13+1==14
//要想最终的输出结果是4,5那么久应该在if语句执行了 m = i ,这个表达式之后让循环结束,那么此时的m保持的值就是第一次持有的值(【 i == 3 ,n == 4 ,m == i == 3 】)
break; //加上此句即可
}
if(f!=0)
//当if语句后面只有一行代码的时候 {} 可以省略,楼主这种写法没问题。但是从代码的可读性上来说,这种习惯不好,建议不要省略{}
printf("%d,%d\n", n,m+1);
else
printf(" %d not found !\n",n);
}
堇延未七
首先你的问题就有问题哦~ 如果想返回某个数字第一次出现的位置,那么4在已经定义的数组中第一次出现的位置为4,而不是5;程序结果输出的是数字最后一次出现的位置,因为在for循环中,并没有在第一次找到后break跳出循环,所以它会一直往下找。int main()
{
int a[20]={1,2,3,4,5,-1,-2,-3,-4,-5,1,2,3,4,5,-1,-2,-3,-4,-5};
int i,m,n,f=0;
scanf("%d",&n);
for(i=0;i<20;i++){
if(a[i]==n){
f=1;
m=i;
break;
}
}
if(f!=0)
printf("%d,%d\n",n,m+1);
else
printf(" %d not found !\n",n);
return 0;
}