2015-09-02 17 views
7

Tôi biết rằng điều này có thể trùng lặp nhưng tôi không tìm thấy câu trả lời đầy đủ cho các ví dụ của mình. Nói chung, sự khác biệt giữa các câu lệnh và biểu thức là gì? Đây là một sự phân biệt mà tôi chưa phân biệt hoàn toàn. Tôi biết rằng thông thường một biểu thức được cho là bất cứ điều gì trả về một giá trị, chẳng hạn như một chữ, hoặc một hàm. Các câu lệnh thường được gọi là lệnh cho trình thông dịch, chẳng hạn như "in như vậy và như vậy" hoặc "do... Trong khi". Tuy nhiên, tôi không hiểu.Sự khác nhau giữa biểu thức và câu lệnh là gì?

Sẽ không có ý nghĩa khi nói rằng in là một biểu thức, vì đó là chức năng in đầu vào (đầu vào đến đầu ra)? Ngoài ra, mọi người thường nói rằng x = 1 là một tuyên bố, nhưng điều này không thể được coi là một biểu thức mà toán tử gán là một hàm hoạt động trên hai đầu vào và đầu ra là x tham chiếu đến 1? Cuối cùng, không thể cấu trúc điều khiển luồng như là. . . khác được coi là một hàm ba đối số trong đó một trong các đối số khác được trả về dựa trên giá trị chân lý của đầu vào đầu tiên, làm cho nó trở thành một biểu thức?

Tôi có thể bối rối vì tôi có nền trong LISP, nơi mọi thứ đều là một biểu thức. Có vẻ như tôi không thể né tránh ý nghĩ rằng hầu hết các cấu trúc lập trình là những biểu hiện ở cốt lõi của họ. Như vậy, ai đó có thể giải thích sự khác biệt giữa một tuyên bố được gọi là gì và một biểu thức?

+0

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ệ. –

+0

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. –

Trả lời

3

Biểu thức mang lại giá trị, một câu lệnh sẽ thực hiện điều gì đó.

ví dụ: trong C return a+5; là một câu lệnh, nó thoát khỏi một hàm cho giá trị bắt nguồn từ biểu thức a+5 đến người gọi.

cho dù in là một biểu thức hay câu lệnh phụ thuộc vào ngôn ngữ.

BASIC có bản in không giống như chức năng, đó là một thứ được xử lý như một trường hợp đặc biệt bởi trình biên dịch. tương tự như pascal có writewriteln cũng là trường hợp đặc biệt, không có chức năng calle, mặt khác C đã đặt() và printf() là cả hai hàm. và cho phép lập trình viên viết các hàm tương tự hoạt động theo cùng một cách.

+0

Biểu thức có thể 'làm điều gì đó'. – user2864740

+0

@ user2864740 có lẽ là một sự phân biệt giữa một biểu thức với các hiệu ứng phụ và một cái không được bảo hành sau đó. – JPC

+1

@JPC Tôi không nghĩ rằng một trong những nhu cầu để thảo luận về tác dụng phụ của biểu thức để trả lời câu hỏi (mặc dù nó không phù hợp với nó trong tốt); sự khác biệt giữa câu lệnh và biểu thức là quy tắc sản xuất * ngữ pháp *. – user2864740

7

Định nghĩa của biểutuyê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 voidchỉ 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;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.

+0

'printf()' không phải là một câu lệnh. Lệnh * function * là câu lệnh: 'printf()' chỉ là hàm được gọi. – EJP

+0

@EJP "là một hàm .. có thể xuất hiện dưới dạng" - mặc dù tôi đang mở cho các đề xuất rõ ràng hơn. – user2864740

+0

@EJP: Trong C, 'printf (" Hello ")' là một biểu thức, không phải là một câu lệnh. 'printf (" Hello ");' là một câu lệnh. An * biểu thức tuyên bố * là một loại tuyên bố cụ thể, bao gồm một biểu thức (tùy chọn) theo sau là dấu chấm phẩy. (Câu lệnh null được coi là một câu lệnh biểu hiện vì một lý do nào đó.) –

0

Câu trả lời mang tính triết học hơn 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.

Ngôn ngữ bắt buộc sử dụng câu lệnh để thực thi mã tùy ý, chẳng hạn như gán giá trị cho biến hoặc in bảng đ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ệ.

Biểu thức hoàn toàn chức năng chỉ làm giảm chi phí nhận thức đối phó với đột biến bằng cách phơi bày các đột biến đó dưới dạng giá trị trong và của chính chúng. Kết hợp điều này với kết hợp mẫu và bạn buộc phải xử lý rõ ràng tất cả các trường hợp thành công và lỗi và do đó biến chúng thành giá trị, ánh xạ hoặc lọc rõ ràng bất kỳ lỗi nào.

Báo cáo bắt buộc không bắt buộc phải hiển thị lỗi dưới dạng giá trị và do đó luôn có khả năng mã tùy ý tồn tại theo phương pháp không nghi ngờ theo cách dễ bị bỏ qua. Các câu lệnh, chẳng hạn như các lời gọi phương thức hoặc các phép gán biến (x = y = z()), thường có thể phù hợp với khuôn của một biểu thức trong khi vẫn thực thi mã tùy ý và không giao tiếp được các lỗi như các giá trị.

Cuối cùng, bạn không thể tránh đột biến. Bạn có thể, tuy nhiên, làm cho nó rõ ràng hơn. Điều này có nghĩa là các câu lệnh và biểu thức khác nhau chủ yếu theo cách triết học, cả hai đều tồn tại để trả lời cùng một câu hỏi - làm cách nào chúng ta phơi bày các đột biến trong bối cảnh thực thi mã?

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