PHP中“or”的奇怪用法

7

PHP的or是一个奇怪的关键字。以下是一个代码片段,让我感到困惑:

echo 0 or 1; // prints 1

$foo = (0 or 1);
echo $foo; // prints 1

$foo = 0 or 1;
echo $foo; // prints 0 for some reason

为什么最后一个输出为0而不是1?

人们实际上会写单词"or",而不是两个竖杠吗? - Incognito
1
当然。对于人们来说,“或”这样的词比罕见符号的组合(如“||”)更有意义。 - Emanuil Rusev
7个回答

21
这是因为不同的运算符优先级造成的。在第三种情况中,赋值操作首先被处理。它将被解释为:
($foo = 0) or 1;

|| 运算符的优先级不同。如果您使用

 $foo = 0 ||1;

它将按照您的预期工作。

请查看逻辑运算符手册


我会把它写成$foo = (0 or 1); - Treffynnon
@Trefynnon:不,or的优先级低于=。如果你使用||,那么你就是正确的。 - nico
@Treffynnon:但那将是另一种语句。 - You
@Pekka:太棒了!现在完全明白了。 - Emanuil Rusev
@Treffynnon现在有意义了!那是一个很好的和有效的解决方法,毫无疑问。 - Pekka
显示剩余4条评论

5
不会的,这是因为运算符优先级的缘故:
 $foo = 0 or 1;
 // is same as
 ($foo = 0) or 1;
 // because or has lower precedence than =

 $foo = 0 || 1;
 // is same as
 $foo = (0 || 1);
 // because || has higher precedence than = 

 // where is this useful? here:
 $result = mysql_query() or die(mysql_error());
 // displays error on failed mysql_query.
 // I don't like it, but it's okay for debugging whilst development.

4

这段代码是 ($foo = 0) or 1;or运算符优先级= 低。

在这种情况下,你应该使用 ||,因为它的优先级比 = 高,因此将按照你的预期进行评估。


0

如果我没记错,赋值运算符 (=) 的优先级比 or 高。因此,最后一行会被解释为:

($foo = 0) or 1;

这是一个将0赋值给$foo,但返回1的语句。第一条语句被解释为:

echo(0 or 1);

一个这样的代码会打印出1。


0

运算顺序。单词“or”的优先级比相应的“||”低得多。甚至比赋值运算符还要低。因此,首先进行赋值操作,而赋值的值是“or”的第一个操作数。

“or”更适合用于流程控制而不是逻辑运算。它让你可以这样说:

$x = get_something() or die("Couldn't do it!");

如果 get_something 被编码为在失败时返回 false 或 0。

0
在前两个代码片段中,您正在比较0或1(基本上是真或假)。在第三个代码片段中,您正在分配0,这有效,因此为真,因此不执行或条件。

0
在你的第三个例子中,= 运算符比 or 运算符具有更高的优先级,因此首先完成。|| 运算符,表面上相同,比 = 运算符具有更高的优先级。正如你所说,很有趣。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接