2011-01-10 60 views
7

Khi tôi cố gắng viết một postfix/tiền tố vào/decrement, theo sau là một post/prefix in/decrement, tôi nhận được lỗi sau: Đối số không hợp lệ để hoạt động ++/-.Trong Java, tại sao tôi không thể viết i ++++ hoặc (i ++) ++?

Nhưng, theo JLS:

PostIncrementExpression: 
     PostfixExpression ++ 

PostfixExpression: 
     Primary 
     ExpressionName 
     PostIncrementExpression 
     PostDecrementExpression 

nên viết:

PostfixExpression ++ ++ 

ta có thể ... Bất kỳ suy nghĩ?

+4

'i ++' trả lại là gì? –

+5

Bạn không nghĩ rằng '- ++ ---- ++ var ++ ---- ++ - ++' có thể hơi khó hiểu? – Crozin

+3

Với mức tăng của C++ là C#, bạn đã thử sử dụng 'i #' chưa? ;-) –

Trả lời

23

Lưu ý rằng ngữ pháp thô thiếu bất kỳ ngữ nghĩa. Nó chỉ là cú pháp, và không phải mọi chương trình cú pháp hợp lệ nói chung sẽ hợp lệ. Ví dụ, yêu cầu các biến phải được khai báo trước khi sử dụng thường không được bao hàm bởi ngữ pháp (bạn có thể, nhưng nó cồng kềnh).

Tăng thêm hậu tố tạo ra một giá trị - và cũng giống như bạn không thể tăng các giá trị gia tăng postfix, bạn không thể tăng hậu tố lên kết quả của i++.

Trích dẫn từ JLS (3 thứ ed, trang 486).:

The result of the postfix increment expression is not a variable, but a value.

+0

Bạn có thể mã hóa khai báo trước khi sử dụng thành ngữ pháp? Đối với bất kỳ số nào của bất kỳ số nhận dạng? – delnan

+0

@delnan: ngữ pháp Van Wijngaarden đã được hình thành cho những thứ như vậy, vâng. Nhưng đối với tất cả các mục đích thực tế, ngữ pháp hai cấp khó sử dụng và bạn có thể đạt được nhiều điều tương tự với ngữ pháp được phân bổ đơn giản xác định các xác nhận được truyền xuống AST (nếu tôi nhớ lại chính xác; đó là một vài năm kể từ lớp đó). – Joey

0

Những gì bạn đang cố gắng đạt được bằng (i ++) ++?

tăng thêm hai lần !!

Sử dụng Looping

Tăng bên trong một vòng lặp :)

+3

Ugghh. Chắc chắn 'i + = 2' tốt hơn vòng lặp. –

1

gì phải là kết quả của một hoạt động như vậy? Kết quả của i++ là (một bản sao) giá trị hiện tại của ii được tăng lên sau đó (bài đăng). Vậy làm thế nào để bạn tưởng tượng tăng kết quả của i++ một lần nữa? Nếu i ban đầu là 1, giá trị của nó sẽ là gì sau i++++ và kết quả của hoạt động này là gì?

Nếu bạn nghĩ về điều đó, bạn có thể nhận ra rằng rất khó xác định điều này một cách chính xác. Vì các nhà thiết kế của Java có ý định tránh bẫy C/C++ "không xác định" (và vì giá trị của một tuyên bố như vậy là đáng ngờ nhất), họ có thể quyết định không cho phép nó một cách rõ ràng.

+0

Không, đó không phải là lý do. Lý do, như đã nêu trong các câu trả lời khác, là do kết quả của biểu thức i ++ là một giá trị, không phải là một tham chiếu có thể được thay đổi. –

+0

@ John, vậy thì câu hỏi của bạn là gì? –

+0

Tôi nhớ rằng vì những nhận xét/câu trả lời. –

8

Các lỗi cho bạn biết câu trả lời:

unexpected type 
required: variable 
found : value 
     (i++)++; 

