案例陈述输出不正确?

时间:2011-10-31 23:49:08

标签: php switch-statement

这很奇怪,但下面是我的个案陈述:

switch($grade){
    case ($average >70):
    $grade = 'A';
    break;
    case ($average >=60 && $average <=69):
    $grade = 'B';
    break;
    case ($average >=50 && $average <=59):
    $grade = 'C';
    break;

};

因此,如果它的70+是A级,60-69级B级,50-59级C。

但相反它输出:60+ A级,50-59 B级,40-49 C级。

为什么这样做是因为功能似乎正确?

    echo "<p><strong>Average Mark:</strong> $average</p>";
    echo "<p><strong>Average Grade:</strong> $grade</p>";

4 个答案:

答案 0 :(得分:6)

正如其他人在评论中提到的,案例中的“条件”应该是静态值,而不是逻辑表达式。

此外,您正在开启的值(在您的情况下,$grade)应该是您正在测试的值。您似乎正在使用它作为您分配的变量的提示。

修复代码的最简单方法是使用if-elseif-else结构:

if ($average >70)
    $grade = 'A';
elseif ($average >=60 && $average <=69)
    $grade = 'B';
elseif ($average >=50 && $average <=59)
    $grade = 'C';

但是,为了反常,并说明switch语句的工作原理,您还可以执行以下操作:

switch(true){
    case ($average >70):
        $grade = 'A';
        break;
    case ($average >=60 && $average <=69):
        $grade = 'B';
        break;
    case ($average >=50 && $average <=59):
        $grade = 'C';
        break;
};

在这个例子中,我依次将值true与每个案例进行比较,其中每个案例值实际上是评估布尔表达式的结果。将触发其值与true匹配的第一个表达式。

如果您不理解switch语句,可能没什么帮助。

编辑:我刚刚注意到逻辑上存在差距:如果有人的平均值恰好是70,该怎么办?使用像switch或if-else这样的级联语句,可以消除一些冗余(在这种情况下是破坏性的)代码,因此:

if ($average >=70)
    $grade = 'A';
elseif ($average >=60)
    $grade = 'B';
elseif ($average >=50)
    $grade = 'C';
// ...
else
    $grade = 'F';

...依此类推,无论你使用的是什么最低等级。

答案 1 :(得分:2)

对于那些说切换变量的人$average你错了。它在该实例中进行评估的唯一原因是因为switch使用松散比较,所以它说$average 被设置是真的并且将它与条件比较,所有这些都是真或假。以前,使用未设置的$grade会将开关评估为false,因为在松散比较中,未设置的变量将抛出通知并返回false。

虽然我建议使用if-then-else,但在这种情况下使用switch语句的正确的答案如下:

switch (true) {
    case ($average >= 70):
        $grade = 'A';
        break;
    case ($average >= 60 && $average < 70):
        $grade = 'B';
        break;
    case ($average >= 50 && $average < 60):
        $grade = 'C';
        break;
}

如上所述,每个语句都将返回true或false。这个想法是只有一个语句应该一次返回true,因此switch语句会将它的值true与仅传递和执行该代码的一个语句匹配,因为所有其他语句都是false并且不匹配

答案 2 :(得分:1)

你应该使用if / else - statements:

if($average >70)
{
   $grade = 'A';
} else if($average >=60 && $average <=69)
{
   $grade = 'B';
} else if($average >=50 && $average <=59)
{
   $grade = 'C';
}

答案 3 :(得分:0)

修改:或者您可以计算$grade值(本例中为50-100):

$grades = "CBAAA";
$grade = $grades[(int)($average/10) - 5];

开关循环比较案例。如果你真的想使用switch作为工作(而不是if / elseif / else),那么你可以使用一个与TRUE进行比较的开关来实现:

switch(TRUE)
{
    case $average > 70:
        $grade = 'A';
        break;

    case $average >= 60 && $average <= 69:
        $grade = 'B';
        break;

    case $average >= 50 && $average <= 59:
        $grade = 'C';
        break;

    default:
        throw new Exception(sprintf('Unable to map average (%d) to a grade.', $average));
}