2013-03-13 3 views
7

EDIT 1Что произойдет, если вы удалите пробел между операторами + и ++?

ОТКАЗ: Я знаю, что+++это на самом деле не оператор но + и ++ операторы без пространства. Я также знаю, что нет причин использовать это; этот вопрос просто из любопытства.


Итак, я заинтересован, чтобы увидеть, если пространство между + и ++var требуется в Java.

Вот мой тестовый код:

int i = 0; 
System.out.println(i); 
i = i +++i; 
System.out.println(i); 

Это печатает:

0 
1 

, который работает, как я ожидал бы, так же, как если бы пространство между первым и вторым +.

Затем я попробовал с конкатенации:

String s1 = "s " + ++i; 
System.out.println(s1); 
// String s2 = "s " +++i; 

Это печатает:

s 2 

Но если третья строка раскомментирована, код не компилируется с ошибкой:

Problem3.java:13: unexpected type 
required: variable 
found : value 
    String s2 = "s " +++i; 
       ^
Problem3.java:13: operator + cannot be applied to <any>,int 
    String s2 = "s " +++i; 
        ^

Что вызывает разницу в поведении между конкатенацией строк и целым числом ition?


РЕДАКТИРОВАТЬ 2

Как обсуждалось в Abhijit's follow-up question, правило, что люди уже упоминали (чем больше маркер ++ быть разобран сначала, перед тем короче маркер ++), обсуждается в this presentation где он появляется называться Munchy Munchy.

+1

И simmilary я = я +++++ I; НЕВОЗМОЖНО, но i = i ++ + ++ i; ЯВЛЯЕТСЯ. – Jayamohan

+0

Поскольку это не оператор, вопрос о том, как это работает, не имеет смысла. Не настоящий вопрос. – EJP

+1

Последующий вопрос [Является ли '+++' его просто пошаговым приращением, за которым следует инфикс (всегда)?] (Http://stackoverflow.com/q/15382171/977038) – Abhijit

ответ

5

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

Так код

a +++ b 

всегда будет такой же, как

(a++) + b 
+1

+1 для обозначения самого длинного правила токена. – Morwenn

+0

+1 для самого длинного правила токена. – chm

2

Тройной плюс не является сам оператор, то два оператора комбинированные:

Что тройной плюс acutually делает:

A +++ 1 == A ++ + 1;

Что вы пытаетесь сделать, это ++ строка, которая не определена.

Никогда не используйте +++ без пробелов в коде; вряд ли кто-нибудь будет знать, что он делает (без консультаций в Интернете). Более того, через неделю или около того вы не будете знать, что она на самом деле делает сама.

13

Нет +++ Оператор. У вас есть оператор postfix ++, а затем оператор infix +. Это ошибка компиляции, поскольку postfix ++ может применяться только к переменной, а "s " не является переменной.

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

Собственно, вы должны сделать это в любое время. +++ - преступление против удобочитаемости !!!

1

+++ не является оператором сам по себе.

i = i +++i; приводит к предварительно приращения значения i а, а затем добавить его к значению i и хранить его в i.

С помощью String + не означает сложение, поэтому вы пытаетесь объединить строку и целое число.