2010-05-19 43 views
12

Tôi đã tự hỏi điều gì sẽ xảy ra khi một chương trình xử lý cấu trúc nếu có nhiều điều kiện. Tôi có một ý tưởng, nhưng tôi không chắc chắn về nó. Tôi sẽ đưa ra một ví dụ:Điều gì sẽ xảy ra nếu phần đầu tiên của cấu trúc nếu là sai?

List<string> myTestList = null; 
if (myTestList != null && myTestList.Count > 0) 
{ 
    //process 
} 

Danh sách này là rỗng. Khi xử lý câu lệnh if, nó sẽ đi từ trái sang phải thoát ra nếu ngay sau khi một điều kiện là sai?

Tôi đã thử nó và dường như không có lỗi, vì vậy tôi giả định ở trên giải thích nó, nhưng tôi không chắc chắn.

+0

Khi bạn thêm một 'khoản else', những gì đã xảy ra mà bạn nhìn thấy? –

+0

nó được gọi, đó là lý do tại sao tôi nghĩ rằng nếu phá vỡ ngay sau khi một điều kiện là sai – Terry

+0

"Breaks xuống"? Bạn có ý gì khi "chia nhỏ"? –

Trả lời

23

Đây là số && quan trọng. Điều này là ngắn mạch, do đó, Count không bao giờ được đánh giá; Các điều kiện được đánh giá từ trái sang phải.

Ngoài ra còn có một nhà điều hành không mạch ngắn (&), nhưng nó là rất hiếm khi thấy trong thử nghiệm nếu; nó chủ yếu dành cho các hoạt động bitwise (trên int vv).

Từ spec:

có điều kiện logic khai thác

Các &&|| nhà khai thác này được gọi là các toán tử logic có điều kiện. Chúng cũng được gọi là các toán tử logic “ngắn mạch” .

...

Các &&|| nhà khai thác là phiên bản có điều kiện của các nhà khai thác &| :

  • Các hoạt động x && y tương ứng với hoạt động x & y, ngoại trừ việc y được đánh giá chỉ nếu x không phải là false.
  • Hoạt động x || y tương ứng với hoạt động x | y, ngoại trừ y chỉ được đánh giá nếu x không phải là true.
2

Trong C# và hầu hết các ngôn ngữ, &&||ngắn mạch, tức là nếu phần thứ nhất của biểu thức là đủ để xác định kết quả, phần thứ hai là đảm bảo không được thực thi .

Mã bạn đã sử dụng là mã C# thành ngữ.

2

Đánh giá sẽ dừng ngay lập tức nếu tham chiếu là null. Đó được gọi là biểu thức logic đánh giá ngắn mạch - nếu phần bên trái của &&false, bên phải không được đánh giá gì cả.

2

Nó bị đoản mạch.

a && b 

nếu a là sai, b sẽ không được đánh giá. Chúng ta có thể sử dụng hành vi này bởi vì biểu thức sẽ luôn là sai.

Tương tự,

a || b 

nếu a là đúng, b sẽ không được đánh giá.

6

Trong hầu hết các ngôn ngữ hiện đại (nhưng không phải tất cả), có một tính năng được gọi là "short circuit boolean evaluation". Điều này có nghĩa là nếu phần đầu tiên của điều kiện && là sai, thì phần thứ hai không được đánh giá.

Tính năng tương tự áp dụng cho ||, nếu phần đầu tiên là đúng, phần thứ hai không được đánh giá.

Lưu ý rằng tính năng này không giới hạn ở các câu hỏi if. Sau đây cũng là hợp lệ và sẽ không cố gắng để tham khảo Count nếu myTestListnull:

bool b = myTestList != null && myTestList.Count > 0; 
1

Vâng, đánh giá ngắn mạch nên được sử dụng. Tôi không phải là nhà phát triển C#, nhưng tôi đã đọc nó từ this Wikipedia article.

2

Hầu hết các ngôn ngữ lập trình hiện đại, bao gồm C#, thực hiện những gì được gọi là toán tử kết nối tuần tự của McCarthy. Điều này có nghĩa:

a && b <=> a ? b : false 

Nếu bạn nhìn vào các thứ hai của hai biểu thức tương đương, nó trở nên khá rõ ràng rằng b được đánh giá khi và chỉ khi a là đúng.Và ngược lại:

a || b <=> a ? true : b 
0

Đối với chương trình mẫu sau:

trống test() { bool f1 = 0; bool f2 = 0;

if (f2 & & (f1 = 1)) {cout < < "Bên trong 1" < < endl; } cout < < "F1" < < f1 < < ": F2:" < < f2 < < endl;

if ((f1 = 1) & & f2) {cout < < "Bên trong 2" < < endl; } cout < < "F1" < < f1 < < ": F2:" < < f2 < < endl; }

Output sẽ là: F1 0: F2: 0

F1 1: F2: 0

Mà về cơ bản chỉ ra rằng nếu vòng lặp được thực hiện từ trái sang phải. 1. Trong vòng lặp if đầu tiên, điều kiện đầu tiên không thành công và nó không bận tâm để kiểm tra phần thứ hai. 2. Trong vòng lặp nếu thứ hai, phần đầu tiên được chạy đầu tiên và sau đó là phần thứ hai.

Điều này sẽ hiệu quả đối với C++. Hi vọng điêu nay co ich.

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