2011-06-05 16 views
10

Whats nghĩa củaAda hình thức kiểm soát ngắn mạch

x AND THEN y AND z 

là nó

x AND THEN (y AND z) 

(y, z được không bao giờ đánh giá nếu x là FALSE) hoặc

(x AND THEN y) AND z 

(nếu x là FALSE, y bị bỏ qua, nhưng có khả năng z được đánh giá) trong ada?

+3

GNAT sẽ từ chối để biên dịch ví dụ đầu tiên với thông báo lỗi "toán tử logic hỗn hợp trong khái niệm". – oenone

Trả lời

4

Các nhà khai thác ngắn mạch có cùng quyền ưu tiên với các phiên bản nghiêm ngặt của họ.

+1

[AARM §4.5 (17.a)] (http://www.adaic.org/resources/add_content/standards/05aarm/html/AA-4-5.html) lưu ý rằng ưu tiên chi tiết là "ẩn trong cú pháp quy tắc, "trong trường hợp này [§4.4 Biểu thức] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-4-4.html). – trashgod

+0

Điều đó không hoàn toàn trả lời câu hỏi, vì "AND" và "AND THEN" có cùng quyền ưu tiên và có thể được đánh giá là "cùng một lúc", hoặc cho rằng VÀ là giao hoán, theo thứ tự tùy ý. * Cho * cùng ưu tiên, tôi nghĩ quy tắc là các toán tử ở bên phải chỉ được đánh giá sau khi các hoạt động "... THEN" ở bên trái của chúng đã được đánh giá, điều đó đã không xác định kết quả của subterm của cùng một ưu tiên. –

+1

@Ira Baxter: Tôi không theo. [§4.5 (8)] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-4-5.html) tiếp tục nói rằng "các nhà khai thác có cùng mức độ ưu tiên, các toán tử được liên kết với toán hạng của chúng theo thứ tự văn bản từ trái sang phải. " Điều gì khác là cần thiết? – trashgod

3

Như Mrab & Ira & thùng rác cho biết họ có pecedence bằng nhau, tuy nhiên những gì đã không được chỉ ra rõ ràng là các nhà khai thác "và sau đó" & "hoặc nếu không" sẽ gây ra các biểu hiện trở lại (đánh giá kết thúc) ngay sau khi kết quả có thể được xác định.

Ví dụ (trong giả):

if Almost_always_true_fn() or else costly_fn() then 
    do_stuff; 
end if; 

Phần lớn thời gian chỉ có chức năng đầu tiên (Almost_always_true_fn) sẽ được đánh giá, và chỉ khi đó trả về false sẽ costly_fn được thực thi.

Hãy so sánh điều này với:

if Almost_always_true_fn() or costly_fn() then 
    do_stuff; 
end if; 

Trong trường hợp này cả hai Almost_always_true_fn() costly_fn() sẽ được đánh giá.

NWS.

3

Có, trong (x AND THEN y) AND z, relationz sẽ luôn được đánh giá.

4

nhận xét của @ oenone đề cập rằng GNAT từ chối x AND THEN y AND z, nhưng không giải thích tại sao. Đó là sự thật, theo nghĩa nào đó, rằng andand then có cùng quyền ưu tiên, nhưng đó không phải là toàn bộ câu chuyện.

Ngữ pháp cho một biểu thức là:

expression ::= 
    relation {and relation} | relation {and then relation} 
    | relation {or relation} | relation {or else relation} 
    | relation {xor relation} 

nơi { FOO } biểu thị bằng không hoặc nhiều lần xuất hiện của FOO.

Ngữ pháp này được thiết kế đặc biệt để cho phép bất kỳ một trong những toán tử này hoặc biểu mẫu kiểm soát bị xích trong một biểu thức duy nhất (X and Y and Z, A and then B and then C), nhưng để cấm trộn chúng. Vì vậy, biểu thức trong câu hỏi, x AND THEN y AND z, là bất hợp pháp và câu hỏi về ý nghĩa của nó thậm chí không nảy sinh. Điểm của quy tắc này là chính xác để tránh nhầm lẫn trong các trường hợp như thế này.

Bạn chỉ cần viết (X and then Y) and Z hoặc X and then (Y and Z), tùy theo cái nào phù hợp với những gì bạn muốn làm.

cũng áp dụng để trộn andor:

X and Y and Z -- legal 
    X and Y or Z -- ILLEGAL 
    (X and Y) or Z -- legal 
    X and (Y or Z) -- legal