案件陈述输出不正确?

案件陈述输出不正确?

问题描述:

这是很奇怪的,但下面是我的case语句:案件陈述输出不正确?

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>"; 
+2

开关的情况下工作得非常不同于IF-elseif-否则,这是你在这里要做的。 – BoltClock

+2

比较不同于你开启的变量可能会导致'SAN'损坏(不要这么做)。范围检查通常以下限包含,上限排他(所以,“$ average> = 60 && $ average

的if/else你应该使用 - 声明:

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

正如在评论中提到他人的情况下的“条件”应该是一个静态值,而不是一个逻辑表达式。

此外,您打开的值(在您的情况下,$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呢?使用级联声明像一个开关或的if-else,可以消除一些冗余的(在这种情况下损坏)的代码,从而:

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

...等,到任何最低级的你”重新使用。

+1

Mayur,你应该看看PHP手册:http://www.php.net/manual/en/control-structures.switch.php –

对于那些你说开关变量你$average你错了。在这种情况下评估的唯一原因是因为开关使用宽松比较,所以它说$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或错误。这个想法是,只有一个语句应该一次返回true,因此switch语句会将它的true值与传递并执行该代码的语句的值相匹配,因为所有其他语句都是false并且不匹配。

编辑:或者,也可以计算出$grade值(50-100在本例中):

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

开关循环比较例。如果你真的想用开关的工作(而不是如果/ ELSEIF /人),那么你就可以用比较反对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)); 
}