首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么对于‘`continue`’来说,‘`switch`’被认为是一个循环结构?

为什么对于‘`continue`’来说,‘`switch`’被认为是一个循环结构?
EN

Stack Overflow用户
提问于 2012-01-27 03:47:07
回答 3查看 1.4K关注 0票数 19

我只是因为假设了以下几点而被咬了:

代码语言:javascript
复制
foreach ($arr as $key => $value) {
  switch($key) {
    // ... some other cases
    default:
      continue;
      // ^== assumption: move on to the next iteration of the foreach
      //     actual PHP: treat this continue just like a break
  }
  // ...
}

但事实上,根据documentation for continue的说法

为了继续,switch语句被视为循环结构。

对于PHP语言设计者来说,这种选择是有原因的吗?据我所知,switch不是一个循环控制结构,那么在这种情况下为什么要把它当作一个循环控制结构呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-27 04:38:35

我认为你不会为这种行为找到任何真正的“理由”。

这种行为背后唯一的真正动机可能是,将switch作为循环结构来实现,允许PHP重用循环的现有breakcontinue语义,而不是为switch重新实现特殊版本。

或者更积极的说法是:这是为了一致性。

票数 3
EN

Stack Overflow用户

发布于 2012-01-27 04:28:20

我能想到的最好的解释是PHP认为它是一个循环结构,所以它适合使用continuebreak的模型。除了以下内容之外,switch文档并没有对其进行更深入的说明

请注意,与某些其他语言不同,continue语句适用于switch,其作用类似于break。如果在循环中有一个switch,并且希望继续执行外部循环的下一次迭代,请使用continue 2。

因此,这可能是因为,就像循环一样,它会停止其结构中其余代码的执行。

但是,当您使用多个级别时,这两个级别的行为完全不同:

没有level的continue

代码语言:javascript
复制
<?php
for($i=0;$i<5;$i++) {
    switch($i) {
        case 2:
            continue;
        default:
            echo $i, "\n";
    }
    echo "Finished with {$i}\n";
}
//0
//Finished with 0
//1
//Finished with 1
//Finished with 2
//3
//Finished with 3
//4
//Finished with 4

具有levelcontinue

代码语言:javascript
复制
<?php
for($i=0;$i<5;$i++) {
    switch($i) {
        case 2:
            continue 2;
        default:
            echo $i, "\n";
    }
    echo "Finished with {$i}\n";
}
//0
//Finished with 0
//1
//Finished with 1
//3
//Finished with 3
//4
//Finished with 4

没有levelbreak

代码语言:javascript
复制
<?php
for($i=0;$i<5;$i++) {
    switch($i) {
        case 2:
            break;
        default:
            echo $i, "\n";
    }
    echo "Finished with {$i}\n";
}
//0
//Finished with 0
//1
//Finished with 1
//Finished with 2
//3
//Finished with 3
//4
//Finished with 4

具有levelbreak

代码语言:javascript
复制
<?php
for($i=0;$i<5;$i++) {
    switch($i) {
        case 2:
            break 2;
        default:
            echo $i, "\n";
    }
    echo "Finished with {$i}\n";
}
//0
//Finished with 0
//1
//Finished with 1
票数 7
EN

Stack Overflow用户

发布于 2012-01-27 23:29:04

据我所知,switch不是一个循环控制结构,所以在这种情况下,为什么要把它当作一个循环控制结构呢?

一次迭代不符合循环的要求吗?这同样适用于foreach中的while,例如,它只迭代一次:

代码语言:javascript
复制
foreach (range(1,2) as $value)
{
    $i = 0;
    while (!$i++)
    {
       continue;
    }
    echo $value, "\n";
}

它也会回显这些值,而不是continue foreach循环;它与while相关。

如果您的期望是switch类似于if (事实并非如此),那么您可能不会期望continue的行为,但是我非常确定对于while,您会期望它。

但是,如果您真的认为if类似于switch,那么breakcontinue的工作方式有什么不同呢

所以我不会说它有那么大的混乱,只是switch是一个控制结构,有一个循环的衣服。由于我们通常使用break (您期望它会工作),所以continue的行为并不是那么广为人知。仅此而已。或者,为什么期望continue不像switch中的break那样工作

因此,原因可能是让breakcontinue对齐。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9024271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档