2012-02-24 30 views
5

Nếu tôi có các biểu hiện sau:Trình tự đánh giá biểu hiện trong C

c = (a) * (b) 

không tiêu chuẩn C90 nói gì về việc đánh giá thứ tự của các subexpression 'a' và 'b'?

+8

[Không có gì] (http://en.wikipedia.org/wiki/Unspecified_behavior) :) :) :) :) – dasblinkenlight

+0

Bài tập về nhà yêu cầu thẻ bài tập về nhà. –

+2

@Robert: Tôi không nghĩ có ai hỏi điều này trong bài tập về nhà của họ ... – Bruce

Trả lời

11

Không có thứ tự được chỉ định vì toán tử nhân không phải là một điểm chuỗi. Các điểm chuỗi bao gồm toán tử dấu phẩy, kết thúc biểu thức đầy đủ và các cuộc gọi hàm. Do đó, thứ tự đánh giá của (a)(b) phụ thuộc vào việc triển khai trình biên dịch. Do đó, bạn không nên cố gắng làm điều gì đó trong (a) mà sẽ có tác dụng phụ mà bạn muốn được nhìn thấy trong (b) để tạo kết quả hợp lệ.

Ví dụ:

int a=5; 
int b = (a++) * (a++); //<== Don't do this!! 

Nếu bạn muốn có một đầy đủ danh sách các điểm chuỗi cho C, bạn có thể kiểm tra một more thorough reference here.

+0

Hoặc, thậm chí tốt hơn, một tìm kiếm SO. – smparkes

+2

@Bruce: xem bản nháp ANSI C http://flash-gordon.me.uk/ansi.c.txt, phụ lục A.2 – Christoph

+0

Ví dụ của bạn thực sự hiển thị mã không đúng, nhưng không phải do thứ tự đánh giá. Rõ ràng, nó không quan trọng mà 'a ++' được đánh giá đầu tiên. – ugoren

3

Thứ tự đánh giá của toán hạng của toán tử nhị phân * không được chỉ định trong C90.

Dưới đây là đoạn có liên quan từ các tiêu chuẩn C90 (tùy theo từng câu hỏi được hỏi về C90):

(C90, 6.3) "Trừ khi có chỉ định bởi các cú pháp hoặc quy định khác hơn (dành cho chức năng gọi operator(), & &, ||,:., và các nhà khai thác dấu phẩy) theo thứ tự đánh giá subexpressions và thứ tự mà tác dụng phụ xảy ra đều unspecitied"

Đối với các nhà điều hành *, nếu chúng ta lấy một ví dụ với các toán hạng tác dụng phụ như:

c = f() * g(); 

việc thực hiện có thể gọi f() đầu tiên hoặc g() đầu tiên:

a = f(); 
b = g(); 
c = a * b; 

hoặc

a = g(); 
b = f(); 
c = a * b; 

Cả hai đều là bản dịch hợp lệ.

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