《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

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

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

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

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

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

下期见哈!!!

相关文章
|
12天前
|
存储 程序员 编译器
初识C语言,计算机语言的基石
初识C语言,计算机语言的基石
|
4月前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
58 7
|
4月前
|
C语言 C++ 编译器
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
|
3月前
|
C语言
|
3月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
4月前
|
存储 C语言
C语言中的typedef关键字:为类型定义新名称
C语言中的typedef关键字:为类型定义新名称
|
4月前
|
C语言
深入探索C语言中的sizeof关键字
深入探索C语言中的sizeof关键字
|
4月前
|
存储 编译器 C语言
C语言中的关键字与标识符详解
C语言中的关键字与标识符详解
|
4月前
|
C语言 C++
【C++语言】冲突-C语言:命名空间
【C++语言】冲突-C语言:命名空间
|
5月前
|
存储 C语言
C语言结构体深度剖析
C语言结构体深度剖析