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
Trả lời
Trong Ada and then
và or else
được cái gọi là 'ngắn mạch' hình thức, tương ứng, and
và or
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 then
và or 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.)
+1 để cung cấp liên kết tới wikibook - tài nguyên hữu ích nhất – erict
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.
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.
'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 '. –
- 1. Sự khác biệt giữa if -e và if -f
- 2. Sự khác biệt hiệu suất, nếu có, giữa if (! Foo) và if (foo == false) trong Java?
- 3. sự khác biệt giữa "ifndef" và "if! Defined" trong C?
- 4. Sự khác biệt giữa "if (foo) bar();" và "foo && bar();"
- 5. Sự khác biệt giữa java 'assert' và 'if() {} else exit;'
- 6. Nếu ... Sau đó ... Khác với nhiều câu sau Sau đó
- 7. Sự khác biệt giữa $ (...) và `...`
- 8. Sự khác biệt giữa "**/* /" và "** /"?
- 9. Sự khác biệt giữa $ * và $ @
- 10. Sự khác biệt giữa Verilog! và ~?
- 11. sự khác biệt giữa lệnh linux và unix là gì?
- 12. Simple câu lệnh if vs bình thường câu lệnh if
- 13. Sự khác biệt giữa = và: =
- 14. Sự khác biệt giữa Agda và Idris
- 15. Sự khác biệt giữa ". +" Và ". +?"
- 16. Sự khác biệt giữa tập lệnh MATLAB và COMSOL?
- 17. Sự khác biệt giữa String.isEmpty() và String.equals ("")
- 18. Sự khác biệt giữa egrep và grep
- 19. iPhone: Sự khác biệt giữa nil so với Nil và true so với TRUE
- 20. Sự khác biệt giữa. và #
- 21. Sự khác biệt giữa tệp .so và .lo là gì?
- 22. sự khác biệt giữa:.! và: r !?
- 23. sự khác biệt giữa Interlocked.Exchange và Volatile.Write?
- 24. Sự khác biệt giữa Kivy và PY4A
- 25. Sự khác biệt giữa .Rprofile và .First
- 26. Sự khác biệt giữa phương thức Nhận và đăng so với HTTP và REST
- 27. Có sự khác biệt nào trong C và C++ giữa việc sử dụng if, else if, else if, ... và sử dụng switch() {case A: ... case B: ...}?
- 28. Sự khác biệt giữa hai câu lệnh này là gì
- 29. Sự khác biệt giữa ADO và DAO
- 30. Sự khác biệt giữa '.' và "." trong java
+1 để hỏi :-) –
câu trả lời ngắn - Có. – NWS
NWS - câu trả lời ngắn hơn (và chính xác) là Không! –