2009-09-04 53 views

Trả lời

82

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

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

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

+56

Khi 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

+0

Lưu ý phụ: sau 15 năm làm việc với Matlab hầu như hàng ngày tôi luôn luôn sử dụng '&' và nó chưa bao giờ cắn tôi trong ass. OTOH, tôi biết nhiều người khó chịu khi sử dụng '&&' vì họ phải nhớ 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ông bao giờ daisy- chuỗi các toán hạng của tôi để tiết kiệm hiện nay là không đáng kể). – neuronet

+0

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

8

Cả hai đều là logic và hoạt động. Tuy nhiên, & & là một toán tử "ngắn mạch". Từ tài liệu MATLAB:

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

Xem thêm here.

3

& & và || là các toán tử short circuit hoạt động trên vô hướng. & và | luôn luôn đánh giá cả hai toán hạng và hoạt động trên mảng.

5

Tương tự như các ngôn ngữ khác, '&' là một nhà điều hành Bitwise logic, trong khi '& &' là một hoạt động hợp lý.

Ví dụ: (tha thứ cho cú pháp của tôi).

Nếu A = [Đúng Đúng Sai Đúng] B = False

Một & B = [false false false False]

..or nếu B = True Một & B = [True Đúng false đúng]

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

x = (b ~ = 0) & & (a/b> 18,5)

Hope đó là rõ ràng.

11

Như đã được đề cập bởi những người khác, &logical AND operator&&short-circuit AND operator.Họ khác nhau về cách thức các toán hạng được đánh giá cũng như dù có hoặc không hoạt động trên các mảng hoặc vô hướng:

  • & (và nhà điều hành) và | (OR) có thể hoạt động trên mảng trong thành phần- thời trang 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 đầu tiên. Đây chỉ có thể hoạt động trên vô hướng, không phải mảng.
24

&&|| lấy đầu vào vô hướng và đoản mạch luôn. |& lấy đầu vào mảng và chỉ 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 these doc pages để biết thêm thông tin.

+0

Bạn có bất kỳ thông tin nào về các phiên bản Matlab tắt '&' và '|' trong câu lệnh if/while không? Nó không có vẻ là trường hợp trong R2012b và R2014a. – Tim

+0

@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ạ ... – neuronet

2

Một nguyên tắc nhỏ khi xây dựng luận cứ cho việc sử dụng trong báo cáo có điều kiện (IF, WHILE, vv) là luôn sử dụng & &/|| hình thức, trừ khi có một lý do rất tốt 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 như 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 viết mã đầy đủ để quyết định ý định của bạn cho đối số vectơ. Khi a = [1 0 0 1] và b = [0 1 0 1], là & b đúng hay sai? Tôi không thể nhớ các quy tắc cho & của MATLAB, 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 KHÔNG ĐƯỢC 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 của MATLAB vectơ trong & và |, dẫn đến mã có chi tiết hơn một chút, nhưng an toàn hơn và dễ bảo trì hơn.

+1

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

+0

Điểm tốt, Jonas. Tôi đã suy nghĩ về điều kiện, không phải "lập chỉ mục logic" (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 viết của tôi để phản ánh điều đó. Cảm ơn lời nhắc! –

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