Постинкремент и преинкремент в выражениях Java - PullRequest
1 голос
/ 01 марта 2012

Что оценивает каждое выражение? Предположим, что х равен 2 перед каждым.

  • int num = x++ * 3;
    Так что это будет эквивалентно (2) * 3 или num = 6, а x теперь равно 3.

  • num *= x;
    число = 2 * 2 или 4

  • (x < 2) && (x > 1)
    Становится ЛОЖНЫМ, потому что (2 <2) = ложь и (2> 1) = истина, поэтому это ложно.

  • (++x < 2) || (x < 1)
    (3<2) ложно, а затем ((2+1)<1) также ложно, значит, ложно?
    В этом случае возникает один вопрос: применяется ли прединкремент к переменной перед разрывом? Второе значение х должно быть 3 или 2?
    У меня также есть тот же вопрос для postincrement. Допустим, у меня есть num=x++ *x++, где начальный х = 2. Так это 2 * 2 или 2 * 3?

Ответы [ 5 ]

1 голос
/ 01 марта 2012

int num = x++ * 3; => ОК: х = 3, число = 6
num *= x; => каково начальное значение num? если num = 2, то вы тоже в порядке.
(x < 2) && (x > 1) ложно, когда х = 2, ОК
(++x < 2) || (x < 1) ложно, когда x = 2, также хорошо

Я помню, что я смотрел на openJDK, особенно класс Lower в исходном коде javac, и ++ x переведен в x + = 1, поэтому вы можете видеть его как:
((x += 1)) < 2) который (без типа кастинга): ((x = (x + 1)) < 2). Второй тест будет иметь более новое значение x, т. Е. 3, потому что java оценивает условия слева направо.

1 голос
/ 01 марта 2012

Увеличивается перед «перерывом» да. По сути, это первое, что делает Java (круглые скобки все еще первые). Так что в (++ x <2) || (++ x <3) 2-й ++ x происходит после первого, если это не так. </p>

0 голосов
/ 01 марта 2012
  1. «Предположим, x равен 2 перед каждым». Это данное предположение или это предположение, которое вы делаете? Я не верю, что вы можете сделать это предположение. Я полагаю, что вы оценили все эти утверждения последовательно.
  2. Что такое расширенная форма a *= b?
  3. Каково начальное значение num, когда вы находитесь на втором утверждении?
  4. В вашем последнем утверждении, которое вы сделали правильно (при условии, что ваши начальные условия верны), вычислите (2+1) < 1, поскольку x было увеличено.

Следите за значениями x и num после каждого утверждения, и я думаю, вы получите правильный ответ.

Удачи!

0 голосов
/ 01 марта 2012
num *= x;
num =2*2 or 4

Я не знаю, откуда ты это взял.

num *= x; эквивалентно num = num * x;. Если бы num было 6 (из предыдущего оператора), то теперь было бы 12 (при условии, что x по-прежнему 2).

0 голосов
/ 01 марта 2012

Да, это очень простые понятия, сделайте себе одолжение.Загрузите unittest Framework, что-то вроде jUnit.Затем вы можете быстро выполнить все эти тесты с несколькими утверждениями, которые точно покажут вам, что происходит.Другой способ сделать это без особых накладных расходов - просто распечатать его на консоли.

int num = x++ * 3;
System.out.println( "num=" + num );  // num=6
...