目录
对于switch && case && break && default 的总结
本章节文章是作者通过观看《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 的总结
下面给大伙一张之前做的笔记图同时解释:
1.好像说得很清楚了就不解释了 2.当一个case要执行多条语句时,如果需要在里面定义变量,就需要用{}括起来这一个case语句里面的代码块,或者只写一个函数,然后调用这个函数(就此一条语句),当然后面都要跟上break。(其实个人一致认为break跟不跟完全是无法规定的,都要看具体情况,所以大家自行斟酌) 3.好像也挺清楚的。 4.额.....也清楚哈,不懂私我哈! 5.case后面只能接常量,不能是const修饰的常量,因为其本质还是变量,但是可以用define定义的常量。最后的布局方式就是大家最好按照从小到大的顺序去写case,当然还有一个小技巧就是把常用的case写在前面可以提高程序的效率。PS:目前了解一下就行
2.getchar
头文件:
作用1:从缓冲区读走一个字符,相当于清除缓冲区。
作用2 : 前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,接下来的scanf()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误。
简单说就是从键盘读一个字符进去。下面也可以很好地反应出来:
这里中间有两个空行是因为一个是我们回车的时候有一个\n保留了,还一个就是我们程序自己输入的\n。现在我们不带\n
PS:再一个大家很可能忽视的,键盘输入的内容或者是显示器中打印的内容,全部都是字符!
printf返回值:返回的是打印字符的个数!(有‘\0’)
虽然我们输入的是字符,但是会经过这些函数转换为我们想要的数字或其他。(就是%d或者啥的)所以键盘,显示器都称之为字符设备。
总结:
getchar() 用于读取用户从键盘输入的单个字符,它有一个整型的返回值,当发生读取错误的时候,返回整型值 - 1,当读取正确的时候,它会返回用户从键盘输的第一个字符的ASCII码, 当程序调用getchar时.运行程序时 就等着用户从按键输入, 用户输入的字符被存放在键盘缓冲区中.直到用户按回车为 止(回 车字符也放在缓冲区 中),当用户输入回车之后,getchar才开始从输入流中每次读入一个字符,输入的字符不只一个的时候,后续的getchar调用不会等待用户按键, 而直接读取缓冲区中的字符, 直到缓冲区中的字符读完之后,才等待用户按键,getchar函数输入数字也按字符处理,单个的getchar函数输入多于一个字符时,只接收第一个字符。
3.putchar
简单说就是从键盘写一个字符到流也就是显示器上面。
头文件:
函数原型:
用法:
总结:
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.do、while、for 关键字
//while 条件初始化 while ( 条件判定 ){ // 业务更新 条件更新 } //for for ( 条件初始化 ; 条件判定 ; 条件更新 ){ // 业务代码 } //do while 条件初始化 do { 条件更新 } while ( 条件判定 );
然后补充:while循环和for循环都是先判定后使用,但是do while循环是先使用后判定。
break && continue 区别
break是跳出本次循环,continue是跳过本次循环 直接到判定部分。下面的图就可以接解释:
5.goto 关键字
直接跳转到标记部分,
但是会有一些问题,如跳过一些代码,又或者死循环,又或者可读性差等。所以一般新手不用。
我的建议很多公司确实禁止使用 goto ,不过,这个问题我们还是灵活对待, goto 在解决很多问题是有奇效的。 我们可以认为 goto 使用场景较少,一般不使用。但是必须得知道 goto ,需要的时候,也必须会用有人用吗
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* 能够接受任意指针类型。 这是我们在指针学习的时候通常能用到的。结论:但是我们依旧认为,void*的作用是用来接受任意指针类型的。这块在后面如果想设计出通用接口,很有用,比如:void * memset ( void * ptr, int value, size_t num );
6.3 void * 定义的指针变量可以进行运算操作吗
为什么在不同的平台下,编译器会表现出不同的现象呢? 根本原因是因为使用的 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 * 用来设计通用接口
今天的内容就到这里了哈!!!
要是认为作者有一点帮助你的话!
就来一个点赞加关注吧!!!当然订阅是更是求之不得!
最后的最后谢谢大家的观看!!!
你们的支持是作者写作的最大动力!!!
下期见哈!!!