总结:把++
和比较看成是原语操作,不可分割。当不符合循环条件时,就结束这个原语操作。不同情况区别于是先++再比较,还是先比较再++。
int[] nums = new int[]{0, 1, 2, 3, 4}
int a; //用于debug时知道`nums[i]`的值
int i=0; // 每次case,都初始化为0
case1:
while ((a = nums[i++]) < 2);
运算规则:先比较,再++;不管是否跳出,最后都++
(就是说,++
操作独立于while
结构体)
过程:
// i=0; nums[0] ?> 2; i+1; num[1] ?> 2; i+1; num[2] ?> 2, no; i+1;
具体如下:
从i=0
开始,先判断nums[i]
是否小于2,然后判断,以此类推,
直到发现nums[2]
比2大,跳出循环。
此时,i
依然+1
。
结果:i=3
,已经跳过了一个下标
case2:
while ((a = nums[++i]) < 2);
运算规则:先++
,再比较;因此每次比较前就做++
操作,不符合循环条件,就不再执行下一次的操作。
过程:
i=0; i+1; nums[1] ?> 2; i+1; nums[2] ?> 2, no;
具体如下:
从i=0
开始,先做++
,i
变为1;然后判断nums[i]
是否小于2,以此类推
直到发现nums[2]
比2大,跳出循环。
此时,下标i
正好停在不符合条件的数的下标上
结果:i=2
,但是注意,从i=0
开始,由于先++
,所以错过了第0个元素的比较
case3:
while ((a = nums[i]) < 2){
i++;
}
i=2
package Test;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
sumSum();
}
public static void sumSum() {
/**
* 1、while(++i)是先执行i+1,再进行判断,再执行循环体;
* 2、while(i++)是先判断,再执行循环体,再+1
* 循环结束后:while(++i)执行完后,i=0; while(i++)执行完后,i=1;
*/
int[] nums = new int[]{0, 1, 2, 3, 4};
System.out.println(Arrays.toString(nums));
/**
* i=0; nums[0] ?> 2; i+1; num[1] ?> 2; i+1; num[2] ?> 2, no; i+1;
*/
int a;
int i = 0;
while ((a = nums[i++]) < 2) {
System.out.println("i=" + i + ",a=" + a);
}
System.out.println(i);
/**
* i=0; i+1; nums[1] ?> 2; i+1; nums[2] ?> 2, no;
*/
i = 0;
while ((a = nums[++i]) < 2) {
System.out.println("i=" + i + ",a=" + a);
}
System.out.println(i);
/**
* i=0; nums[0] ?> 2; i+1; num[1] ?> 2; i+1; num[2] ?> 2, no;
*/
i = 0;
while ((a = nums[i]) < 2) {
i++;
System.out.println("i=" + i + ",a=" + a);
}
System.out.println(i);
System.out.println();
int j = 4;
while ((a = nums[j--]) > 2) {
System.out.println("j=" + j + ",a=" + a);
}
System.out.println(j);
j = 4;
while ((a = nums[--j]) > 2) {
System.out.println("j=" + j + ",a=" + a);
}
System.out.println(j);
j = 4;
while ((a = nums[j]) > 2) {
j--;
System.out.println("j=" + j + ",a=" + a);
}
System.out.println(j);
}
}
#include
int main() {
int nums[] = {0, 1, 2, 3, 4};
int i = 0;
while (nums[i++] < 2) {
printf("i%d\n", i);
}
printf("%d\n",i);
i = 0;
while (nums[++i] < 2) {
printf("i%d\n", i);
}
printf("%d\n",i);
i = 0;
while (nums[i] < 2) {
i++;
printf("i%d\n", i);
}
printf("%d\n",i);
}