Vì vậy, tôi ++ để đánh giá một giá trị trong khi các nhà điều hành đòi hỏi một biến.

+2

Hm, phụ thuộc vào trình biên dịch, tôi đoán vậy. EclipseC sinh ra »Đối số không hợp lệ để hoạt động ++/-« mà không phải là hữu ích. – Joey

+0

Thú vị. Yea, đó không phải là hữu ích. Lỗi ở trên là từ trình biên dịch Sun. – JOTN

5

Bạn chỉ có thể áp dụng ++ hoặc -- vào biểu thức biểu thị vị trí có thể sửa đổi (giá trị). KẾT QUẢ của ++ hoặc -- là giá trị từ vị trí (giá trị gia tăng - trước hoặc sau khi tăng hoặc giảm) và không phải là vị trí có thể sửa đổi.Vì vậy, bạn không thể nói (a++)++ bất kỳ điều gì nhiều hơn mức bạn có thể nói (a+b)++ - không có vị trí nào cần sửa đổi.

0

Trong i ++, ++ là toán tử postfix, vì vậy nó trả về giá trị của i và sau đó tăng nó. Bạn muốn (i ++) ++ làm gì? Nó có nên trả lại i + 1 kể từ (i ++ == i) không? Nếu không phải là điều kỳ lạ mà i ++ = i nhưng (i ++) ++! = I) hãy xem xét các biểu thức sau:

i++ == i; // true 
j = i++ // j gets the value of i 
j++ == i // still true since j== i 

(i++) ++ == j ++ // what should be the answer here? 

Bạn đã xem i + = 2 chưa?

2

tôi về cơ bản ++ là một phím tắt cho:

(i = i + 1)

Và nó sẽ không thực hiện bất kỳ ý nghĩa để viết:

(i = i + 1) ++ ;

phải không? :)

+3

'(i = i + 1)' là * không * hành vi tương tự như '(i ++)' - giá trị cũ trả về giá trị mới của i, giá trị thứ hai trả về giá trị cũ. –

+0

Xin lỗi. Tôi đoán tôi đã không chọn một nụ cười tốt mà truyền tải sự khéo léo. Lỗi của tôi. -1 cho bản thân mình cho điều này. – Kylar

0

Tại sao bạn không chỉ sử dụng toán tử tăng tốc ký tự?

i+=2 

Ở đó.

4

Sự cố với biểu thức này i = (i ++) ++; là (i + +) được giải quyết thành giá trị và định nghĩa của ++ toán tử cho biết 1. nó sẽ tăng biến được xác định và sẽ đặt/trả về một giá trị cho điều này cho dù bạn sử dụng Postfix hoặc Tiền tố. 2. Toán tử này yêu cầu biến tiền tố hoặc tiền tố. Nhưng những gì đang xảy ra ở đây là (i ++) trả về một giá trị và đặt nó vào vị trí của (i ++) và sau đó bạn đang có (giá trị) ++(giá trị) không phải là kiểu mong đợi cho nhà điều hành này. một biến thay cho giá trị.

ví dụ trong Java nếu bạn biên dịch đoạn mã sau đoạn mã bạn sẽ nhận được lỗi như được hiển thị sau khi đoạn:

public class A { public void test() { int i = 0; i = (i ++) ++; }}

Compilation đầu ra:

A.java: 4: loại không mong muốn bắt buộc: biến được tìm thấy: giá trị i = (i ++) ++; ^ 1 lỗi

1

Phải nhớ rằng: Tăng & giảm một (tiền tố & postfix) điều hành luôn làm việc với biến không giá trị

Ở đây tôi giải thích điều này với một exe :

int i = 0; 

int j = (i++)++; 

exe ​​ở trên.

initialize value of i with 0(zero)

in (i++) '++' work with i which is variable & after performing operation return (1)

now in (1)++ '++' work with (1) which is value not variable that is oppose to rules of java that's why compile time error generate Invalid argument to operation ++/--

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