C语言switch使用之诡异用法详解

关于switch的用法这里不再做什么总结了,其实这个是一个便捷的快速跳转条件切换器。而关于这个功能最常用的技术讨论点在于case后面的break以及default。这里不讨论这些,直接看下面的代码:

#include"stdio.h"

int main(void)
{
    int num = 0;
    switch(num)
    {
       printf("functionrun!\n");
    }
    return 0;
}

上面的代码中用到了一个switch,但是代码块中没有任何case以及default。代码语法有问题吗?

编译一下如下:

E:\WorkSpace\02_技术实践\01_编程语言\01_C语言\02_C和指针\switch>gcc switch.c

E:\WorkSpace\02_技术实践\01_编程语言\01_C语言\02_C和指针\switch>

由上面的结果可以看到,编译没有任何问题。那么运行会是什么状态呢?会把这个唯一的printf执行输出相应的语句?

运行如下:

E:\WorkSpace\02_技术实践\01_编程语言\01_C语言\02_C和指针\switch>a

E:\WorkSpace\02_技术实践\01_编程语言\01_C语言\02_C和指针\switch>

如此看,就有点诡异了。这个printf语句是没有执行到的!也就是说,switch语句中的代码执行必须得有case标签指示代码的入口。这种行为很让人联想到一种情况的程序执行结果,代码如下:

#include"stdio.h"

int main(void)
{
    int num = 0;
    switch(num)
    {
       int i = 123;
       printf("functionrun!\n");
       default:
           printf("value of iis:%d\n",i);
           break;
    }
    return 0;
}

代码是在之前的代码中修改的,代码的第二个printf会执行,可是执行的时候i的数值是多少呢?从之前的测试可以看出,局部变量后面的代码是没有执行过的,那么我这个i在每次函数执行到这里的时候会每次动态性初始化吗?

代码编译运行结果:

E:\WorkSpace\02_技术实践\01_编程语言\01_C语言\02_C和指针\switch>gcc switch.c

E:\WorkSpace\02_技术实践\01_编程语言\01_C语言\02_C和指针\switch>a value of i is:2

E:\WorkSpace\02_技术实践\01_编程语言\01_C语言\02_C和指针\switch>

从上面的结果可以得出两个结论:

1,代码块中的声明定义是起作用的;

2,i的数值不是123证明这部分的局部变量并没有进行每次的动态初始化。

说起来这也是够奇怪的一个特点,印象中之前看《C专家编程》的时候似乎看到过一个类似的描述,但是那时候C语言的水平看《C专家编程》一点也看不懂。只是留下了一个模模糊糊的印象,至于是否是一个问题,有空还是得会去查查。

