for循环的增量给出不同的答案

时间:2018-07-26 06:26:17

标签: java

class Test {
    public static void main(String[] args) {
        for (int i= 1; i < 2; i++) {
            System.out.println(i);
            System.out.println(++i);

            int a = 1;
            System.out.println(a++);
            System.out.println(++a);
        }
    }
}

此处的输出为1,2和1,3。在我得到不同结果的两种情况下,我们都在进行后递增和前递增?

5 个答案:

答案 0 :(得分:3)

因为帖子增量发生在迭代的结尾。

因此,下面的代码:

for (int i= 1; i < 2; i++) {
        System.out.println(i);
        System.out.println(++i);

将像这样工作:

int i = 1;
System.out.println(i); // i is still 1
System.out.println(++i); // pre increment making i to 2 and then print
i++;
if(i<2) 
// iterate again

但是,在第二种情况下:

int a = 1;
  System.out.println(a++); // post increment first print 1 and then change a to 2
  System.out.println(++a); // pre increment a now changed to 3

答案 1 :(得分:1)

i++

循环定义中的i仅在每次迭代结束时发生。在执行i++之后,您再也不会打印i++的值了,因为循环是在第一次迭代之后终止的。

顺便说一句,如果System.out.println(i);println之前执行,您仍然会得到不同的输出(与最后两个2语句相比)-3,后跟 public static void showRouteOnMap(Context mContext, String lat, String lng) { Uri gmmIntentUri = Uri.parse("google.navigation:q=" + lat + "," + lng); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); mContext.startActivity(mapIntent); }

答案 2 :(得分:1)

general structure of a for loop(更准确地说是这种用于语句的基本类型)是:

for ([ForInit]; [Expression]; [ForUpdate]) Statement

等效的while循环为:

[ForInit];
while ([Expression]) {
  Statement;
  [ForUpdate];
}

换句话说,更新是在循环体之后执行的。

因此您的代码等效于:

// ForInit
int i = 1;
while (/* Expression */ i < 2) {
  // Statement
  System.out.println(i);
  System.out.println(++i);

  int a = 1;
  System.out.println(a++);
  System.out.println(++a);

  // ForUpdate
  i++;
}

希望这很容易看出为什么输出存在差异。

答案 3 :(得分:0)

在第一种情况下,不调用后递增。如果您了解for循环的工作原理,您将知道增量部分不会在第一次执行。初始化部分,这里int i = 1,并且条件检查-i <2被验证。仅在每次迭代之后才调用增量部分。

在第二种情况下,执行后递增操作,因此会产生值差。您应该更多地关注循环的基础。

答案 4 :(得分:0)

System.out.println(i);

我在这里没有增加。如果是这样,答案将是相同的:

   #set( $monkey.Map = {"banana" : "good", "roast beef" : "bad"}) ## Map

在通过循环完成之前不做任何事情。