• (java和c) while循环与++i和i++


    (java和c) while循环与++i和i++

    概括

    总结:把++和比较看成是原语操作,不可分割。当不符合循环条件时,就结束这个原语操作。不同情况区别于是先++再比较,还是先比较再++。


    int[] nums = new int[]{0, 1, 2, 3, 4}
    int a; //用于debug时知道`nums[i]`的值
    int i=0; // 每次case,都初始化为0
    
    • 1
    • 2
    • 3
    • case1:

      while ((a = nums[i++]) < 2); 
      
      • 1
      • 运算规则:先比较,再++;不管是否跳出,最后都++(就是说,++操作独立于while结构体)

      • 过程:

        // i=0; nums[0] ?> 2; i+1; num[1] ?> 2; i+1; num[2] ?> 2, no; i+1;
        
        • 1
      • 具体如下:

        i=0开始,先判断nums[i]是否小于2,然后判断,以此类推,

        直到发现nums[2]比2大,跳出循环

        此时,i依然+1

      • 结果:i=3已经跳过了一个下标

    • case2:

      while ((a = nums[++i]) < 2); 
      
      • 1
      • 运算规则:先++,再比较;因此每次比较前就做++操作,不符合循环条件,就不再执行下一次的操作。

      • 过程:

        i=0; i+1; nums[1] ?> 2; i+1; nums[2] ?> 2, no;
        
        • 1
      • 具体如下:

        i=0开始,先做++i变为1;然后判断nums[i]是否小于2,以此类推

        直到发现nums[2]比2大,跳出循环。

        此时,下标i正好停在不符合条件的数的下标上

      • 结果:i=2但是注意,从i=0开始,由于先++,所以错过了第0个元素的比较

    • case3:

      while ((a = nums[i]) < 2){
          i++;
      }
      
      • 1
      • 2
      • 3
      • 运算规则:正常跑就是了
      • 结果:i=2
      • 推荐使用,要比较的元素没有漏,坐标也不会加1,思路也不绕

    调试代码

    java code

    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);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    C code

    #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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    工厂模式:简化对象创建的设计思想 (设计模式 四)
    开源AI智能名片小程序在私域流量运营中的“及时法则”深度应用与策略探讨
    幻核退出 “数字藏品有何用”阶段性无解
    鸿蒙HarmonyOS应用开发初体验
    Hololens2代码控制手部网格、手部关节、手部射线、性能面板的显示状态
    【字符串】特殊的二进制序列 递归+排序
    【C++】类和对象(一):什么是面向对象,访问限定符有哪些,类定义细节,结构体和类的关系。
    java+python+nodejs+vue+php留守儿童帮扶网站
    【论文精读】TransE 及其实现
    报错:图片验证码接口对接vue+springboot(下一个笔记会记录整个验证码的代码)
  • 原文地址:https://blog.csdn.net/qq_37774098/article/details/127656519