2013-07-24 3 views
8

Так как были так много оператора очередности вопросов в последнее время, я начал играть с некоторым кодом и придумал это:Приоритет операторов проблемы приводит к «ошибке: неожиданному типу»

int x = someNumber; 
int y = --x++; 

Это дает:

Error: unexpected type 

required: variable 
found: value 

Я пробовал это, потому что мне было интересно узнать, как java будет иметь дело с тем, что postfix имеет более высокий приоритет оператора, чем prefix. Похоже, что приведенное выше утверждение приведет к противоречию, которое, как я полагаю, обрабатывается этой ошибкой.

Мой вопрос два раза:

  1. Почему эта ошибка? Что это значит?
  2. Почему именно postfix имеют приоритет больше, чем prefix? Я уверен, что для этого есть веская причина, но я не смог ее найти. Возможно, это исправит неопределенное поведение, но это как-то вызовет больше проблем?

ответ

11

Причиной ошибки является то, что x++ производит значение, и вы не можете применить декремент оператор к значению, только к переменной. Например, если x = 41, x++ оценивается до 41, а не переменной x, а --(41) не имеет смысла.

Что касается того, почему постфикс имеет более высокий приоритет, чем префикс, я предполагаю, что он должен избегать двусмысленности с другими операторами при разборе. Например, компилятор может сообщить синтаксическую ошибку для x--x вместо того, чтобы разглашать ее как x-(-x).

+1

+1, хороший ответ. :) – PermGenError

+0

Отличный ответ. Спасибо. Я никогда не думал об этой возможности. Имеет смысл. –

4

попробовать

int y = 2++; 

вы получите ту же ошибку. Post/до оператора применяются на переменной не на некоторых number.Thats, почему вы получите ошибку

Error: unexpected type 

Потому что он ожидает переменная не некоторое число. Предположите, что ваш номер 3

int x = 3; 
int y = --x++; 

int y become 2++ after applying -- operator on java (as java operator works 
from left to right) 

Я не знаю, что именно вы пытаетесь задать во втором вопросе. Но возьмите сценарий

int y = -x---x; 

здесь также будет работать слева направо, который приходит к

(-x--)-(x) so answer will be -3 so dont get confused by postfix and prefix 
+0

Хороший ответ. Спасибо. –

2

x сам по себе переменный, он может быть изменен, поэтому вы можете сделать ++x или x++.

Но когда вы делаете --x++, тогда -- применяется к x++, который не поддается изменению, поскольку это значение, а не переменная.

+0

Хороший ответ. Спасибо. –

2

Технически какой-либо объект в выражении является либо «lval», либо «rval». «lval» - это «левое значение» (слева от x = y) и может быть присвоено. «rval» - это «правое значение» и не может быть назначено.Вы можете использовать «lval», для которого требуется «rval», но не наоборот. ++ и -- требуют «lvals».

«lval» может быть простым именем переменной или разыменованным указателем или выражением индексирования массива (и, вероятно, 2-3 других).

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