Với các câu hỏi return
trong mỗi chi nhánh if
.
Trong mã của bạn, bạn có các câu hỏi return
trong mỗi điều kiện. Khi bạn có một tình huống như thế này, có hai cách để viết điều này.Đầu tiên là làm thế nào bạn đã viết nó trong Ví dụ 1:
if (a == b1) {
return c1;
} else if (a == b2) {
return c2;
} else {
return c11;
}
các khác như sau:
if (a == b1) {
return c1;
}
if (a == b2) {
return c2;
}
return c11; // no if or else around this return statement
Hai cách viết mã của bạn là giống hệt nhau.
Cách bạn viết mã của bạn trong ví dụ 2 sẽ không biên dịch trong C++ hoặc Java (và sẽ là hành vi không xác định trong C), vì trình biên dịch không biết rằng bạn đã bao gồm tất cả các giá trị có thể là a
. nghĩ rằng có một đường dẫn mã thông qua hàm có thể đưa bạn đến phần cuối của hàm mà không trả về một giá trị trả lại.
if (a == b1) {
return c1;
}
if (a == b2) {
return c2;
}
...
if (a == b11) {
return c11;
}
// what if you set a to some value c12?
Nếu không có return
báo cáo trong mỗi chi nhánh if
.
Without return
báo cáo trong từng ngành if
, mã của bạn sẽ là chức năng giống hệt nhau chỉ khi những điều khoản sau đây là đúng:
- Bạn không đột biến giá trị của
a
trong bất kỳ if
chi nhánh.
==
là một mối quan hệ tương đương (theo nghĩa toán học) và không có số nào trong số b1
qua số b11
thuộc cùng một lớp tương đương.
==
không có bất kỳ tác dụng phụ nào.
Để làm rõ hơn nữa về điểm # 2 (và cũng chỉ # 3):
==
luôn luôn là một quan hệ tương đương trong C hoặc Java và không bao giờ có tác dụng phụ.
- Trong các ngôn ngữ cho phép bạn ghi đè toán tử
==
, chẳng hạn như C++, Ruby hoặc Scala, toán tử bị ghi đè ==
có thể không phải là mối quan hệ tương đương và có thể có tác dụng phụ. Chúng tôi chắc chắn hy vọng rằng bất cứ ai overrides các nhà điều hành ==
là lành mạnh, đủ để viết một mối quan hệ tương đương mà không có tác dụng phụ, nhưng không có bảo đảm.
- Trong JavaScript và một số ngôn ngữ lập trình nhất định có quy tắc chuyển đổi loại lỏng lẻo, có các trường hợp được tích hợp vào ngôn ngữ mà
==
không chuyển tiếp hoặc không đối xứng. (Trong Javascript, ===
là một mối quan hệ tương đương.)
Về hiệu suất, ví dụ # 1 được đảm bảo không thực hiện bất kỳ so sánh nào sau khi so khớp. Nó có thể có khả năng cho trình biên dịch tối ưu hóa # 2 để bỏ qua các so sánh bổ sung, nhưng không chắc. Trong ví dụ sau, nó có thể không thể, và nếu các chuỗi dài, các so sánh thêm không phải là giá rẻ.
if (strcmp(str, "b1") == 0) {
...
}
if (strcmp(str, "b2") == 0) {
...
}
if (strcmp(str, "b3") == 0) {
...
}
Nguồn
2012-02-07 01:46:46
Ngôn ngữ nào bạn đang đề cập đến? Java hoặc C++? – Billjk
đó là java cho tôi, nhưng tôi đã sử dụng nó cho cả C++ và Java cho dài ... – Lily
Đó là một sự khác biệt đáng kể, bởi vì bạn có thể thực hiện 'operator ==' trong C++ để làm những điều khó chịu (side-effecty) cũng có ảnh hưởng đến tối ưu hóa ...). AFAICR này không hoạt động trong Java. – bitmask