php switch case的"bug"
首先说明,这不是一个bug。应该说是一个比较容易中招的陷阱。
今天使用switch遇到一个问题,代码如下:
<?php $num = 0;
switch ($price) {
case $price <= 100:
$price_between = "100以下";
break;
case $price < 1000:
$price_between = "800-1000";
break;
default:
$price_between = "1000以上";
break;
} echo $price_between;
//1000以上
<?php
$num = 0;
switch ($price) {
case $price <= 100:
$price_between = "100以下";
break;
case $price < 1000:
$price_between = "800-1000";
break;
default:
$price_between = "1000以上";
break;
}
echo $price_between;
//1000以上
当$price等于0时最终的结果不是预期的"100以下",而是"1000以上"。
问题的原因就是switch case在执行的流程是 switch 位置的条件和 case 位置的条件做比较,再继续执行程序。
a.当$price大于0时,switch位置的条件为“真” true,然后用true 和 case 位置的条件作比较。这时程序是没有问题的,因为只要case位置的条件为true语句就跳出了。
b.当$price等于0时,就需要注意了。这个时候switch位置的条件为“假” false,语句继续执行的时候,只有当 case 位置的条件也为false 程序才会执行 case 冒号位置后的程序。而事实是 case 位置的所有调教都为“真”,所以最终的结果是执行default冒号后的语句。
下面的程序是如何处理这个问题的正确方法。
<?php $price = 0;
switch (TRUE) {
case $price <= 100:
$price_between = "100以下";
break;
case $price < 1000:
$price_between = "800-1000";
break;
default:
$price_between = "1000以上";
break;
} echo $price_between;
//100以下
<?php
$price = 0;
switch (TRUE) {
case $price <= 100:
$price_between = "100以下";
break;
case $price < 1000:
$price_between = "800-1000";
break;
default:
$price_between = "1000以上";
break;
}
echo $price_between;
//100以下
把 switch 位置的值由 $price 改成了 true ,这样就可以了。
php switch case的"bug"的更多相关文章
- Android Studio快捷键switch case 轻松转换为if else
Android Studio快捷键switch case 轻松转换为if else 今天碰到的问题,没有找到资料,后面找到了方法,这个记下来,转载请注明出处:http://www.cnblogs.co ...
- java中的switch case
switch-case语句格式如下 switch(变量){ case 变量值1: //; break; case 变量值2: //...; break; ... case default: //... ...
- 为什么说在使用多条件判断时switch case语句比if语句效率高?
在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...
- c语言基础表达式, 关系运算符, 逻辑运算符, 位运算符, 数据的取值范围, 分支结构(if...else, switch...case)
1.表达式: 表达式的判断是有无结果(值), 最简单的表达式是一个常量或变量, 如:12, a, 3 + 1, a + b, a + 5 都是表达式 2.BOOL(布尔)数据类型: c语言中除了基本数 ...
- 运算符 与 分支语句:if ,else if,else;switch case
分支语句: if else if else : switch case --如何使用 if else if else: Console. ...
- switch...case和if...else if的判断应用
判断成绩所属等级的 两种方法 1... switch...case方法: #include<stdio.h> int main(void) { ;i <= ;++i) // ...
- go语言选择语句 switch case
根据传入条件的不同,选择语句会执行不同的语句.下面的例子根据传入的整型变量i的不同而打印不同的内容: switch i { case 0: fmt.Printf("0") case ...
- 简谈switch case
工作中从buff里截取了一个字符串,然后和配置文件中的字符串名字对比 ,如果一样,处理,不一样,elseif 再判断,再处理! switch(){case : case :...... }先说语法,再 ...
- 用Dictionary替换switch case
用switch case处理一个很长的判断,例如56个民族01代表汉族,02代表藏族,03代表壮族...,当传入数字想获取民族名称时就得写56个case,当传入民族获取背后的数字时,又得再写56个ca ...
随机推荐
- Ubuntu下常用强化学习实验环境搭建(MuJoCo, OpenAI Gym, rllab, DeepMind Lab, TORCS, PySC2)
http://lib.csdn.net/article/aimachinelearning/68113 原文地址:http://blog.csdn.net/jinzhuojun/article/det ...
- poj1985 / poj2631(树的直径)
poj1985 Cow Marathon 树的直径裸题 树的直径的一般求法: 任意一点为起点,dfs/bfs找出与它最远的点$u$ 以$u$为起点,dfs/bfs找出与它最远的点$v$ 则$d(u,v ...
- P4099 [HEOI2013]SAO(树形dp)
P4099 [HEOI2013]SAO 我们设$f[u][k]$表示以拓扑序编号为$k$的点$u$,以$u$为根的子树中的元素所组成的序列方案数 蓝后我们在找一个以$v$为根的子树. 我们的任务就是在 ...
- 20145219《网络对抗》Web基础
20145219<网络对抗>Web基础 基础问题回答 什么是表单? HTML表单用于收集用户输入,用<form>元素定义,包含不同类型的 input元素.复选框.单选按钮.提交 ...
- asp.net web api的源码
从安装的NuGet packages逆向找回去 <package id="Microsoft.AspNet.WebApi.Core" version="5.2.7& ...
- python 返回列表中的偶数
def is_even_num(l): enum = [] for n in l: == : enum.append(n) return enum print(is_even_num([, , , , ...
- vue项目打包部署到nginx 服务器上
假如要实现的效果如下 http://ip/vue =>是进入首页访问的路径是 usr/local/nginx/html/vue http://ip/website =>是进 ...
- [java]java String.split()函数的用法分析
转自:http://swiftlet.net/archives/709 一.在java.lang包中有String.split()方法的原型是: public String[] split(Strin ...
- Eclipse开发Android应用 找不到平板
1.驱动安装正确2.平板的连接方式正确,不要用大容量存储/sd卡模式这个设置在4.3上很难找呀.设置->存储->点右上角的菜单 3.打开USB调试.4.上述问题都检查后,在eclipse里 ...
- 如何写一篇好的技术博客or技术文档(转链接)
如何写一篇好的技术文档http://yunli.blog.51cto.com/831344/168352 程序员怎样才能写出一篇好的博客或者技术文章?http://www.zhihu.com/ques ...