Имеет ли значение скобки в комбинации пост-декремента или приращения, подобных этой: x + = (x ++) + (++ x); - PullRequest
0 голосов
/ 16 марта 2019

Для следующей программы необходимо иметь квадратные скобки в выражении пост-инкремента или декремента

public class sample
{
  public void f1()
  {
    int x=4;
    x+=(x++)+(++x);
System.out.println(x);
  }
}

^^ Это равно

public class sample
{
  public void f1()
  {
    int x=4;
    x+= x++ + ++x;
System.out.println(x);
  }
}

Ответы [ 3 ]

1 голос
/ 16 марта 2019

Нет необходимости использовать скобки. Префикс и постфикс ++ имеют более высокий приоритет, чем +.

Однако необходимо использовать что-то для разделения операторов ++ и +. Если вы не разделяете их (с пробелами, комментариями или другими токенами), вы получаете довольно запутанную ошибку компиляции. Например:

Test.java:3: error: unexpected type
    int j = i +++++ i;
              ^
  required: variable
  found:    value
1 error

Вот что происходит:

  1. Лексический анализатор читает выше как int j = i ++ ++ + i ;. Это является следствием JLS 3.2 :

    "На каждом шаге используется максимально длинный перевод, даже если результат в конечном итоге не дает правильной программы, в отличие от другого лексического перевода."

  2. Принимая во внимание приоритет, синтаксический анализатор анализирует выражение как:

                 +
                / \
              ++   i
              /
            ++
            /
           i
    

    , где ++ - оператор приращения постфикса. Это эквивалентно ((i++)++) + i.

  3. Анализатор обнаруживает, что постфикс ++ применяется к результату i++, который является значением. Это незаконно. Операнд ++ должен быть переменной, а не значением.

    Как JLS 15.14.2 говорит:

    "Результатом [операнда] должна быть переменная типа, которая может быть преобразована в числовой тип, иначе произойдет ошибка времени компиляции."


А если серьезно, не пишите такой код. Это просто сбивает с толку ... и не нужно.

0 голосов
/ 16 марта 2019

Вы не должны писать такой код. Я не могу думать ни о каком использовании этого, и это сбивает с толку читателя.

Ответ можно легко найти, написав тестовый код, но это не имеет значения.

0 голосов
/ 16 марта 2019

Скобки не нужны, но вам нужно отделить + s.

Java использует максимальный munch при разборе. Это означает, что он потребляет как можно больше текста для создания токенов.

Так, например,

+++++

анализируется как

++ ++ +

и это не имеет смысла (результат постинкремента не является l-значением ), поэтому компилятор выдает диагностику.

При ++ + ++ применяются обычные правила группировки (неформально, приоритет оператора), поэтому все выражение сгруппировано так, как оно было в первом представленном вами фрагменте.

...