《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

目录

1.switch case 组合

对于switch && case && break && default 的总结

2.getchar 

3.putchar

4.do、while、for 关键字

break && continue 区别

5.goto 关键字

 6.void 关键字

6.1 void修饰函数返回值和参数

6.1.2 void用来作为函数返回值

 6.1.3 void 作为函数参数

6.2 void 指针

6.3 void * 定义的指针变量可以进行运算操作吗

6.4 void * 用来设计通用接口


本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始! 

 谁都不能阻挡你成为更优秀的人。 

1.switch case 组合

switch ( 整型变量 / 常量 / 整型表达式 ){ case var1 : break ; case var2 : break ; case var3 : break ; default : break ; }

又有朋友问了,已经有if else为何还要switch case, 其实是因为switch语句也是一种分支语句,常常用于多分支的情况。这种多分支,一般指的是很多多分支,而且判定条件主要以整型为主。而且是指大数据的,用swich case 比 if else 会方便很多。(就是少写很多代码,可以偷懒)

那case和break的作用是什么在switch中?

答案是case是作为判判定功能而break是作为分支功能

 即:先从switch()传进去一个数,然后找case进行判断,当然如果没有可以与之判断的case就会走向default。再就是进入case,如果里面没有break,就会往下面的case继续执行,直到遇到break或者结束程序。

如果多个不同 case 匹配,想执行同一个语句,推荐做法:
#include <stdio.h> 
#include <windows.h> 
int main() 
{ 
int day = 6; 
switch (day){ 
case 1: 
case 2: 
case 3: 
case 4: 
case 5:
    printf("周内\n"); 
break; 
case 6: 
case 7: 
    printf("周末\n"); 
break; 
default: 
    printf("bug!\n"); 
break; 
}
    system("pause"); 
    return 0; 
}
结论: case 之后,如果没有 break ,则会依次执行后续有效语句,直到碰到 break

对于switch && case && break && default 的总结

下面给大伙一张之前做的笔记图同时解释: 

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)
1.好像说得很清楚了就不解释了 2.当一个case要执行多条语句时,如果需要在里面定义变量,就需要用{}括起来这一个case语句里面的代码块,或者只写一个函数,然后调用这个函数(就此一条语句),当然后面都要跟上break。(其实个人一致认为break跟不跟完全是无法规定的,都要看具体情况,所以大家自行斟酌) 3.好像也挺清楚的。 4.额.....也清楚哈,不懂私我哈! 5.case后面只能接常量,不能是const修饰的常量,因为其本质还是变量,但是可以用define定义的常量。最后的布局方式就是大家最好按照从小到大的顺序去写case,当然还有一个小技巧就是把常用的case写在前面可以提高程序的效率。
PS:目前了解一下就行 《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

2.getchar 

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

头文件:

 《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

作用1:从缓冲区读走一个字符,相当于清除缓冲区。

作用2 : 前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,接下来的scanf()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误。

简单说就是从键盘读一个字符进去。下面也可以很好地反应出来: 

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

这里中间有两个空行是因为一个是我们回车的时候有一个\n保留了,还一个就是我们程序自己输入的\n。现在我们不带\n

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

PS:再一个大家很可能忽视的,键盘输入的内容或者是显示器中打印的内容,全部都是字符!

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

 printf返回值:返回的是打印字符的个数!(有‘\0’)

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

虽然我们输入的是字符,但是会经过这些函数转换为我们想要的数字或其他。(就是%d或者啥的)所以键盘,显示器都称之为字符设备。

总结:

getchar() 用于读取用户从键盘输入的单个字符,它有一个整型的返回值,当发生读取错误的时候,返回整型值 - 1,当读取正确的时候,它会返回用户从键盘输的第一个字符的ASCII码, 当程序调用getchar时.运行程序时 就等着用户从按键输入, 用户输入的字符被存放在键盘缓冲区中.直到用户按回车为 止(回 车字符也放在缓冲区 中),当用户输入回车之后,getchar才开始从输入流中每次读入一个字符,输入的字符不只一个的时候,后续的getchar调用不会等待用户按键, 而直接读取缓冲区中的字符, 直到缓冲区中的字符读完之后,才等待用户按键,getchar函数输入数字也按字符处理,单个的getchar函数输入多于一个字符时,只接收第一个字符。

3.putchar

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

简单说就是从键盘写一个字符到流也就是显示器上面。

头文件:

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇) 函数原型:

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

用法:

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

总结:

 putchar() 向终端输出一个字符。其格式为putchar(ch),其中ch可以是被单引号(英文状态下)引起来的一个字符,可以是介于0~127之间的一个十进制整型数(包含0和127)(超过127就不是ASCII码了),也可以是事先用char定义好的一个字符型变量 当c为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符 ), 当c为一个介于0~127(包括0及127)之间的十进制整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符; 当c为一个事先用char定义好的字符型变量时,输出该变量所指向的字符。 当整型变量ch超出8位变量的范围时,ch则会变强制转化为8位变量(即取其低八位传过去输出),当为负数的时候,由于计算机存储负数是用补码表示的,所以传过去的二进制补码也被当做正数处理,也是取其低八位。

       

