Почему это входит в бесконечный цикл? - PullRequest
490 голосов
/ 30 сентября 2010

У меня есть следующий код:

public class Tests {
    public static void main(String[] args) throws Exception {
        int x = 0;
        while(x<3) {
            x = x++;
            System.out.println(x);
        }
    }
}

Мы знаем, что он должен был написать только x++ или x=x+1, но в x = x++ он должен сначала приписать x себе, а затем увеличить его. Почему x продолжается с 0 в качестве значения?

- обновление

Вот байт-код:

public class Tests extends java.lang.Object{
public Tests();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[])   throws java.lang.Exception;
  Code:
   0:   iconst_0
   1:   istore_1
   2:   iload_1
   3:   iconst_3
   4:   if_icmpge   22
   7:   iload_1
   8:   iinc    1, 1
   11:  istore_1
   12:  getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   15:  iload_1
   16:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
   19:  goto    2
   22:  return

}

Я прочитаю инструкции , чтобы попытаться понять ...

Ответы [ 26 ]

0 голосов
/ 01 октября 2010

Это происходит потому, что пост увеличивается. Это означает, что переменная увеличивается после вычисления выражения.

int x = 9;
int y = x++;

x теперь равно 10, но y равно 9, значение x до его увеличения.

Подробнее см. Определение приращения поста .

0 голосов
/ 01 октября 2010

Выражение x++ оценивается как x.Часть ++ влияет на значение после оценки , а не после оператора .так что x = x++ эффективно переводится в

int y = x; // evaluation
x = x + 1; // increment part
x = y; // assignment
0 голосов
/ 01 октября 2010

Прежде чем увеличивать значение на единицу, значение присваивается переменной.

0 голосов
/ 01 октября 2010

Я думаю, потому что в Java ++ имеет более высокий приоритет, чем = (присваивание) ... Не так ли? Посмотрите на http://www.cs.uwf.edu/~eelsheik/cop2253/resources/op_precedence.html...

Точно так же, если вы пишете x = x + 1 ... + имеет более высокий приоритет, чем = (назначение)

0 голосов
/ 29 мая 2015

Проверьте код ниже,

    int x=0;
    int temp=x++;
    System.out.println("temp = "+temp);
    x = temp;
    System.out.println("x = "+x);

вывод будет,

temp = 0
x = 0

post increment означает увеличить значение и вернуть значение до увеличения . Вот почему значение temp равно 0. Так что, если temp = i и это в цикле (за исключением первой строки кода). как в вопросе !!!!

0 голосов
/ 30 сентября 2010
 x = x++; (increment is overriden by = )

из-за вышеприведенного утверждения x никогда не достигает 3;

...