使用&&时,为什么这个循环返回1而不是'和'?

时间:2010-02-07 03:30:57

标签: logic php gearman

while($row = mysql_fetch_assoc($result) and $runningOK)循环中解决这个问题......如果使用PHP &&运算符代替and,那么mysql_fetch_assoc会非常失败并仅返回运行时编号1

我已经尝试了mysql_fetch_array()并且我仍然遇到1问题。只有当我用&&替换当前and语句时,才会返回正确的行。

我已经在之前,之内和之后放置了调试语句来确保这一点。我想知道这是一个PHP怪癖还是我无法解释的东西。

while

4 个答案:

答案 0 :(得分:9)

这是由于运营商的优先权。有关详细信息,请参阅the manual ...这是相关部分。

  

//“&&”优先级高于   “和”

     

//表达式的结果(true&& false)被分配给$ g
  //行为如:($ g =(true&& false))

     

$ g = true&&假;

     

//常量true指定给$ h,然后忽略false   //行为如:(($ h = true)和false)

     

$ h = true和false;

     

var_dump($ g,$ h);

     

布尔(假)
  布尔(真)

因此,使用&&,表达式的结果被赋值为true,其结果为1.使用和,它计算mysql函数的结果 - 我想要的更多,我想。

顺便说一句,您还可以使用break来消除对$ runningOK变量的需求。为此,请从and $runningOK条件中删除while并将$runningOK = FALSE;更改为break;,如果触发了阻止块,它将结束循环。

答案 1 :(得分:1)

试试这个:

while(($row = mysql_fetch_assoc($result)) and $runningOK)

可能会混淆,因为它正在评估mysql_fetch_assoc($result) and $runningOK为TRUE,然后将其分配给$row,在这种情况下与1相同

如果添加括号,您很可能会使用&&and,因为您将正确地分开两个评估。

这是替代语法的副作用我敢肯定。

答案 2 :(得分:1)

赋值运算符=和两个逻辑运算符&&AND具有different precedence&&=之前执行,其中转弯在AND

之前执行

所以基本上是声明:

$row = mysql_fetch_assoc($result) AND $runningOK

等于:

($row = mysql_fetch_assoc($result)) AND $runningOK

声明:

$row = mysql_fetch_assoc($result) && $runningOK

等于:

$row = (mysql_fetch_assoc($result) && $runningOK)

在最后一种情况下,您只需指定值1(如果mysql_fetch_assoc返回值)或0。

答案 3 :(得分:0)

这是因为运营商解决了偏见。

查看此表以了解:

http://php.net/manual/en/language.operators.precedence.php

当你不知道如何解决时,尽可能多地使用()。