4.dowhilefor 关键字

//while 条件初始化 while ( 条件判定 ){ // 业务更新 条件更新 } //for for ( 条件初始化 ; 条件判定 ; 条件更新 ){ // 业务代码 } //do while 条件初始化 do { 条件更新 } while ( 条件判定 );

然后补充:while循环和for循环都是先判定后使用,但是do while循环是先使用后判定。

break && continue 区别

break是跳出本次循环,continue是跳过本次循环 直接到判定部分。下面的图就可以接解释: 《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

 

5.goto 关键字

直接跳转到标记部分, 

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

但是会有一些问题,如跳过一些代码,又或者死循环,又或者可读性差等。所以一般新手不用。

我的建议
很多公司确实禁止使用 goto ,不过,这个问题我们还是灵活对待, goto 在解决很多问题是有奇效的。 我们可以认为 goto 使用场景较少,一般不使用。但是必须得知道 goto ,需要的时候,也必须会用
有人用吗 《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

Linux内核源代码中充满了大量的goto,只能说我们目前,或者很多公司的业务逻辑不是那么复杂 

 6.void 关键字

//void 是否可以定义变量 #include <stdio.h> #include <windows.h> int main() { void a; system("pause"); return 0; } // 在 vs2013 和 Centos 7 , gcc 4.8.5 下都不能编译通过
为何 void 不能定义变量
定义变量的本质:开辟空间 而 void 作为空类型,理论上是不应该开辟空间的,即使开了空间,也仅仅作为一个占位符看待 所以,既然无法开辟空间,那么也就无法作为正常变量使用,既然无法使用,编译器干脆不让他定义变量。 在 vs2013 中, sizeof(void)=0 在 Linux 中, sizeof(void)=1 (但编译器依旧理解成,无法定义变量)

6.1 void修饰函数返回值和参数

6.1.2 void用来作为函数返回值

如果自定义函数,或者库函数不需要返回值,那么就可以写成 void,这是我们常用的哈。 那么问题来了,可以不写吗?不可以,自定义函数的默认返回值是 int( 这个现场验证 ) 所以,没有返回值,如果不写 void ,会让阅读你代码的人产生误解:他是忘了写,还是想默认 int ?

 6.1.3 void 作为函数参数

#include <stdio.h> 
#include <windows.h> 
int test1() //函数默认不需要参数 
{ 
    return 1; 
}
int test2(void) //明确函数不需要参数 
{ 
    return 1; 
}
int main() 
{ 
    printf("%d\n", test1(10)); //依旧传入参数,编译器不会告警或者报错 
    printf("%d\n", test2(10)); //依旧传入参数,编译器会告警(vs)或者报错(gcc) 
    system("pause"); 
    return 0; 
}
结论:如果一个函数没有参数,将参数列表设置成 void ,是一个不错的习惯,因为可以将错误明确提前发现。 / 另外,阅读你代码的人,也一眼看出,不需要参数。相当于 " 自解释 " 。 当然不习惯也没关系,作者也不喜欢写哈哈。

6.2 void 指针

void 不能定义变量,那么 void* 呢? 经过测试发现是可以的,为什么呢? 因为 void*是指针,是指针,空间大小就能明确出来(4/8)。 作用: void* 能够接受任意指针类型。 这是我们在指针学习的时候通常能用到的。

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

 结论:但是我们依旧认为,void*的作用是用来接受任意指针类型的。这块在后面如果想设计出通用接口,很有用,比如:void * memset ( void * ptr, int value, size_t num );

6.3 void * 定义的指针变量可以进行运算操作吗

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇) 为什么在不同的平台下,编译器会表现出不同的现象呢? 根本原因是因为使用的 C 标准扩展的问题。
PS:GNU计划,又称革奴计划,是由 Richard Stallman( 理查德 · 斯托曼 ) 在 1983 年 9 月 27 日公开发起的。它的目标是创建一套完 全*的操作系统。它在编写 linux 的时候自己制作了一个标准成为 GNU C 标准。 ANSI 美国国家标准协会 , 它对 C 做的标准 ANSI C 标准后来被国际标准协会接收成为 标准 C 所以 ANSI C 和标准 C 是一个概念,总体来说现在 linux 也支持标准 C ,以 后标准 C 可以跨平台,而 GUN c 一般只在 linux c 下应用。 -- 来自百度 Linux 上可用的 C 编译器是 GNU C 编译器,它建立在*软件基金会的编程许可证的基础上,因此可以*发布。 GNU C 对标准 C 进行一系列扩展,以增强标准 C 的功能。 -- 来自百度 一句话,大部分编译器是标准 C ,而 Linux 下是扩展 C , Linux 平台也能保证标准 C 的运行。

 

6.4 void * 用来设计通用接口

《C语言深度剖析》第一章 关键字详解 p3 C语言从入门到入土(进阶篇)

 

今天的内容就到这里了哈!!!

要是认为作者有一点帮助你的话!

就来一个点赞加关注吧!!!当然订阅是更是求之不得!

最后的最后谢谢大家的观看!!!

你们的支持是作者写作的最大动力!!!

下期见哈!!!

上一篇:Eureka的源码解析


下一篇:线程运行的原理