以上这篇C语言switch使用之诡异用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言switch 语句的用法详解

    C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况.例如,输入一个整数,输出该整数对应的星期几的英文表示: #include <stdio.h> int main(){ int a; printf("Input integer number:"); scanf("%d",&a); if(a==1){ printf("Monday\n&q

  • 详解C语言中条件判断语句if和switch的用法

    if 语句 用 if 语句可以构成分支结构,它根据给的条件进行判定,以决定执行哪个分支程序段. C 语言的 if 语句有三种基本形式 第一种形式: if(条件表达式) { 语句1: } if(条件表达式) { 语句1: } 这种形式运行顺序为:当条件表达式为真,执行语句1,否则,直接跳过语句1,执行后面的语句. 例子1: BOOL result = YES: if(result) { printf("result is true\n"); } BOOL result = YES: if

  • C语言switch使用之诡异用法详解

    关于switch的用法这里不再做什么总结了,其实这个是一个便捷的快速跳转条件切换器.而关于这个功能最常用的技术讨论点在于case后面的break以及default.这里不讨论这些,直接看下面的代码: #include"stdio.h" int main(void) { int num = 0; switch(num) { printf("functionrun!\n"); } return 0; } 上面的代码中用到了一个switch,但是代码块中没有任何case以

  • Java switch关键字原理及用法详解

    这篇文章主要介绍了Java中 switch关键原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Switch语法 switch作为Java内置关键字,却在项目中真正使用的比较少.关于switch,还是有那么一些奥秘的. 要什么switch,我有if-else 确实,项目中使用switch比较少的一个主要原因就在于它的作用能被if-else代替,况且switch对类型的限制,也阻碍了switch的进一步使用. 先看看switch的语法

  • C语言fgetc和fputc函数用法详解(以字符形式读写文件)

    在C语言中,读写文件比较灵活,既可以每次读写一个字符,也可以读写一个字符串,甚至是任意字节的数据(数据块).本节介绍以字符形式读写文件. 以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符.主要使用两个函数,分别是 fgetc() 和 fputc(). 字符读取函数 fgetc fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符.fgetc() 的用法为: int fgetc (FILE *fp); fp 为文件指针.fgetc() 读

  • Go语言学习之数组的用法详解

    目录 引言 一.数组的定义 1. 语法 2. 示例 二.数组的初始化 1. 未初始化的数组 2. 使用初始化列表 3. 省略数组长度 4. 指定索引值的方式来初始化 5. 访问数组元素 6. 根据数组长度遍历数组 三. 访问数组元素 1. 访问数组元素 2. 根据数组长度遍历数组 四.冒泡排序 五.多维数组 1. 二维数组 2. 初始化二维数组 3. 访问二维数组 六.向函数传递数组 1. 形参设定数组大小 2. 形参未设定数组大小 3. 示例 总结 引言 数组是相同数据类型的一组数据的集合,数

  • Go语言学习之反射的用法详解

    目录 1. reflect 包 1.1 获取变量类型 1.2 断言处理类型转换 2. ValueOf 2.1 获取变量值 2.2 类型转换 3. Value.Set 3.1 设置变量值 3.2 示例 4. 结构体反射 4.1 查看结构体字段数量和方法数量 4.2 获取结构体属性 4.3 更改属性值 4.4 Tag原信息处理 5. 函数反射 6. 方法反射 6.1 使用 MethodByName 名称调用方法 6.2 使用 method 索引调用方法 反射指的是运行时动态的获取变量的相关信息 1.

  • Go语言学习之指针的用法详解

    目录 引言 一.定义结构体 1. 语法格式 2. 示例 二.访问结构体成员 三.结构体作为函数参数 四.结构体指针 总结 引言 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性: Title :标题 Author : 作者 Subject:学科 ID:书籍ID 一.定义结构体 1. 语法格式 结构体定义需要使用 type 和 struc

  • Go语言异常处理(Panic和recovering)用法详解

    目录 基本语法 Panic Recover 示例一:recover()使用方法 实例二:panic()使用方法 基本语法 异常处理是程序健壮性的关键,往往开发人员的开发经验的多少从异常部分处理上就能得到体现.如何适度的添加异常,往往是整个产品体验成败的关键. Go语言中没有Try Catch Exception机制,但是提供了panic-and-recover机制. Panic 内置函数panic() 类似raise,能够停止正常的流程 当函数内调用panic,正常的流程将被终止,defer函数

  • Go语言学习笔记之反射用法详解

    本文实例讲述了Go学习笔记之反射用法.分享给大家供大家参考,具体如下: 一.类型(Type) 反射(reflect)让我们能在运行期探知对象的类型信息和内存结构,这从一定程度上弥(mi)补了静态语言在动态行为上的不足.同时,反射还是实现元编程的重要手段. 和 C 数据结构一样,Go 对象头部并没有类型指针,通过其自身是无法在运行期获知任何类型相关信息的.反射操作所需要的全部信息都源自接口变量.接口变量除存储自身类型外,还会保存实际对象的类型数据. func TypeOf(i interface{

  • C语言 map函数的基础用法详解

    目录 map map具体操作 总结 map 有N个学生的姓名name和学号ID,要求给你一个学生的name求查找他的ID. 简单做法是定义 string name [ N ] 和 int ID[ N ] 存储信息,然后在name [ ] 中查找这个学生,找到后输出他的ID.但是这样的缺点是需要查找所有的name [ N ],时间复杂度是O( N ),效率低下. 利用 STL 中 map容器 可以快速实现查找,复杂度是O( log 2 N ). map是关联容器,它实现从键(key)到值(valu

  • C语言中回调函数和qsort函数的用法详解

    目录 回调函数 指向函数指针数组的指针 qsort(qulick sort)-库函数 回调函数 通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数. 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 举例: #include<stdio.h> void menu() { printf("*************************

随机推荐