1.数据类型介绍
C语言中使用整形类型来描述整数,使用字符型类型来描述字符,使用浮点型类来描述小数
1.1字符型
char(character) signed(可省略) char 有符号的 unsigned char 无符号的
1.2整形
short短整型 int整形 long长整型 long long更长的整形(C99引入)
1.3浮点型(描述小数)
float(单精度浮点型) double(双精度浮点型 常用) long double
1.4布尔类型(C99引入)
C语言中0表示假,非0表示真
_Bool 必须包含头文件<stdbool.h>
_Bool类型中true表示真,false表示假
在这段代码中以if()接收到布尔类型的flag的值的真假来决定是否打印语句,实际上用布尔类型判断真假的原理和用0、!0表示真假的原理是一致的不过是书写形式的不同,通常情况下我还是习惯用0、!0表示真假。
1.5各种数据类型的长度
sizeof操作符
sizeof是关键字,也是操作符,它用来计算操作数的类型长度的,单位是字节(一个Byte相当于8个bit)
sizeof()输出的是size_z型值,也是无符号整形,用%zd来打印
在这一段代码中我看到了各个数据类型的长度(字节)
注: sizeof+表达式 也是一种书写方式,在用sizeof计算表达式长度时不需要括起来(一般我不用这种写法,看着不方便)
这一段代码验证了sizeof()中的表达式不会进行真正的计算,第一次打印时将一个int型的结果强行塞进short型中,但实际上sizeof还是计算的short型的长度,第二次打印发现s的值没有变化还是2,说明s=a+1并没有真正进行计算,否则结果将会是11。
2.signed 和 unsigned
signed有符号 unsigned无符号
在数字中二进制最高位是符号位,1为负,0为正
signed short int能表示-32768~32767 而unsigned short int能表示0~65535
在char型变量中,不同编译器下char可能是signed char,也可能是unsigned char ,因此在使用时最好加上signed
3.数据类型的取值范围
在limits.h的头文件中中说明了整型类型的取值范围
在float.h的头文件中说明了浮点型的取值范围
在想知道数据类型的数据类型范围的时候可以引用头文件然偶用类似 INT_MAX INT_MIN 的格式查看。
4.变量
C语言中将经常变化的值叫做变量,不变的值称为常量。
4.1变量的创建
数据类型 + 变量名; 例如 unsigned int age;
4.1变量的分类
变量分为:全局变量(在大括号外定义的),局部变量(在大括号内定义)
当全局变量和局部变量名字相同时,局部变量优先
内存分为:栈区(放置局部变量,函数参数),堆区,静态区(全局变量,静态变量)
5.算数操作符
算数操作符都是双目操作符(两个操作数)
+加 -减 *乘 /除(输出商) %取模(输出余数)
一般来讲 / 是输出商,是一个整数,但是如果想要得到一个小数的话,就让除数或者被除数成为小数进行运算,如第二行打印的结果。
取模因为是得到余数,因此结果一定是个整数,最后一行的代码是错误的。如果想让余数也出现负号,就在被除数前面加上 - ,注意,负号加在除数上是没有用的。
6.赋值操作符 =
顾名思义,赋值操作符就是给变量赋值,如 b=2;给b赋值为2
当然,赋值操作符也有一些有意思的用法
连续赋值
b=a=3; 此时a和b的值都是3(不推荐使用,代码可读性差)
复合赋值
+= -+ *= /= %= >>= <<= &= |= ^=
7.单目操作符(一个操作数)
++ --
++a --a(前置)
先操作(+1 -1)再使用
a++ a--(后置)
先使用再操作(+1 -1)
8.强制类型转换
(类型)
double b=3.14;
int a=(int)b;
强制类型转换这个东西不要轻易使用,俗话说强扭的瓜不甜,写代码时能避免就避免
9.scanf 和 printf
9.1.1 printf()的基本知识
printf()的作用是将参数文本输出到屏幕上。它名字里的 f 是 format(格式化) ,表示可以定制输出文本的格式。
printf()打印完之后光标会停留在打印结束的位置上,要手动\n才会换行。
printf()使用要包含头文件 stdio.h。
9.1.2 占位符
printf()可以在输出文本中指定占位符(%d %c %lf %s)
占位符列举
%a 十六进制浮点数,字母输出为小写
%A 十六进制浮点数,字母输出为大写
%c 字符
%d 十进制整数
%e 科学计数法的浮点数,指数部分的e为小写
%E 科学计数法的浮点数,指数部分的e为大写
%i 整数,记本等同于%d
%f 小数(包含float类型和double类型)
%g 6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分为e的小写
%G 等同与%g ,只是指数部分是E的大写
%hd 十进制short int类型
%ho 八进制short int类型
%hx 十六进制short int类型
%hu unsigned short int类型
%p 指针
%s 字符串
%u 无符号整数
%x 十六进制整数
%zd size_t类型
%% 输出一个%
9.1.3输出格式
printf()允许定制占位符输出格式。
9.1.3.1限定宽度
printf()允许限定占位符的最小宽度。
%5d表示这个占位符宽度至少是5,不够5位,对应值前面会部空格,超过五位正常打印输出默认是右对齐,如果想左对齐的话就写%-5d
对于小数来说,这个限定符会限制所有数字的最小显示宽度(包括小数点)
9.1.3.2总是显示正负号
在占位符%后加+
%+d输出正数时会显示正号。输出负数时会显示负号
9.1.3.3限定小数位数
希望小数点后面保留2位,占位符可写成%.2f
这种写法可以和限定宽度占位符一同使用%6.2f (3位整数,一个小数点,2位小数)
最小宽度和小数位数都可以用传参的方式,例如 printf("%*.*lf",6,2,3.1415);
9.1.4.4输出部分字符串
%s占位符是用来输出字符串的,默认是全部输出,如果只想输出开头的部分,可以用 %.[m]s 指定长度,其中[m]代表一个数字,表示要输出的长度.
例如 printf("%.5s",hello word); 这样写只会输出字符串前五位,也就是输出hello
9.2.1 scanf()的基本用法
scanf()函数是用于读取用户在键盘的输入
程序在运行到这个语句的时候会停下来等待用户输入,用户输入数据,按下回车后,scanf()就会处理用户输入并存入变量 scanf("%d",&a);
scanf()处理数值占位符时,会自动过滤掉空白字符,包括空格,制表符,换行符
scanf()处理用户输入的原理是,用户输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读。解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。
ctrl+z可以停止scanf()的匹配
9.2.2 scanf()的返回值
scanf()返回值是一个整数,表示成功读取的变量个数.如果没有读取任何项,返回0。如果在成功读取任何数据前,发生了错误或遇到读取到了文件的结尾,则返回常量EOF.
9.2.3占位符
通常情况下scanf()的占位符和printf()的占位符基本一致
%[] 在方括号中指定一组匹配字符(%[0-9] %[0,1,2,3,4,5,6,7,8,9]),遇到不在集合中的字符,匹配将停止
%c 通常情况下%c也会将空格读入变量,如果想要跳过空白字符就在%c前面加上一个空格,scanf(" %c",&a);
%s 不能简单的理解成字符串,它时从第一个非空字符开始,读到一个空字符结束,基于scanf()函数的安全性,应用%[m]s指定输入字符串的长度
9.2.3赋值忽略符
%*c 读一个字符但是忽略它
%*d 读一个整数但是忽略它
总环节来说,把*加在任何占位符的百分号后面,该占位符就不会返回任何值,解析后将被丢弃