格式控制符
- %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类型。记住这幅图就可以轻松拿捏隐式转换。