《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 * 用来设计通用接口

3.putchar

97.png


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

头文件:

98.png

99.png

用法:

100.png


总结:

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是跳过本次循环 直接到判定部分。下面的图就可以接解释:

101.png


5.goto 关键字


直接跳转到标记部分,



102.png


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


我的建议


很多公司确实禁止使用goto,不过,这个问题我们还是灵活对待,goto在解决很多问题是有奇效的。

我们可以认为goto使用场景较少,一般不使用。但是必须得知道goto,需要的时候,也必须会用


有人用吗

103.png


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* 能够接受任意指针类型。

这是我们在指针学习的时候通常能用到的。


104.png105.png


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


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

06.png


为什么在不同的平台下,编译器会表现出不同的现象呢?

根本原因是因为使用的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 * 用来设计通用接口

106.png

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

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

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

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

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

下期见哈!!!

相关文章
C4.
|
1月前
|
存储 算法 C语言
关于c语言用计算机语言表示算法
关于c语言用计算机语言表示算法
C4.
17 1
|
1月前
|
存储 安全 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-2
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-2
|
1月前
|
存储 编译器 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
|
1月前
|
存储 C语言 C++
C语言------------指针笔试题目深度剖析
C语言------------指针笔试题目深度剖析
19 1
|
29天前
|
程序员 C语言
在C语言中,typedef是一种用来创建新的数据类型名的关键字
在C语言中,typedef是一种用来创建新的数据类型名的关键字
9 0
|
29天前
|
存储 编译器 C语言
C语言的关键字
C语言的关键字
13 0
|
1月前
|
存储 编译器 C语言
c语言中的关键字
c语言中的关键字
8 0
|
1月前
|
存储 小程序 C语言
【深度剖析数据在内存中的存储】C语言
【深度剖析数据在内存中的存储】C语言
|
1月前
|
存储 小程序 C语言
【C语言进阶】深度剖析数据在内存中的存储
【C语言进阶】深度剖析数据在内存中的存储
|
1月前
|
编译器 程序员 Linux
深入理解C语言中的return关键字与函数返回机制
深入理解C语言中的return关键字与函数返回机制