2013-06-10 41 views
15

Tôi đang học Ada bằng cách sửa lỗi và đọc mã. Tôi đã nhận thấy một số báo cáo được nhóm với "và" và những người khác với "và sau đó". tương tự, có "hoặc" và những nơi khác có "hoặc người nào khác". Một đồng nghiệp nói rằng đó chỉ là cú pháp và không có sự khác biệt. Tôi tự hỏi liệu anh ta có đúng không?Có sự khác biệt giữa "và" so với "và sau đó" trong câu lệnh IF

+0

+1 để hỏi :-) –

+0

câu trả lời ngắn - Có. – NWS

+3

NWS - câu trả lời ngắn hơn (và chính xác) là Không! –

Trả lời

19

Trong Ada and thenor else được cái gọi là 'ngắn mạch' hình thức, tương ứng, andor nhà khai thác:

khai thác Shortcut [and then, or else] được sử dụng để thực hiện việc đánh giá của các bộ phận của biểu thức boolean có điều kiện. Điều này không bao giờ được thực hiện để tăng tốc độ đánh giá (với trình biên dịch tối ưu hóa hiện đại, nó sẽ có thể không có hiệu ứng đó). Việc sử dụng chính xác là để ngăn chặn việc đánh giá các biểu thức được biết là tăng ngoại lệ .

Ví dụ (lấy, như giải thích ở trên, từ wikibooks/Ada):

if Dog /= null and then G (Dog) then 
    Walk (Dog); 
end if; 

Đây G (Chó) sẽ được đánh giá chỉ khi Chó không phải là null. Nếu không có and then nó sẽ được đánh giá anyway, nâng cao một ngoại lệ nếu Dog là null thực sự.

Lưu ý rằng and thenor else, nói đúng, không phải là nhà khai thác vì chúng không thể bị quá tải.

Tôi khuyên bạn nên đọc số này wikibook, nó sẽ giúp bạn trong hành trình của bạn thông qua Ada.)

+0

+1 để cung cấp liên kết tới wikibook - tài nguyên hữu ích nhất – erict

2

Giả sử FuncB là hàm trả về Boolean có tác dụng phụ. Trong

if False and FuncB then 
    null; 
end if; 

các tác dụng phụ của FuncB xảy ra, trong khi với các hình thức mạch ngắn

if False and then FuncB then 
    null; 
end if; 

các tác dụng phụ của FuncB không xảy ra.

2

Cấu trúc and then là một đặc điểm mà một số ngôn ngữ lập trình sử dụng được gọi là đoản mạch.

Bạn có thể kiểm tra và tìm hiểu chức năng này bằng cách cố gắng những đoạn mã:

x:=0; 
if false and 1/x=1 then 
    null; 
end if; 

Cái này sẽ cho kết quả trong một chia cho số không là ngoại lệ.

x:=0; 
if false and then 1/x=0 then 
    null; 
end if; 

Điều này sẽ không tăng ngoại lệ vì nó không kiểm tra điều kiện thứ hai.

+0

'false và [then] 1/x' sẽ cung cấp cho bạn thông báo lỗi biên dịch, vì' 1/x' không thuộc loại 'Boolean '. –

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