C语言基础知识入门:从格式控制符到强制类型转换
C语言基础知识入门:从格式控制符到强制类型转换
C语言是一种广泛使用的编程语言,其基础知识对于学习其他编程语言和理解计算机底层原理都非常重要。本文将介绍C语言中的格式控制符、数据类型、内存存储、变量与常量、输入函数、二进制表示以及强制类型转换等内容。
格式控制符
%d
:输入十进制数,把后面参数当十进制输出,还有%zd
(size_t类型无符号整数)%ld
等。%s
:输出字符串。%c
:输出字符。%f
:输出小数,单精度浮点型。%lf
:输出小数,双精度浮点型。%e
:以科学计数法输出。%o
:输出八进制。%#0
可以显示进标识,%
同理,例子:0x34
,前两个0x
就是标识。%x
:输出十六进制。(%X
是使用大写来表示)%u
:无符号10进制整数
类型名
int
:整型。short
:短整型。long
:长整型。float
:单精度浮点型。double
:双精度浮点型。char
:字符型。
数据在内存中的储存
int
:整型在计算机所占的大小为4个字节。short
:短整型在计算机中所占的大小为2个字节。long
:长整型在计算机中的所占的大小为8个字节。float
:单精度浮点型在内存中所占大小为4个字节。char
:字符型在计算机中所占大小为1个字节double
:双精度浮点型在内存中所占的大小为8个字节。
变量
变量与常量不同,变量的值是可变的,通常用小写来声明,声明变量实际上是在内存中分配了一个空间,声明变量的格式是,类型名+变量名。在函数中声明了一个(局部)变量,没有给它赋值,那系统就会给他一个随机值,为函数外声明了一个(全局)变量,那么它默认为零。
常量
就是程序中不可改变的值,比如说PI=3.14,在c语言中我们习惯用全大写来写常量,宏定义define
通常用来定义常量。
输入函数scanf
scanf
为输入函数,在scanf
中函数中,在这里我想说两个问题,在我们输入字符%c
的时候,很有可能出现下面这个问题:
运行结果如下:
可以看到输出的字符结果为空,原因是这样的:当输入完数字之后我们需要按下回车,但这个回车也是一个字符,存在于是scanf
的缓冲区中,在上面的程序中缓冲区为34 和 回车符,于是scanf
就会回车传给gender
,导致我们无法再去向gender
输入。为解决这个问题,我们会用getchar()
去消化这个回车符,只需要在第二个scanf
加上getchar();
就可以。
有字符就会有字符串,我们存字符串会用数组,比如char str[50]=" "
,那么我现在改名了,叫Mi sir,(中见有空格的情况)想用scanf
输入传入到数组里,来试一下:
看下运行结果:
可以看到,我输入的是Mi sir,但scanf
只接收到了Mi,那我们如何接收空格呢?也就是说scanf
中不能包含空格,那该如何是好,这里我了解到的是使用fgets()
函数,这个函数可以包含空格:
来使用一下:
要知道数组名name
就是一个地址,
可以看到,成功输入了。以上问题希望能引起注意。
计算机中的二进制
假设我们定义了一个char
类型的变量,赋给变量一个值,200,使用printf
语句打印它,那么你觉得它会打印出是200吗,肯定没有那么简单:
char
类型在内存中占一个字节,也就是八个比特位,八位二进制对应最大数是255,为什么打印不出来200,而是-56,那是因为忽略了符号位,在char
是有符号,二进制的第一位就是符号位,1代表负,也就是说char
类型可以表示的是-128 ~ 127范围的数字, 当给char
超过这个范围就会出现问题,下面说明打印是-56的原因:
强制类型转换
在C语言中,把一个变量num
定义为float
,但在我们想将这个变量在某个函数中使用,而这个函数要求参数为整型,这时我们就需要将 float
强制转换成 int
,强制转换的方法为(int)num
,这样num
就会被强制转换成整型,这个操作在C语言中使用的非常多,下面是一个简单的例子。
上面描述的是强制类型转换的一种:显示转换。
还有一种是:隐式转换。看图,假设一个float
和long
类型的变量相加,得到的变量类型就会是double
类型,int
类型和unsigened
类型相加,得到的就会是unsigned
类型。记住这幅图就可以轻松拿捏隐式转换。