最近在写一些C语言的单片机开发代码和项目。期间对于一些排序的算法有些分析,其中一些排序的算法涉及到一些一些数据的外层循环和内层循环,而C语言 for循环索引值在进行了逻辑判断互换后,当进入第二次循环时,我猜想很多新手程序员,不清楚是从新的数组索引开始,还是还是从原的数组索引开始?这应该是很多新手会遇到的一些问题。
我们考虑写这样的一个demo,来进行分析,希望对新手程序员有所帮助。
以下是一段c语言写的一个选择排序的算法:
#include<stdio.h>
int main(){
int i,j;
int a[10];
int iPos;
int iTemp;
printf("为数组元素赋值:\n");
//输入获得数组
for(i=0; i<10; i++){
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
//进行逻辑判断 从以上进行分析
for(i=0; i<9; i++){
iTemp = a[i];
iPos=i;
for(j=i+1; j<10; j++){ //内循环
if(a[j]<iTemp){
iTemp = a[j];
iPos = j;
}
}
a[iPos] = a[i];
a[i] = iTemp;
}
//输出结果
printf("输出结果如下:、\n");
for(i=0; i<10; i++){
printf("%d\t",a[i]);
if(i==4)
printf("\n");
}
printf("\n");
return 0;
}
我对这个逻辑判断的过程序进行了一个分析如下:
65 45 32 13 67 98 75 42 18 23
65 45 32 13 67
4+1
第一次循环逻辑判断
//进行逻辑判断 从以上进行分析
for(i=0; i<4; i++){ // i =0 i<4 i=0
iTemp = a[i]; // iTemp = a[0] iTemp = 65 i = 0
iPos=i; // iPos = 0; i =0 iTemp = 65 iPos = 0
for(j=i+1; j<5; j++){ //内循环 j=0+1 1<5 j =1 i =0 iTemp = 65 iPos = 0
if(a[j]<iTemp){ //如果 a[1]< 65 45<65成立继续 不成立退出
iTemp = a[j]; // iTemp = a[1] iTemp = 45; j =1 i =0 iPos = 0
iPos = j; // iPos = 1; j =1 i =0 iPos = 0
}
}
a[iPos] = a[i]; // a[1] = a[0] a[1]= 65
a[i] = iTemp; // a[0] = a[1] a[0] = 45
// i = 0 j=1
//65 45 32 13 67
//第一次 45 65 32 13 67
//第二次
}
第二次循环逻辑判断
//再次循环时 先执行i++ i=1 j=1
//进行逻辑判断 从以上进行分析
for(i=0; i<4; i++){ // i =1 1<4 i=1
iTemp = a[i]; // iTemp = a[1] iTemp =65 i = 1
iPos=i; // iPos = 1; i =1 iTemp = 65 iPos =1
for(j=i+1; j<5; j++){ //内循环 j=1+1 2<5 j =2 i =1 iTemp = 65 iPos = 1
if(a[j]<iTemp){ //如果 a[2]< 65 32<65成立继续 不成立退出
iTemp = a[j]; // iTemp = a[2] iTemp = 32; j =2 i =1 iPos = 1
iPos = j; // iPos = 2; j =2 i =1 iPos = 1
}
}
a[iPos] = a[i]; // a[2] = a[1] a[2]= 32
a[i] = iTemp; // a[1] = a[2] a[1] = 65
// i = 0 j=1
//65 45 32 13 67
//第一次 45 65 32 13 67
//第二次 45 32 65 13 67
}
第三次循环逻辑判断
//i =1 j =2 再次循环时 先执行i++ i=2 j=2
//进行逻辑判断 从以上进行分析
for(i=0; i<4; i++){ // i =2 2<4 i=2
iTemp = a[i]; // iTemp = a[2] iTemp =65 i = 2
iPos=i; // iPos = 2; i =2 iTemp = 65 iPos =2
for(j=i+1; j<5; j++){ //内循环 j=2+1 3<5 j =3 i =2 iTemp = 65 iPos = 2
if(a[j]<iTemp){ //如果 a[3]< 65 13<65 成立继续 不成立退出 j =3 i =2 iTemp = 65 iPos = 2
iTemp = a[j]; // iTemp = a[j] a[3] 13; j =3 i =2 iPos = 2
iPos = j; // j =3 i =2 iPos = 3
}
}
//内循环中,如果判断不成立,则再执行,外层for循环,
a[iPos] = a[i]; // a[3] = a[2] a[3]= 65
a[i] = iTemp; // a[2] = 13 a[2] = 13
// i = 0 j=1
//65 45 32 13 67
//第一次 45 65 32 13 67
//第二次 45 32 65 13 67
//第三次 45 32 13 65 67
//第四次
}
第四次循环逻辑判断
// j =3 i =2 iPos = 3 再次循环时 先执行i++ i=3 j=3
//进行逻辑判断 从以上进行分析
for(i=0; i<4; i++){ // i =3 3<4 i=3
iTemp = a[i]; // iTemp = a[3] iTemp =65 i = 3
iPos=i; // iPos = 3; i =3 iTemp = 65 iPos =3
for(j=i+1; j<5; j++){ //内循环 j=3+1 4<5 j =4 i =3 iTemp = 65 iPos = 3
if(a[j]<iTemp){ //如果 a[4]< 65 67<65 成立继续 不成立退出 j =3 i =2 iTemp = 65 iPos = 2
iTemp = a[j]; // iTemp = a[j] a[3] 13; j =3 i =2 iPos = 2
iPos = j; // j =3 i =2 iPos = 3
}
}
//内循环中,如果判断不成立,则再执行,外层for循环,
a[iPos] = a[i]; // a[3] = a[2] a[3]= 65
a[i] = iTemp; // a[2] = 13 a[2] = 13
// i = 0 j=1
//65 45 32 13 67
//第一次 45 65 32 13 67
//第二次 45 32 65 13 67
//第三次 45 32 13 65 67
}
通过以上的代码分析很清楚的会发现
for循环在互换索引值后,再次循环时是从新的数组索引开始。
在大多数编程语言中,包括Python,for循环遍历列表或数组时,通常是从第一个元素开始,而不是从索引开始。这是因为列表或数组的元素是通过它们的值来遍历的,而不是通过它们的索引。例如,在Python中,使用for循环遍历列表时,你不需要指定索引,因为循环会自动处理列表中的每个元素1。
如果你需要在循环中同时获取元素及其索引,你可以使用特定的语法来实现。例如,在Vue.js中,你可以使用v-for
指令来同时遍历数组的元素和索引。在这种情况下,你可以通过添加一个圆括号来同时获取元素和它的索引。但是,这并不会改变原始数组的索引顺序,你仍然是从原始的索引开始遍历2。
如果你对数组或列表进行了修改,比如互换了索引值,那么再次进行for循环时,你将从修改后的数组或列表开始遍历。这是因为for循环遍历的是当前状态的数据,而不是之前的数据状态。如果你在循环过程中修改了数据(例如,通过互换索引值),那么这些修改将影响后续的循环迭代3。
总的来说,for循环在遍历列表或数组时,默认是从第一个元素开始,而不是从索引开始。如果你需要同时处理元素和它们的索引,或者对列表进行修改后再次进行循环,你需要使用特定的语法或方法来实现这一点。