Định nghĩa của biểu và tuyên bố - và thậm chí nếu có một điều như một này hay cách khác - là cụ thể cho một ngôn ngữ cụ thể và ngữ pháp mô tả nó.
Vâng, chúng ta hãy đi:
Một tuyên bố là một số 'mã evaluatable' rằng không xuất hiện trong một bối cảnh biểu; và
Một biểu là mã xuất hiện trong một bối cảnh trong đó giá trị kết quả thể được tiêu thụ thông qua thay thế của biểu thức.
{Định nghĩa rất lỏng ', nhưng có không Một ngôn ngữ. Trong khi một số ngôn ngữ nghiêm ngặt về thời điểm tác dụng phụ có thể và không thể xảy ra - và mã thực thi mà không có kết quả hoặc tác dụng phụ là vô ích - tôi không tin rằng việc thảo luận như vậy là cơ bản cho sự khác biệt.}
Ví dụ: chúng ta hãy xem printf
trong C. Đây là hàm bên cạnh tác dụng phụ and it returns a value; thường giá trị trả về bị bỏ qua. Như vậy printf
có thể xuất hiện khi cả hai một tuyên bố
printf("Hello world!");
và một biểu
if (8 == printf("Hello %s!", name)) { // ..
(Một cuộc gọi chức năng với một kiểu trả về của void
chỉ thể xuất hiện trong một bối cảnh tuyên bố trong C nhưng điều này được áp dụng bởi hệ thống kiểu và không phải là trình phân tích cú pháp.)
Tương tự, hãy thực hiện hai dòng này trong JavaScript x = 1;
và x = (y = 2);
. x = ..
là một tuyên bố trong khi y = 2
là một biểu thức mang lại giá trị.
Trong cả hai ví dụ chúng ta thấy rằng nó là sản xuất ngữ pháp mà xác định nếu nó được coi là tuyên bố hoặc một biểu.
Ngược Ruby có thể đối xử với sự phân công 'cấp cao nhất' như là một biểu:
[1].map {|x| x = 2}
Bây giờ chúng ta hãy xem một đỉnh một Python (2.x). Trong trường hợp này print
là một tuyên bố đó là lý do những công việc và không có tác dụng, tương ứng:
print "Look ma, no parenthesis!"
x = lambda y: print "Whoops!" # invalid, print not an expression
Và những gì về tại if
cấu trúc - là những tuyên bố hoặc biểu thức? Một lần nữa, nó phụ thuộc vào ngôn ngữ cụ thể. Trong C và Java như vậy là những phát biểu rõ ràng: không có cách nào để sử dụng như là một thay thế cho một giá trị.
Mặt khác, Scala (và Ruby) cho phép như các cấu trúc điều khiển lưu lượng được sử dụng như biểu thức, mặc dù họ cũng có thể xuất hiện như tuyên bố:
var emotionalResponse = if (color == "green") {
log.cheer()
new Cheering()
} else {
new Tears()
}
Whew. Đó là rất nhiều - và nó không gần như toàn diện. Tuy nhiên, quay lại 'định nghĩa' có thể được sắp xếp lại như vậy, khi lấy các ví dụ khác nhau ở trên vào tài khoản:
Nếu cấu trúc trong câu hỏi có thể xảy ra khi có giá trị (ví dụ: ở bên phải) bên tay của một nhiệm vụ, như một đối số chức năng, như đầu vào cho một biểu thức khác) thì nó có thể được coi là một biểu thức; và chắc chắn nhất là một biểu hiện khi trong bối cảnh như vậy. Nếu cấu trúc xuất hiện ở vị trí có giá trị thì không thể truy cập thông qua thay thế thì đó là (hoặc đúng hơn, có thể hoạt động như) một tuyên bố.
Một lớp của tác phẩm với điều kiện là tờ khai, chẳng hạn như một tờ khai chức năng trong C hoặc định nghĩa lớp trong Java, và được cho là không báo cáo; kể từ sau đây đã được phân mảnh như vậy là nhiều như một lưu ý được.
Câu trả lời mang tính triết học hơn là thực tế. Báo cáo thường có tác dụng phụ, trong khi các biểu thức nói chung là đại số hơn trong tự nhiên. Trong ngôn ngữ thuần túy chức năng, không có báo cáo. Đó là để nói rằng ngay cả những điều mà thực hiện các tác dụng phụ (một tập tin, ví dụ) được thể hiện trong điều khoản của các giá trị đại diện cho (lý tưởng) tất cả các đột biến - bao gồm cả thất bại. Các ngôn ngữ bắt buộc sử dụng các câu lệnh để thực thi mã tùy ý, chẳng hạn như gán một giá trị cho một biến, hoặc in ra bàn điều khiển và có khả năng truyền thông thất bại mặc dù tuyên truyền ngoại lệ. –
Sự khác biệt phụ thuộc vào ngôn ngữ bạn đang nói đến. Trong C, 'x = 1' là một biểu thức và' x = 1; 'là một câu lệnh. Trong Ada, 'x: = 1' không phải là một biểu thức, nhưng' x: = 1; 'là một câu lệnh. –