今天在写一个对数组操作的代码时,突然对for循环的执行方式产生了疑惑,以前在编程的时候只是对它只是使用而已,却没有对它的运行方式进行思考,仔细进行思考有助于对一些程序和算法的思考。
以下的代码为根据值去查询数组当中是否包含这个元素,如果包含就返回索引值,如果不包含该元素则返回-1(其中element是数组中有效元素的个数).
public int search(long value){
int i;
for(i = 0; i < this.element; i++) {
if(value == this.arr[i] ) {
break;
}
}
if(i == this.element) {
return -1;
} else {
return i;
}
}
通过以上的代码我们可以看出,在数组中没有这个值最终返回的i的值为element而不等于element-1,这是为什么呢?
下面就让我们一起来分析一下:
for(表达式1; 表达式2; 表达式3) {
表达式4;
}
第一次循环:首先回去执行表达式1对变量进行初始化,之后去执行表达式2进行判断,是否符合表达式2的条件,如果符合,去执行表达式4,执行完表达式4,去执行表达式3(一般是对变量的加减操作)。
第二次循环:首先判断表达式2是否成立,如果成立,则去执行表达式4,之后去执行表达式3,。
.
.一直这样执行下去
.
.
最后一次循环的前一次循环:
首先判断表达式2是否成立,如果成立,则去执行表达式4,之后去执行表达式3,。
最后一次循环:
首先判断表达式2是否成立,结果不成立,则退出循环,所以,for循环控制的变量的值最终一定是不符合表达式2的要求的,因为在最后一次循环的前一次循环已经对数据进行了操作(比如++或–),所以才之前的例子中,最后i的值为element。
总结:总的来说,执行顺序是一致的,先进行条件判断(表达式2),再执行函数体(表达式4),最后执行表达式3。如此往复,区别在于,条件判断的对象,在第一次判断时,是执行表达式1,初始化对象,后续的判断对象是执行后的结果(表达式3)。