文档章节

php中switch语句执行的过程

l
 lgx123
发布于 2016/05/11 13:45
字数 934
阅读 89
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

    switch语句大家都很熟悉,各种书籍都会提及到它,但是大多数书中只给出了它的大概执行流程,有一些特殊的情况和具体的细节在书中并没有详细介绍。最近重看php语法的时候,实验了一些特殊的情况,虽然在实际的编程中不会这样写(这样写代码应该会被骂死),但是可以加深对switch语句的理解。

   声明: 这里的例子只是在php中实验过,其他语言的结果不一定和这里的一样。

    w3school上对switch的工作原理解释如下:

  1. 对表达式(通常是变量)进行一次计算
  2. 把表达式的值与结构中 case 的值进行比较
  3. 如果存在匹配,则执行与 case 关联的代码
  4. 代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
  5. 如果没有 case 为真,则使用 default 语句

   工作原理解释 出自:http://www.w3school.com.cn/php/php_switch.asp

 

细节1:

    当把default语句放在case语句中间,而不是所有case语句的最后时,比较到default语句后,会不会直接执行default语句,还是跳过default语句比较接下来的case的值?例子如下:

$num = 2;
switch($num)
{
    case 1:
        echo 1;
        break;
    default:
        echo 0;
        break;
    case 2:
        echo 2;
        break;
}

本例的结果是输出 2 ,说明表达式的值与case的值进行比较的阶段,会自动跳过default语句。

具体的流程是:$num与1比较,结果为false;然后$num与2比较,结果为true,执行echo 2和break这两条语句。

 

 

细节2:

    由细节1可以知道比较case值的时候会跳过default语句,那比较某个case值后结果为true,但是该case语句中没有break语句的时候(原理上是会一直执行,直到遇到break或者switch语句结束),会不会也跳过default语句呢?例子如下:

$num = 1;
    switch($num)
    {
        case 1:
            echo 1;
        default:
            echo 0;
        case 2:
            echo 2;
    }

本例的结果是输出 102 ,说明这种情况下,default语句不会被跳过。

具体的流程是:$num与1比较,结果为true。执行echo 1,该case语句中没有break语句,所以继续执行下去,执行default中的echo 0,default中也没有break语句,所以继续执行case 2中的echo 2 。 

由这个例子外面也可以知道,当default语句在case语句中间,default语句中没有break语句的时候,也会继续执行接下来的语句(echo 2)。

 

细节3:

    当有两个以上的case的值一样时,会执行哪一个case语句,还是会报错?例子如下:

    $num = 1;
    switch($num)
    {
        case 1+0:
            echo "1+0";
            break;
        default:
            echo 0;
            break;
        case 1:
            echo 1;
            break;
        case 0+1:
            echo "0+1";
            break;
    }

本例的结果是输出  1+0,说明有两个以上的case的值一样时,不会报错,而且会按照正常的方法进行一个一个的比较,在最前面的case语句会被最先匹配,所以会被执行。

具体的流程是:$num与1+0比较,结果为true。执行echo "1+0"和break语句。

 

 

 

l
粉丝 0
博文 3
码字总数 2104
作品 0
广州
私信 提问
加载中
请先登录后再评论。
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.6K
7
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.6K
0
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.3K
16
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

在后CoVID-19世界中,网络安全将如何变化?

随着世界向云迁移,围绕企业如何解决钓鱼***和勒索软件***的争论不断。 作者:Cassie 编译来源:千家网|2020-08-03 11:13 收藏 分享 随着世界向云迁移,围绕企业如何解决钓鱼***和勒索软件*...

osc_56801rv0
4分钟前
0
0
2020黑帽大会的11大网络安全工具

在8月1日至8月6日举行的线上虚拟活动上,将有130多位安全大咖展示数十种新工具、框架和方法,以保护软件、固件、硬件和移动系统免受各种威胁的侵害,以下是我们精选出的十一大安全工具。 作者...

osc_flwkfqx5
5分钟前
0
0
课程表1(广度搜索之拓扑排序)

你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1] 给...

osc_yf4y1952
6分钟前
0
0
如何检查SQL Server表中是否存在列? - How to check if a column exists in a SQL Server table?

问题: I need to add a specific column if it does not exist. 如果它不存在,我需要添加一个特定的列。 I have something like the following, but it always returns false: 我有类似以下......

javail
7分钟前
0
0
NB-IOT覆盖范围有多大 NB-IOT的强覆盖是怎么实现的

  NB-IoT技术自出现以来就以其强大的覆盖范围和通讯距离长而受到广泛的欢迎,发展到现在已经成为万物互联网络中的一个重要分支。那么NB-IoT覆盖范围到底有多大,是怎么来衡量其覆盖能力?  ...

osc_yozufu01
7分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部