【问题标题】:OR Preference changing with a return或 偏好随着退货而改变
【发布时间】:2018-07-25 13:41:38
【问题描述】:

从我所见,运算符优先级在这两个示例中是有意义的:

$a = false;
$b = true;
$c = $a || $b;

这里 $c 是 true

$a = false;
$b = true;
$c = $a or $b;

这里 $c 是 false


我理解它背后的原因。但是如下:

$a = false;
$b = true;
return $a or $b;

返回真,这让我很困惑。

这是什么原因?

【问题讨论】:

  • 这在the manual for PHP operators中有记录。
  • @Qirel 它在哪里提到运算符优先级不适用于返回语句?
  • 运算符优先级仅适用于运算符。 return 不是操作员。如果该页面明确列出了运算符优先级适用的所有内容,那么它将有几百页长。

标签: php operator-precedence comparison-operators


【解决方案1】:

or 的优先级低于=,因此:

$c = $a or $b;

变成这样:

($c = $a) or $b;

但这没有意义:

(return $a) or $b;

所以你得到了这个:

return ($a or $b);

【讨论】:

  • 但这仍然是问题的答案,对吧?为什么返回$b
  • 它不返回$b,它返回($a or $b)false or truetrue
  • @Gobbin 因为$afalse...!?
  • 如果您了解return 不是运算符,这就是答案。 @deceze 在他的回答中很好地解释了这一点。考虑执行顺序。如果您评估(return $a) or $b,那么您将首先评估return $a,然后......您如何处理or $b 部分?你不能用它做任何事情,因为你已经回来了。也就是说,它没有意义。
  • 我同意这没有意义,但我一直在寻找技术解释,“PHP 做 A 而不是做 B,因为 B 没有意义”不是技术解释。
【解决方案2】:

在表达式中,运算符优先级适用。 =||or 都是运算符,$c = $a or $b 是表达式。并根据运算符优先级计算为($c = $a) or $b

但是,return 是一个声明return 不是运算符,也不按运算符优先级分组。它始终评估为return <expression>,因此始终为return ($a or $b)

表达式 $c = $a or $b 的结果是true BTW。在表达式过程中$c 被分配false,但表达式整体返回值true ($b)。所以即使这样return true:

return $c = $a or $b;

【讨论】:

  • 感谢您的回答。这确实有道理。但是,表达式 $c = $a 或 $b 的结果不正确。 return $c = $a 或 $b 确实返回 true,但我认为这是因为 php 将其转换为 return ($c = $a) 或 $b;
  • 整个表达式$c = $a or $b的结果true。当然,$c 最终不会是 true,但表达式结果是。见3v4l.org/c6gqP
  • 啊,我理解错了!是的,这是有道理的。谢谢!
猜你喜欢
  • 2014-10-14
  • 2022-01-19
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多