首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切换评估

切换评估
EN

Stack Overflow用户
提问于 2012-08-10 15:26:00
回答 3查看 325关注 0票数 0

最近,我讨论了switch如何处理比较,并需要帮助解决这个问题。

如果我编写了一个switch,如:

代码语言:javascript
复制
switch ($x){
    case ($x > 5):
        echo "foo";
        break;
    case ($x < 5):
        echo "bar";
        break;
    default:
        echo "five";
        break;
}

它相当于哪条if语句?A还是B

代码语言:javascript
复制
// A

if ($x > 5) {
    echo "foo";
} elseif ($x < 5) {
    echo "bar";
} else {
    echo "five";
}

// B

if ($x == ($x > 5)) {
    echo "foo";
} elseif ($x == ($x < 5)) {
    echo "bar";
} else {
    echo "five";
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-10 15:33:45

请允许我向大家澄清:

它与B**.** 等价

它不是“两者兼而有之”,它有时不是它的一个,有时是另一个,它总是B。要理解为什么有时会看到可能是A的结果,您需要了解类型强制在PHP中的工作方式

如果将falsey值传递给switch的“参数”,并且在case中使用表达式,从而产生布尔值,则只有当表达式的计算结果为FALSE时,它们才会匹配。

switch基本上是一个巨大的if/elseif树,它在传递给switch (表达式左侧)的值与cases中的表达式(右侧)之间执行松散的比较(==而不是===)。

这个可以证明与您的代码有很好的不同之处:

代码语言:javascript
复制
$x = 0;

switch ($x) {
  case $x > -1: // This is TRUE, but 0 == FALSE so this won't match
    echo "case 1";
  case $x == -1: // This is FALSE, and 0 == FALSE so this will match
    echo "case 2";
}

如果我们将其转换为两个if/elseif树:

一个

代码语言:javascript
复制
$x = 0;

if ($x > -1) {
  // It matches here
  echo "case 1";
} else if ($x == -1) {
  // and not here
  echo "case 2";
}

B

代码语言:javascript
复制
$x = 0;

if ($x == ($x > -1)) {
  // It doesn't match here
  echo "case 1";
} else if ($x == ($x == -1)) {
  // ..but here instead
  echo "case 2";
}
票数 5
EN

Stack Overflow用户

发布于 2012-08-10 15:29:23

那个开关箱相当于B。

编辑:

例如,如果$x等于0:

$x >5将计算为false (0也将计算为false ),因此第一个if将打印条形图,而第二个则将打印foo。开关将被转换为如下所示:

代码语言:javascript
复制
switch ($x){
    case false:
        echo "foo";
        break;
    case true:
        echo "bar";
        break;
    default:
        echo "five";
        break;
}

这将打印foo (与B相同)

编辑2 :

我试过了,所以这让我:

使用$x =0 =>开关(foo),如果A (bar),如果B (foo)

用$x =5 =>开关(5),如果A(5),如果B(5)

$x =7 =>开关(foo),if A (foo),if B (foo)

票数 2
EN

Stack Overflow用户

发布于 2012-08-10 15:33:31

您的示例等价于B

如果您想在您的交换机中使用比较(并且等效于A),您可以这样写:

代码语言:javascript
复制
switch (true) { // Use true instead of $x
    case ($x > 5):
        echo "foo";
        break;
    case ($x < 5):
        echo "bar";
        break;
    default:
        echo "five";
        break;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11904754

复制
相关文章

相似问题

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