PHP中的2行有什么区别?

时间:2012-07-07 07:33:32

标签: php jqgrid

我在jqGrid服务器端找到了PHP示例下一行

$start = $limit*$page - $limit; // do not put $limit*($page - 1)

之间有什么区别
$start = $limit*$page - $limit; 

$start = $limit*($page - 1);

为什么作者不推荐第二种方式?

7 个答案:

答案 0 :(得分:1)

在数学上,两个表达式都应该产生相同的结果 实际,因为CPU中的浮点算术(假设我们不考虑整数),这两个表达式的结果可能会有很大差异。

示例:
想象$page是一个非常大的数字 在这种情况下,表达式1中的$page - 1将被计算出来(因为1比$page小几个数量级),
表达式$start = $limit*($page - 1);等同于$start = $limit*$page;
在第一种方式中,我们没有这样的问题,这就是为什么建议它。

<强>结论:
在数学上,它没有任何区别 实际上,CPU(浮点运算单元)只能处理有限的数量级,而且当与大数字组合时,较小的数字通常会被计算出来。

修改 一个例子值得1000字......
看看这个小提琴,看看两个数学相同的表达式如何产生不同的结果:
http://jsfiddle.net/EyalAr/Z9BT5/

答案 1 :(得分:1)

我怀疑这是一个数学数学问题。假设$page很大,如6.02e231。然后

($page - 1) = 6.02e231  

(完全相同的浮点表示),以便

$limit*($page - 1) = $limit*$page

从任何处理器的角度来看。比较

$limit*$page = [SOME HUGE VALUE]
$limit*$page - $limit = [SUBTRACTION OF TWO HUGE VALUES]

将产生不同的结果,比“减1”表示法更准确。

因此,虽然在完美的数学世界中,这两个符号是相同的,但在非完美的计算世界中,第一个更容易发生“灾难性取消”(维基),而不是第二个。

答案 2 :(得分:0)

$start = $limit*$page - $limit; 

这将首先执行乘法运算,然后减去结果的限制

$start = $limit*($page - 1);

这将首先减去$ page by 1然后使用$ limit

多次

答案 3 :(得分:0)

就像在代数中一样,乘法在加法/减法之前按操作顺序发生。见PHP's precedence documentation。因此第一行执行$ limit * $ page,然后减去limit,这实际上与$page * ($limit-1)相同。

我认为提示远离它的原因是,在代数中,语句在数学上是相同的,但在编程中它们不是(parens被视为操作顺序指示而不是数量表示)

答案 4 :(得分:0)

通常不建议使用第二种方法,因为在较旧的语言/编译器中,第二种语句会产生-0-0在计算中产生了一些其他问题,因此,第一种方法是首选方法。

您可以在此处看到上述内容:Code in PHP(No -0 observed)Code in Lua(Observe -0 in output)

答案 5 :(得分:0)

老实说,我不明白为什么不推荐第二版。

$c = $a * $b - $a;

在抽象视图中,这将按如下方式计算:

  1. $a加载到CPU寄存器1中。
  2. $b加载到CPU寄存器2中。
  3. 将两个寄存器相乘,将结果存储到寄存器2中。
  4. $a仍在寄存器中1.从寄存器2中减去它,将结果存储在任一寄存器中。
  5. 将结果寄存器保存到$c
  6. 如果编译器发现等式中的两个$a操作数都相同,则整行只使用两个CPU寄存器。

    $c = $a * ($b - 1);
    
    1. $a加载到寄存器1中。首先应该这样做,因为就我记忆而言,PHP保证了从左到右的评估顺序。
    2. $b加载到寄存器2中。
    3. 递减寄存器2.这是一个单独的操作,因此不需要显式加载1
    4. 将寄存器1和2相乘,将结果存储在其中任何一个中。
    5. 将结果寄存器保存到$c
    6. 这看起来非常像我一样的努力。然后,他们可能已经描述了整个事物并发现由于某种原因(例如由于线的上下文),第一个版本更有效。

      假设整数算术,结果完全没有区别。我也不太共享浮点参数,因为如果$page是如此之大的数字,那么使用哪个版本仍然无关紧要。要么从非常大的数字中减去1,要么没有效果。或者,您将大数与1分别乘以相同的因子,然后执行减法。这两个值在数量级上与原始值$page1具有相同的差异。

答案 6 :(得分:-1)

程序员对准确性过于谨慎。

在数学上没有任何区别。

从程序员的角度来看,运算符优先级无关紧要,因为变量是基本数字。 (如果它们是foo classe与重载运算符的实例,那么故事就不同了)

$limit*$page - $limit形式可能会失去准确性,请参阅rody_o对此的回答。但这不会发生,因为我从未认为$ page和$ limit的数量级为10 ^ 38或其他。但是php知道如何处理数字。请记住,我们甚至不知道它们是漂浮物!

正如其他人也提到了执行速度,这不是程序员可能想到的。你真的关心在你的代码中写哪个表单吗?选择一种形式而不是另一种形式甚至不是微观优化。

没有理由告诉别人他们绝对不应该使用第二种形式。没关系。