奇怪的 for 循环语法

Posted

技术标签:

【中文标题】奇怪的 for 循环语法【英文标题】:Strange for loop syntax 【发布时间】:2017-04-09 00:30:45 【问题描述】:

我已经用 php 编程大约 2 年了。

我只是偶然发现了这个 for 循环:

    // Check the URI namespace for a context
    $wsDir = basename(dirname(__FILE__));
    $uriArr = explode("/", $_SERVER['REQUEST_URI']);

    for (
        $i = 0, $uriSize = sizeof($uriArr);
        $i < $uriSize && $uriArr[$i] != $wsDir && $i++;
    );

    $i++;
    self::$executionContext = isset($uriArr[$i]) && !empty($uriArr[$i]) && substr($uriArr[$i], 0, 1) != '?'
        ? strtoupper($uriArr[$i]) : 'SOAP';

我不知道这应该如何工作。

谁能给我解释一下?

【问题讨论】:

如果你找到写这篇文章的人,我有几个选择词给他们:P。 看起来它正在寻找 URI 中基目录的结束位置。 for 循环不需要块,它会无条件地执行第一个表达式一次。然后它将在第二个条件为真时执行。第三个条件是空的,意味着它什么都不执行。 PHP Docs 确实在示例 4 中表明它可以在没有语句块的情况下使用。 @R.Chappell 如果你仔细观察,你会发现 for 循环条件是 2,而不是 3。据我所知,这样做的唯一想法是初始化 $i @VasilShaddix 在for循环中第二个语句的末尾是一个;,表示有3个语句,只是第三个是完全空的。 【参考方案1】:

这只是一个普通的三部分 for 循环,没有主语句和空的第三部分。

来自manual:

for (expr1; expr2; expr3)
      statement

第一个表达式 (expr1) 在循环开始时无条件地计算(执行)一次。

在每次迭代开始时,都会评估expr2。如果计算结果为 TRUE,则循环继续并执行嵌套语句。如果结果为 FALSE,则循环的执行结束。

在每次迭代结束时,评估(执行)expr3

所以:

for (
    # initializes two variables
    $i = 0, $uriSize = sizeof($uriArr);

    # conditional, expr2
    $i < $uriSize && $uriArr[$i] != $wsDir && $i++;

    # no expr3
);

如果expr2 评估为真,则循环继续。当然没有要执行的语句或块,所以它只是跳转到下一个迭代,这意味着 expr2 将被重复执行,直到它在某个时候评估为 false。

正如 R. Chappell 在 cmets 中指出的那样,这可能是在字符串中找到一个位置。您可以用类似的逻辑但以更“描述性”的方式重写它:

$uriSize = sizeof($uriArr)

for ($i = 0; $i < $uriSize; $i++) 
    if ($uriArr[$i] == $wsDir) break;


# now $i will be the index of the first $wsDir occurrence in the $uriArr array

【讨论】:

这实际上让我很清楚。谢谢@sidyll 感谢@VasilShaddix,很高兴现在更清楚了。我刚刚用重写更新了答案 感谢您的提及 :)【参考方案2】:

来晚了,但似乎没有人缓存这个:这个for循环相当于:

$i = 1;

为什么?因为在 for 循环的条件部分,您有 3 个条件与 AND 绑定:

$i < $uriSize 
&&
$uriArr[$i] != $wsDir 
&&
$i++;

在第一次迭代中,$i++ 的计算结果为 0,相当于 false,并且仅在之后递增。所以循环只在一次迭代后停止,$i 是 1,你有一个错误。除非它是您的代码中的拼写错误...

【讨论】:

:-O 你真是个天才! 我也迟到了。在那之后我正在查看代码,我也看到了它。谢谢你。这其实是正确的答案。【参考方案3】:

这是在没有第三个语句的情况下使用 for 的另一个示例(不是这样的答案)。比原来的问题要清楚一点。

for ($i=0; $i >= $i++ && $i <= 10; /* third statement */ );
echo $i;

这基本上会计数到 10 并回显出来,并且只能通过 PHP 中的 increment 运算符实现。

首先我们将$i设置为零;

其次,我们检查并增加 $i 以确保它等于或大于自身,同时小于或等于 10。

第三,我们什么都不做......真的没有意义......

但是,普通人会写同样的东西:

for ($i = 0; $i <= 10; $i++);
echo $i;

你必须想出一个更好的用例,是的,你可以做$i = 10;,但这并不能解释问题。

【讨论】:

以上是关于奇怪的 for 循环语法的主要内容,如果未能解决你的问题,请参考以下文章

C 中完整的“for”循环语法是啥?

奇怪的蟒蛇“嵌套” for循环

语句不能以 for 循环上的闭包语句开头

Shell语法—— for 循环

for循环语法及for循环脚本例子

for循环的语法及作用