2014-02-20 2 views
0

У меня были вопросы об инкрементальных и декрементальных операторах. Я не мог понять, почему java дал эти результаты.Операторы приращения и сокращения в java

x = 5; y = 10; 
    System.out.println(z = y *= x++); // output is 50 
    x = 2; y = 3; z = 4; 
    System.out.println("Result = "+ z + y++ * x); // output is Result = 46 
    x = 5; 
    System.out.println(x++*x); // output is 30 
    x = 5; 
    System.out.println(x*x++); // output is 25 

Например, во 2-й функции у Println является multiplicated без увеличения 1 и в 3-й функции х multiplicated с х + 1. Поскольку я знаю, что унарные приращения и унарные декременты имеют более высокий приоритет, чем арифметические операторы, то почему вторая вычисляется без увеличения 1 (y ++ * x = 3 * 2 = 6 и почему нет (y + 1) * x = 8?

+0

Вы путали приоритет оператора с * порядком оценки *. –

+0

Если встречается только приоритет, то зачем беспокоиться о наличии 'y ++' и '++ y'? :) – elnigno

+0

Для второй строки, если вы впоследствии будете использовать переменную y в строке, y получит значение «4». Это не имеет никакого отношения к арифметическому порядку операторов, где * имеет приоритет над +. оператор preincrement немедленно использует значение incremented, а оператор postincrement увеличивает значение после выполнения операции. –

ответ

1
x = 5; y = 10; 
    System.out.println(z = y *= x++); // output is 50 -->z=y=y*x i.e, z=y=10*5 (now, after evaluation of the expression, x is incremented to 6) 
    x = 2; y = 3; z = 4; 
    System.out.println("Result = "+ z + y++ * x); // output is Result = 46 --> from Right to left . y++ * x happens first..So, 3 * 2 = 6 (now, y will be incremented to 4) then "Result = " +z (String) + number (y++ * z) will be concatenated as Strings. 
    x = 5; 
    System.out.println(x++*x); // output is 30 --> 5 * (5+1 i.e, x is already incremented to 6 when you do x++ so its like 5 *6) 
    x = 5; 
    System.out.println(x*x++); // output is 25 -- > 5 * 5 (x will be incremented now) 
0

postfix- ++ средства, переменная оценивается в его текущее значение и после того, как окружающая выражение было оценено, переменная увеличивается на единицу.

0

у ++ добавляет 1 к у после кода. ++, у добавит 1 к y до кода.

5

Что-то нужно понимать:

T оператор post-increment (++ после имени переменной) возвращает значение старого значения переменной и затем увеличивает эту переменную. Таким образом, если x - 5, тогда выражение x++ оценивает по методу 5 и имеет побочный эффект, который задан как x, так и 6.

Это один немного особенным:

x = 2; y = 3; z = 4; 
System.out.println("Result = "+ z + y++ * x); // output is Result = 46 

Обратите внимание, что конкатенация используется здесь. Он печатает Result =, затем 4, который является значением z, затем значение y++ * x, которое составляет 6. 46 - это не один номер, это 4 и 6, наложенные друг на друга, исходящие из двух выражений.

+0

Спасибо за ваш комментарий. Я понял в основном. –

0

У них более высокий приоритет, чем бинарные операторы, но они оцениваются как «x». Побочный эффект пост-приращения не является частью приоритета.

0

Потому что с y++y сначала будет оцениваться, а затем увеличивается.

Вместо этого с ++y приращения происходят до оценки.

0

Ваше первое выражение z = y *= x++ равно это:

z=y=y*x; 
x++; 

Ваше второе выражение + z + y++ * x эквивалентно следующему:

z + ""+ (y*x) // here z = 4 and y*x is 6 which gives us 46. 

И точно так же вы можете узнать, 3-го и 4-го выражения.

0

Я предлагаю читать этот учебник, я думаю, будет пролить некоторый свет на использование ->Java operators.

Давайте его на куски:

x = 5; y = 10; 
System.out.println(z = y *= x++); 

в коде выше у вас есть назначение в г для результат y * = x ++; это означает, что y = y * x ++. Теперь x ++ будет оцениваться после завершения умножения. Если вы хотите, чтобы это произошло раньше, вы должны использовать ++ x.

x = 2; y = 3; z = 4; 
System.out.println("Result = "+ z + y++ * x); // output is Result = 46 

В этом случае вы объединяете строку со значениями выше; умножение будет первым, после этого добавление и только в конце оценивается приращение.

Остальные примеры аналогичны приведенным выше. Приоритет оператора - это правило, которое применяется выше, и вы можете использовать эту таблицу для просмотра порядка, в котором они оцениваются: Operator Precedence

Смежные вопросы