2013-03-13 31 views
7

EDIT 1Co się stanie, jeśli usuniesz spację między operatorami + i ++?

ZASTRZEŻENIE: wiem, że+++nie jest to operator ale + i ++ operatorzy bez przestrzeni. Wiem też, że nie ma powodu, aby z tego korzystać; to pytanie jest tylko z ciekawości.


Tak, jestem zainteresowany, aby zobaczyć, czy jest wymagana przestrzeń między + i ++var w Javie.

Tu jest mój kodu testu:

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

ten wypisuje:

0 
1 

który pracuje jako Spodziewam się, tak jakby to była przestrzeń pomiędzy pierwszą i drugą +.

Następnie próbowałem go z łańcuchów znaków:

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

ten wypisuje:

s 2 

Ale jeśli trzecia linia jest komentarzem, kod nie kompiluje, z błędem:

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; 
        ^

Co powoduje różnicę w zachowaniu między konkatenacją ciągów a liczbą całkowitą ition?


EDIT 2

Jak omówiono w Abhijit's follow-up question, zasadę, że ludzie wspomnieli (im większa żeton ++ najpierw zostać przeanalizowany, zanim krótszy żeton ++) omówiono w this presentation gdzie wydaje się, nazywać się zasadą Munchy Munchy.

+1

I simmilary i = i +++++ I; jest NIEAKTYWNY, ale i = i ++ + ++ i; JEST. – Jayamohan

+0

Ponieważ nie jest to operator, pytanie, jak to działa, nie ma sensu. To nie jest prawdziwe pytanie. – EJP

+1

Pytanie uzupełniające [Czy '+++' jest tylko przyrostem post-fix, po którym następuje infiks (zawsze)?] (Http://stackoverflow.com/q/15382171/977038) – Abhijit

Odpowiedz

5

Kompilator generuje najdłuższe możliwe żetony podczas analizowania źródła, więc gdy napotka +++, to bierze ją jako ++ +.

Więc kod

a +++ b 

zawsze być taka sama jak

(a++) + b 
+1

+1 za podanie najdłuższej reguły tokena. – Morwenn

+0

+1 przy najdłuższej regule tokena. – chm

2

potrójne oraz nie jest sam operator jest dwóch operatorów kombinowany:

Co potrójne oraz acutually nie jest:

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

Co próbujesz zrobić, to ++ ciąg znaków, który jest niezdefiniowany.

Nigdy nie używaj +++ bez spacji w kodzie; prawie nikt nie będzie wiedział, co robi (bez konsultacji z siecią). Co więcej, po mniej więcej tygodniu nie będziesz wiedział, co właściwie robi sam.

13

Nie ma operatora +++. To, co tam masz, to operator Postfiks ++, po którym następuje operator infix +. Jest to błąd kompilacji, ponieważ Postfix ++ można zastosować tylko do zmiennej, a "s " nie jest zmienną.

Ponieważ naprawdę chodzi o operatora infix +, po którym następuje operator prefiksu ++, należy umieścić odstęp między operatorami.

Właściwie powinieneś zrobić to KAŻDY. +++ jest przestępstwem przeciwko czytelności !!!

1

+++ nie jest operatorem samodzielnie.

i = i +++i; powoduje Preinkrementacja wartości i, a następnie dodanie do wartości i i przechowywanie go w i.

Z ciągiem, + nie oznacza dodawania, więc próbujesz połączyć ciąg i liczbę całkowitą razem.