zoukankan      html  css  js  c++  java
  • break,continue,return的区别

    1)break     直接跳出当前的循环,从当前循环外面开始执行,忽略循环体中任何其他语句和循环条件测试。他只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来跳出.

    2)continue     也是终止当前的循环过程,但他并不跳出循环,而是继续往下判断循环条件执行语句.他只能结束循环中的一次过程,但不能终止循环继续进行.    

    3)return 语句可被用来使 正在执行分支程序返回到调用它方法。(费解)

    详说return

      return表示中止当前函数的运行,并将操作权返回给调用者。   

      如果是在main函数中,表示将操作权返回给操作系统。    

        return不是必须要返回一个值。   

          void   func(void)   {   

           //代码块...;   return;   

          }   

        当然,就算不写return,在函数执行完毕后也会返回操作权给调用者。写return是一种清晰的风格,可以防止一些意外的错误。所以书上只说应该写,而不是必须写。 

        如果符合某个条件要退出的话,可以用return返回,否则可以不写这句代码的,当程序执行到“}”时会自动返回,这个问题其实你自己到机器上试一下就知道了。不过作为一个良好的编程习惯,每个函数都有返回语句倒是对的,这样更有可读性,并利于程序的维护~~~~

       return   指令一个是返回一个指定数据给主调函数, 

       另外的一个作用就是   结束   所在函数的执行   ...

      子函数中的运算是不能改变main()中已经定义的变量

        void add(int a, int b,int c){

          c=a+b;

        }

      main() //主方法入口,此处省略...

        {

          int a=1,b=2, c=0;

          add(a,b,c);

          print("/nc=%d/n", c);

        }

        你看看 最后结果还是c=0,因为计算机执行一个程序的时候 他只看到main()。他十分忠诚的 从main()的第一句 一直执行到最后一句 ,中间的那个 add()调用,这时main()函数被挂起 ,也就是停止运行 系统会把main()放在一块内存x中 ,这时 系统会把一片内存y划分给add()函数,也就是说 main()中的abc;和add()中的abc,并不是同一个东西,他们只是在数值上相等罢了。系统首先把a、b的值传给add,然后运行,c=3。然后系统没有发现add中有return,也就是 子函数做完了运算。并没把内存y中的结果送给main(),这时候 add运行结束。系统唤醒内存x中的main(),开始运行下一句 这时候 ,add函数做的一切 都是白干了,他并没有把他的结果上交给main()函数。所以c仍然是0;

        int add(int a, int b,int c){

          c=a+b;

          return c;

        }

        main(){

          int a=1, b=2, c=0;

          c=add(a,b);

          print("/nc=%d/n",c);

          /*还可以这样写*/

          print("/nc=%d/n",add(a,b));

        }

        想要通过子函数来改变main()中的东西,有两个方法:1 return ; 2 通过指针。因为Java毕竟很少用指针的说法,常见于C、C++、C#。故此处不做多的辩解

        测试追加案例:

        void test(Integer[] a){

          a[0] = 1;

          a[1] = 2;

        }

        main(...){

          Integer a[] = new Integer[3];

          test(a);

          print("a[0]="+a[0]+",a[1]="+a[1]);结果:a[0]=1,a[1]=2

        }

        可能有些朋友就疑惑了,我函数里面并没有返回,可是为什么值确改变了呢?与上面不同的是,我们知道在java中每一个对象都占用一个单独的内存(参考堆栈说明),

        上面的计算等后,实际给c另外分配了一个内存地址,而新的内存地址的值并未重新指向原内存地址,顾值不会产生任何改变,

        而当以数组或者集合入参的时候,可以通过测试发现,其内存地址并未有任何改变,只是改变了对应栈的值。

        案例:

    void test(List<Integer> acc,Integer a,Integer b,Integer[] c){
    acc.add(1);
    acc.add(2);
    acc.add(3);
    acc.add(4);
    System.out.println("计算中:acc->hash:"+System.identityHashCode(acc));
    System.out.println("计算中:a->hash:"+ System.identityHashCode(a));
    System.out.println("计算中:b->hash:"+ System.identityHashCode(b));
    a = a+b;
    System.out.println("计算中:c->hash:"+ System.identityHashCode(a));
    c[0] = 1;
    c[1] = 2;
    c[2] = 3;
    System.out.println("计算中:c->hash:"+ System.identityHashCode(c));
    }

    main(...){
      
    List<Integer> acc = new ArrayList<>();
    Integer a = 1;
    Integer b = 2;
    Integer c[] = new Integer[3];
    System.out.println("计算前:acc->hash:"+System.identityHashCode(acc));
    System.out.println("计算前:a->hash:"+ System.identityHashCode(a));
    System.out.println("计算前:b->hash:"+ System.identityHashCode(b));
    System.out.println("计算前:c->hash:"+ System.identityHashCode(c));
    System.out.println("---------------------------------");
    test(acc,a,b,c);
    System.out.println("---------------------------------");
    System.out.println("计算后:acc->hash:"+System.identityHashCode(acc));
    System.out.println("计算后:a->hash:"+ System.identityHashCode(a));
    System.out.println("计算后:b->hash:"+ System.identityHashCode(b));
    System.out.println("计算后:c->hash:"+ System.identityHashCode(c));

      
    }

     打印结果:

    计算前:acc->hash:868693306
    计算前:a->hash:1746572565
    计算前:b->hash:989110044
    计算前:c->hash:424058530
    ---------------------------------
    计算中:acc->hash:868693306
    计算中:a->hash:1746572565
    计算中:b->hash:989110044
    计算中:c->hash:321001045
    计算中:c->hash:424058530
    ---------------------------------
    计算后:acc->hash:868693306
    计算后:a->hash:1746572565
    计算后:b->hash:989110044
    计算后:c->hash:424058530

    仅供参考,如有错误,还请指点。

  • 相关阅读:
    2019年4月18日 查询功能 2
    bzoj3601
    bzoj2693
    bzoj2440
    bzoj3529
    bzoj2820
    BZOJ2813
    BZOJ4515
    AtCoder Grand Contest 001 题解
    BZOJ2757
  • 原文地址:https://www.cnblogs.com/it-xiaoBai/p/8080483.html
Copyright © 2011-2022 走看看