2014-12-23 17 views
30

Vì vậy, tôi hy vọng điều này không để biên dịch, và nó không:Một cộng với cộng với hai biên dịch bất ngờ

// the two is inc'd, so reduces symbolically to println(int int) 
// which is a compile error 
System.out.println(1 ++ 2); 

Nhưng điều này không:

System.out.println(1 + + 2); // returns three 

gì cho? Không nên nó cũng không biên dịch?

Ngoài ra, câu hỏi này là rất khó khăn để tìm kiếm vì các nhà khai thác ..

+1

++ là toán tử tăng để trình biên dịch có thể mong đợi tên biến trước hoặc sau ++ – ryekayo

+12

Trong trường hợp thứ hai '+' là toán tử "cú pháp đường" (phản chiếu '-') không có gì toán hạng. –

+4

* "Ngoài ra, câu hỏi này rất khó tìm kiếm vì các toán tử .." * Tại sao không tìm kiếm 'toán tử Java'? Bạn sẽ nhận được một danh sách các toán tử và các toán tử này được liệt kê. – Radiodef

Trả lời

65

Java được giải thích 1 + + 2 làm việc như 1 cộng tích cực 2. Xem Unary operator section.

+7

Mặc dù không chi tiết như các câu trả lời đúng khác, nhưng câu trả lời này khá nhanh để phân tích và hiểu. – jabgibson

+8

Đôi khi, không cần phân tích chi tiết về đặc điểm kỹ thuật. Đôi khi, câu trả lời hay nhất là câu trả lời đơn giản nhất. :) –

41

Từ cầu kỹ thuật, trên Lexical Translations

Bản dịch dài nhất có thể được sử dụng tại mỗi bước, ngay cả khi kết quả cuối cùng không thực hiện một chương trình đúng trong khi người khác dịch từ vựng sẽ. Có một ngoại lệ: nếu từ vựng dịch xảy ra trong ngữ cảnh kiểu (§4.11) và luồng đầu vào có hai hoặc nhiều hơn> ký tự tiếp theo là ký tự không> , thì mỗi ký tự phải được dịch sang mã thông báo cho toán tử so sánh số>.

(Còn được gọi là maximal munch.)

Các ++ được hiểu như là một postfix increment operator mà không thể được áp dụng cho một số nguyên theo nghĩa đen, do đó các lỗi biên dịch.

Trong khi

1 + + 2 

mỗi nhân vật được giải thích riêng. 1 là một số nguyên theo nghĩa đen, +additive operator, +unary plus operator2 là một số nguyên theo nghĩa đen. Toàn bộ biểu thức tương đương với

1 + (+2) 

dễ đọc hơn.

6

Trong Java/C++/C ++ không giống với + +. ++/--Increment/Decrement operator. Trường hợp đầu tiên không hoạt động vì nó không áp dụng cho các văn bản (1 hoặc 2). Thậm chí sau đó nó sẽ không phải là một tuyên bố hợp lệ, không 1++ 2 cũng không 1 ++2 là tuyên bố hợp lệ trong Java. Ví dụ thứ hai hoạt động vì nó được hiểu là 1 + (+2). Java lexer bỏ qua không gian trắng. Trong cùng một cách này là hợp lệ:

1 + + + 2 --> 1 + (+ (+2)) 

Hoặc

1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 

Nó hoạt động chỉ vì + là một nhà điều hành unary.Nó không làm việc cho chuỗi như sau:

"a" + + "b" // does not work because +"b" is not valid. 

Tương tự như vậy nó không phải là hợp lệ với nhân

1 * * 2  // does not work because *2 is not valid. 
+1

Nó không phải là hoàn toàn đúng khi nói lexer bỏ qua khoảng trắng, eh? Sau khi tất cả, nó không giải thích '1 ++ 2' là' int biplus unplus int', cũng không phải '1+ + 2' là' int incr int' – djeikyb

3

Thông điệp là:

Main.java:14: error: ')' expected 
     System.out.println(1 ++ 2); 
          ^

Tuyên bố 1 ++ 2 được phân tách như 1 tiếp theo ++ theo sau là 2. Điều này được hiểu là 1++2 tạo lỗi cú pháp (và không phải là lỗi unexpected type; trên thực tế, bạn sẽ gặp lỗi tương tự nếu bạn đã sử dụng các biến, ví dụ: i ++ j).


Các 1 + + 2 tuyên bố trên mặt khác được phân tách như 1 Tiếp theo + Tiếp theo +2 mà biên dịch như mong đợi. Khoảng cách giữa hai toán tử phân tách hai toán tử.

3

Đôi khi việc xem sự cố khi sử dụng biến trở nên dễ dàng hơn.

đoạn của bạn có thể được viết lại như sau:

int a = 1; 
int b = +2; 
System.out.println(a + b); 

Bây giờ, bạn có thể dễ dàng thấy rằng + điều hành thứ hai được sử dụng để chỉ một giá trị tích cực. Bạn cũng có thể viết +1 + +2.

Toán tử - có thể được sử dụng để phủ nhận một biểu thức.

+- là các toán tử đơn nhất.

Các vấn đề liên quan