2013-05-16 40 views
9

Tôi cho rằng đây là một câu hỏi về lý thuyết ngôn ngữ hơn bất cứ điều gì khác. Tại sao tuyên bố đầu tiên trong pháp lý chính, khi câu thứ hai là không? Họ không đánh giá là điều tương tự?Java: Không phải là một tuyên bố

public class Main { 
     public static void main(String[] args) { 
       foo(); 
       0; 
     } 
     public static int foo(){ 
       return 0; 
     } 
} 
+0

Vì đó là nguyên thủy thô sơ, không phải là tuyên bố. – greedybuddha

+0

Đọc phần này: http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf Đặc biệt là chương về các câu lệnh. – user643011

Trả lời

14

Java hạn chế các loại biểu thức được phép trong cái gọi là "câu lệnh biểu thức". Chỉ cho phép các biểu thức có ý nghĩa có tác dụng phụ tiềm ẩn. Nó không cho phép các phát biểu vô nghĩa ngữ nghĩa như 0; hoặc a + b;. Chúng đơn giản bị loại trừ khỏi ngữ pháp ngôn ngữ.

Một cuộc gọi chức năng như foo() có thể và thường xảy ra, có tác dụng phụ, do đó, nó không phải là một tuyên bố vô nghĩa. Trình biên dịch không kiểm tra sâu cơ thể của foo() để kiểm tra xem nó có thực sự làm bất cứ điều gì không. Gọi một hàm có thể có các tác dụng phụ, do đó nó có hiệu lực về cú pháp.

Điều này phản ánh sự khác biệt về triết học giữa C/C++ và Java. Java cấm các cấu trúc khác nhau dẫn đến mã chết hoặc vô nghĩa.

return; 
foo(); // unreachable statement 

C và C++ tương đối tuyệt vời về tất cả. Viết bất cứ điều gì bạn muốn; họ không có thời gian để giữ trẻ.


Trích dẫn từ Java Language Specification, §14.8 Expression Statements:

Một số loại biểu thức có thể được sử dụng như báo cáo bằng cách làm theo chúng với dấu chấm phẩy.

ExpressionStatement: 
    StatementExpression ; 

StatementExpression: 
    Assignment 
    PreIncrementExpression 
    PreDecrementExpression 
    PostIncrementExpression 
    PostDecrementExpression 
    MethodInvocation 
    ClassInstanceCreationExpression 

Tuyên bố biểu thức được thực thi bằng cách đánh giá biểu thức; nếu biểu thức có giá trị, giá trị sẽ bị hủy.

Thực thi câu lệnh biểu thức hoàn thành bình thường nếu và chỉ nếu đánh giá biểu thức hoàn thành bình thường.

Không giống như C và C++, ngôn ngữ lập trình Java chỉ cho phép một số biểu thức nhất định được sử dụng làm biểu thức biểu thức . Lưu ý rằng ngôn ngữ lập trình Java không cho phép một "diễn viên để làm mất hiệu lực" - khoảng trống không phải là một loại - vì vậy C lừa truyền thống viết một tuyên bố biểu như:

(void)... ; // incorrect! 

không hoạt động. Mặt khác, ngôn ngữ lập trình Java cho phép tất cả các loại biểu thức hữu ích nhất trong câu lệnh biểu thức, và nó không yêu cầu lời gọi phương thức được sử dụng như một câu lệnh biểu thức để gọi phương thức void. Cần có . Nếu cần một thủ thuật, hoặc có thể sử dụng câu lệnh gán (§15.26) hoặc một tuyên bố khai báo biến cục bộ (§14.4).

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