MATLAB中的&和&&有什么区别?


Answers:


93

单个&符是逻辑AND运算符。双&符&&还是一个逻辑AND运算符,采用短路行为。短路仅表示仅当第一个操作数(左侧)未完全确定结果时才评估第二个操作数(右侧)

A和B(评估A和B)

A && B(仅当A为真时才评估B)


75
警告:&可以在数组上运行,但&&只能在标量上运行。
gnovice

旁注:在Matlab工作了15年后,几乎每天都会使用“&”,它从来没有咬过我。太太了,我知道很多人因为使用'&&'而感到恼火,因为他们必须记住它不是通用的(是的,我意识到'&'效率不高,因为它不会短路,但我几乎从来不雏菊-链接我的操作数,因此如今的节省可忽略不计)。
eric

7
@neuronet并不是真正意义上的效率,更多的是它允许第一个表达式保证条件的构造,否则第二个表达式可能会导致运行时错误。例如 d != 0 && 1/dvs- d !=0 & 1/d第一个保证不被零除,第二个不保证。
弗雷泽

2
这个答案是不完整和不准确的。&如果if声明,则发生短路。并&&采用标量输入。@Loren在下面的答案是正确的。
克里斯·伦戈

2
还要注意,Loren是MathWorks的雇员。答案没有比这更有权威性的了。如果您愿意做出牺牲,则可以标记答案以删除一个mod(您不能自己删除它,因为它已被接受)。您将保留从中获得的代表(如果我正确理解系统的话),我们最终将获得技术上正确且权威的最佳答案。
安德拉斯·迪克

35

&&||接受标量输入并始终短路。 |&仅在if / while语句中采用数组输入和短路。对于分配,后者不会短路。

有关更多信息,请参见这些文档页面


1
您是否了解有关哪个Matlab版本快捷方式&以及|if / while语句的信息?R2012b和R2014a似乎并非如此。
蒂姆(Tim)

@Loren知道他们为什么设计一个只能与标量一起使用的想法吗?似乎很奇怪……
eric 2015年

@neuronet:如果对阵列进行操作,则无法短路。
Cris Luengo

17

正如其他人已经提到的,&逻辑AND运算符&&短路AND运算符。它们在操作数的求值方式以及是否对数组或标量进行运算方面有所不同

  • &(AND运算符)和|(OR运算符)可以按元素方式对数组进行运算。
  • &&||是短路版本,仅当结果未完全由第一个操作数确定时才评估第二个操作数。这些只能在标量上运行,不能在数组上运行。

8

两者都是逻辑与运算。尽管&&是“短路”运算符。从MATLAB文档中:

它们是短路运算符,因为它们仅在第一个操作数未完全确定结果时才评估第二个操作数。

在这里查看更多。


6

与其他语言类似,&是逻辑按位运算符,&&而是逻辑运算。

例如(请原谅我的语法)。

如果..

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

..要么..

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

对于&&,仅当左操作数为true时才计算右操作数,并且结果为单个布尔值。

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

希望很清楚。


3
它不是按位的,而是元素的。
Cris Luengo

3
十年后,我是否真的感到满意?😺
埃里克·克贝尔

到目前为止,这个问题的浏览量约为11.5万,这意味着很多人在这里阅读了错误的信息。其中许多答案不完整或包含错误信息。您需要做的就是修正您的答案或将其删除。BTW:bitand是MATLAB中按位逻辑AND运算符。
克里斯·伦戈

4

&&和|| 是在标量上运行的短路运算符。&和| 对数组进行运算,并且仅在或循环表达式的上下文中使用短路ifwhile


2

构造用于条件语句(IF,WHILE等)的参数时,一个好的经验法则是始终使用&& / || 形式,除非有很好的理由不这样做。有两个原因...

  1. 正如其他人提到的,&& / ||的短路行为 与大多数类似C的语言相似。这种相似性/熟悉度通常被认为是有利的。
  2. 使用&&或|| 表格会迫使您编写完整的代码,以决定使用向量参数的意图。当a = [1 0 0 1]和b = [0 1 0 1]时,a&b是正确还是错误?我不记得MATLAB的&规则,对吗?大多数人做不到。另一方面,如果使用&&或||,则必须编写“完整”代码来解决该问题。

这样做,而不是依赖MAT​​LAB在&和|中的矢量分辨率,会导致代码更加冗长,但更安全,更易于维护。


1
+1,但应注意,您的答案仅适用于您希望运算的最终结果为标量的情况。&和|有许多用途。其中&&和|| 之所以没有用,是因为它们无法返回数组,例如在进行类似“选择1到2之间的所有r”的奇特索引时r((r<2)&(r<2))
乔纳斯·海德堡

好点,乔纳斯。在撰写本文时,我想到的是条件式的,而不是“逻辑索引”(您提到的MATLAB术语“ fancy indexing”)。我更改了帖子的第一句话以反映这一点。感谢您的提醒!
鲍勃·吉尔摩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.