Sự khác biệt giữa & và && trong MATLAB là gì?


Câu trả lời:


93

Dấu và & là toán tử logic AND. Ký hiệu kép và && lại là một toán tử AND logic sử dụng hành vi đoản mạch. Ngắn mạch chỉ có nghĩa là toán hạng thứ hai (phía bên phải) chỉ được đánh giá khi kết quả không được xác định đầy đủ bởi toán hạng đầu tiên (phía bên trái)

A & B (A và B được đánh giá)

A && B (B chỉ được đánh giá nếu A đúng)


75
Báo trước: &có thể hoạt động trên mảng nhưng &&chỉ có thể hoạt động trên vô hướng.
gnovice

Lưu ý: sau 15 năm làm việc với Matlab hầu như hàng ngày tôi luôn sử dụng '&' và nó chưa bao giờ cắn tôi. OTOH, tôi biết nhiều người cảm thấy khó chịu khi sử dụng '&&' vì họ phải nhớ rằng nó không phổ biến (vâng tôi nhận ra rằng '&' không hiệu quả vì nó không ngắn mạch nhưng tôi khá là không bao giờ kết nối- chuỗi các toán hạng của tôi để tiết kiệm ngày nay là không đáng kể).
eric

7
@neuronet nó không thực sự là về hiệu quả, hơn thế nữa nó cho phép một cấu trúc trong đó biểu thức đầu tiên đảm bảo một điều kiện mà biểu thức thứ hai có thể gây ra lỗi thời gian chạy. ví dụ d != 0 && 1/dvs d !=0 & 1/d- bên nhận bảo lãnh đầu tiên không có phép chia cho không, thứ hai thì không.
Fraser

2
Câu trả lời này là không đầy đủ và không chính xác. &làm ngắn mạch nếu trong một ifcâu lệnh. Và &&nhận đầu vào vô hướng. Câu trả lời của @ Loren dưới đây là đúng.
Cris Luengo

2
Cũng lưu ý rằng Loren là một nhân viên của MathWorks. Một câu trả lời không có thẩm quyền hơn thế. Nếu bạn sẵn sàng hy sinh, bạn có thể gắn cờ câu trả lời của mình để mod xóa nó (bạn không thể tự xóa nó vì nó được chấp nhận). Bạn sẽ giữ lại đại diện mà bạn nhận được từ nó (nếu tôi hiểu hệ thống một cách chính xác) và chúng tôi sẽ kết thúc với một câu trả lời hàng đầu đúng về mặt kỹ thuật và có thẩm quyền.
Andras Deak

35

&&và luôn ||lấy đầu vào vô hướng và đoản mạch. |và chỉ &lấy đầu vào mảng và ngắn mạch trong câu lệnh if / while. Đối với nhiệm vụ, sau này không ngắn mạch.

Xem các trang tài liệu này để biết thêm thông tin.


1
Bạn có bất kỳ thông tin nào về phím tắt phiên bản Matlab nào &|trong câu lệnh if / while không? Nó dường như không phải là trường hợp của R2012b và R2014a.
Tim

@Loren bất kỳ ý tưởng nào tại sao họ thiết kế một cái để chỉ hoạt động với vô hướng? Có vẻ lạ ...
eric

@neuronet: Bạn không thể đoản mạch nếu hoạt động trên mảng.
Cris Luengo

17

Như đã được đề cập bởi những người khác, &toán tử AND logic&&toán tử AND ngắn mạch . Chúng khác nhau về cách các toán hạng được đánh giá cũng như việc chúng có hoạt động trên mảng hay vô hướng hay không:

  • &(Toán tử AND) và |(Toán tử OR) có thể hoạt động trên mảng theo kiểu khôn ngoan.
  • &&||là các phiên bản ngắn mạch mà toán hạng thứ hai chỉ được đánh giá khi kết quả không được xác định đầy đủ bởi toán hạng thứ nhất. Chúng chỉ có thể hoạt động trên vô hướng , không phải mảng.

8

Cả hai đều là phép toán logic AND. Mặc dù && là một toán tử "ngắn mạch". Từ tài liệu MATLAB:

Chúng là toán tử ngắn mạch ở chỗ chúng chỉ đánh giá toán hạng thứ hai khi kết quả không được xác định đầy đủ bởi toán hạng đầu tiên.

Xem thêm tại đây .


6

Tương tự như các ngôn ngữ khác, &là một toán tử logic bitwise, trong khi &&là một phép toán logic.

Ví dụ (xin lỗi cú pháp của tôi).

Nếu..

A = [True True False True]
B = False
A & B = [False False False False]

..hoặc là..

B = True
A & B = [True True False True]

Đối với &&, toán hạng bên phải chỉ được tính nếu toán hạng bên trái là true và kết quả là một giá trị boolean duy nhất.

x = (b ~= 0) && (a/b > 18.5)

Hy vọng điều đó rõ ràng.


3
Nó không phải là bitwise, nó là yếu tố khôn ngoan.
Cris Luengo

3
Có phải 10 năm sau tôi đã thực sự khỏe lại không? 😺
Erik Kerber

Chà, câu hỏi này đã nhận được ~ 115k lượt xem cho đến nay, có nghĩa là rất nhiều người đã đọc thông tin sai lệch ở đây. Nhiều câu trả lời trong số này không đầy đủ hoặc chứa thông tin sai. Tất cả những gì bạn cần làm là sửa hoặc xóa câu trả lời của mình. BTW: bitandlà toán tử AND logic bit trong MATLAB.
Cris Luengo


2

Một nguyên tắc nhỏ khi xây dựng các đối số để sử dụng trong các câu lệnh điều kiện (IF, WHILE, v.v.) là luôn sử dụng && / || biểu mẫu, trừ khi có một lý do chính đáng để không. Có hai lý do ...

  1. Như những người khác đã đề cập, hành vi đoản mạch của && / || tương tự như hầu hết các ngôn ngữ giống C. Sự tương đồng / quen thuộc đó thường được coi là một điểm có lợi cho nó.
  2. Sử dụng && hoặc || biểu mẫu buộc bạn phải viết mã đầy đủ để quyết định ý định của bạn cho các đối số vectơ. Khi a = [1 0 0 1] và b = [0 1 0 1], a & b đúng hay sai? Tôi không thể nhớ các quy tắc cho MATLAB's &, bạn có thể không? Hầu hết mọi người không thể. Mặt khác, nếu bạn sử dụng && hoặc ||, bạn CẦN viết mã "đầy đủ" để giải quyết tình trạng này.

Làm điều này, thay vì dựa vào độ phân giải vectơ trong & và | của MATLAB, dẫn đến mã dài dòng hơn một chút, nhưng an toàn hơn và dễ bảo trì hơn RẤT NHIỀU.


1
+1, nhưng cần lưu ý rằng câu trả lời của bạn chỉ áp dụng cho những trường hợp bạn muốn kết quả cuối cùng của phép toán là vô hướng. Có nhiều cách sử dụng cho & và | ở đâu && và || vô dụng vì chúng không thể trả về mảng, ví dụ khi thực hiện lập chỉ mục ưa thích như "chọn tất cả r từ 1 đến 2: r((r<2)&(r<2))".
Jonas Heidelberg

Tốt, Jonas. Tôi đã nghĩ đến các điều kiện, không phải "lập chỉ mục hợp lý", (thuật ngữ MATLAB cho "lập chỉ mục ưa thích" mà bạn đã đề cập) khi tôi viết điều này. Tôi đã thay đổi câu đầu tiên của bài đăng của mình để phản ánh điều đó. Cảm ơn vì đã nhắc nhở!
Bob Gilmore
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.