大纲
1.数据类型介绍
2.signed和unsigned
3.变量
4.算术操作符: +、-、*、/
5.赋值操作符: =和复合赋值
6.单目操作符: ++、–、+、-
7.强制类型转换
8.scanf和printf
1. 数据类型介绍
类型就是数据拥有的共同特征,只有知道了类型,才知道怎么操作数据
1.1 字符型
字符型char原单词character,分号有符号和无符号
signed char
unsigned char
1.2 整形
每类整形都分为有符号和无符号,[]中是可省略内容
短整型: short [int]
整形: int
长整型: long int
更长的整形,C99: long long [int]
1.3 浮点型
float
1.4 布尔类型
C99引入,表示真假,0表示真,非0表示假,需要头文件<stdbool.h>
,取值是true 1,fasle 0
_Bool
1.5 数据类型的长度
每种数据类型都有自己的长度,存储的数据范围不同
0xff 255
0x80 128
0xffff 65535
0x8000 32768
记住常用数值可以快速加减
如:
0x83的十进制=128+3
0xfffa的十进制=0xffff-5=65535-5=65530
sizeof
是一个关键字,操作符,专门用来计算操作符数类型长度,单位是字节,计算结果size_t类型
sizeof后面是表达式时可以省略括号
sizeof的返回值并没有规定具体类型,所以c语言提供了一种size_t统一反应对应系统的返回值类型
数据类型长度
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(_Bool));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));
输出结果为:
c语言指规定了long类型必须大于等于int,具体大小并未规定,由操作系统决定
sizeof对表达式不计算,在编译的时候就已经确定了数据类型,只看变量的类型
浮点数后缀不加f默认为double类型,如3.14
2.signed和unsigned
signed关键字表示类型带有正负号,unsigned表示不带正负号,声明为unsigned可以表示的值扩大了一倍
char类型默认是否带正负号,有系统决定,与int不同,int等同于signed int,char有可能是
数据类型的最大值和最小值
数据类型的最大最小值可以在limits.h头文件中查看,下面是不分大小:
#define SHRT_MIN (-32768) //有符号16位整型的最⼩值
#define SHRT_MAX 32767 //有符号16位整型的最⼤值
#define USHRT_MAX 0xffff //⽆符号16位整型的最⼤值
#define INT_MIN (-2147483647 - 1) //有符号整型的最⼩值
#define INT_MAX 2147483647 //有符号整型的最⼤值
3.变量
变化的值称为变量,不变的值称为常量
语法:
data_type name
| |
数据类型 变量名
变量在创建的时候给一个初始值,叫初始化。如果不初始化马上赋值也可以,但不初始化也不赋值会是一个随机值
int age=10;
char ch='w';
变量的分类
全局变量: 在大括号外面定义的是全局变量,整个工程都可以使用
局部变量: 大括号内部定义的是局部变量,只能在局部使用
当全局变量和局部变量同名的时候,局部变量优先使用
变量的存储位置
内存分为栈区、堆区、静态区
4.算数操作符
操作符也叫运算符,是双目运算符
如果出现无法解析的外部符号报错,有可能是没包含头文件
除法
除法运算符中,c语言的除法是整数除法,就算是float也会返回整数,丢弃小数部分。只要有一个操作数是小数,就会执行小数除法
float n = 7 / 2;
float n1 = 7 / 2.0;
printf("%f\n%f", n,n1);
int score = 5;
score = (score / 20) * 100;
printf("%d", score);
上面的代码执行结果是0,因为score/20是整数除法,会得到0,想得到小数可以将20改为20.0,此时输出25
%运算
这个为求模运算,返回两个整数相除的余,这个运算符只能用于整数,不能用于小数
负数求模的规则,结果的正负号由第一个运算符的正负号决定
printf("%d\r\n", 11 % 5);
printf("%d\r\n", -11 % 5);
printf("%d\r\n", 11 % -5);
上述输出结果:
5.赋值操作符:=和复合赋值
变量创建好后再给一个值叫赋值
赋值可以连续赋值,如:
int a=3;
int b=5;
int c=0;
c=b=a+3;//连续赋值
支持这种赋值,从右到左依次赋值,这种不容易理解,建议拆开来写
复合赋值符
a=a+3,可以写为a+=3,这些赋值符有:
+= -= *= /= %= >>= <<= &= |= ^=
7.单目操作符:++、–、+、-
前面说了双目操作符,只有一个操作数的,被称为单目操作符
++和–
分为前置和后置,以加法举例
前置++: 先加1,再使用
int a=10;
int b=++a;
a的值刚开始是10,加了一次后为11.赋给了b,b也是11。相当于a=a+1,b=a
后置++: 先使用,再加1
int a=10;
int b=a++;
a的值刚开始是10,先赋给b,b为10,然后自增1,11,代码走完。相当于 b=a,a=a+1
+和-
+号对正负值没有影响,可以省略。-号会改变,负数的前面必须加-号
7.强制类型转换
int a=3.14;
//a是int型,3.14是double类型,两边的类型,编译器会报警告
int a=(int)3.14
//这样强制转为int,就会只取整数部分
8.scnaf和printf
printf是将参数文本输出到屏幕,f的代表format(格式化)
,表示可以定制输出文本的格式。printf在结尾的时候光标停留在结束的地方,不会自动换行。在输出的文本末尾可以加 \n
占位符
占位符就是这个位置可以用其他值代替
printf("%d",3);
上述%d就是占位符,表示这个位置需要用其他值代替,第一个是占位符的符号,第二个d是类型,表示占一个整数,用后面的3替换了%d
printf参数和占位符一一对应,如果有n个占位符,参数就应该有n+1个,如果参数个数少于占位符,就会输出内存任意值
占位符列举
%f 小数类型
%hd 十进制short int
%ld 十进制long int
%lld 十进制long long int
%lf double类型
%E 科学计数法的浮点数,指数部分e大写
%o 八进制整数
%p 指针
%s 字符串
%u 无符号整数 unsigned int
%x 十六进制整数,大小写由x的大小写决定
%zd size_t类型
输出格式
限定占位符的最小宽度
printf("%5d",123);
最小输出宽度5位,不满5位,前面添空格,默认右对齐,在5d前加个负号就是左对齐
对于小数,限制所有数字的宽度,包括小数点在内
总是显示正负号
默认只显示负数的-号,如果想让正数显示+号,可以在%后面加一个+
限定小数位数
希望保留小数点后几位,可以写为%.2f
,这样写小数点后显示2位,这种写法可以和限定宽度同时使用,%6.3f
,小数点后显示3位,总宽度6位
最小宽度和小数位数的限定可以用*
号代替
printf("%*.*f",6,2,0,5);
输出部分字符串
%s用来输出字符串,如果只想输出开头的部分,可以用%.[m]s
指定输出长度,m表示输出多少个字符
scanf用来给变量输入值
int a;
scnaf("%d",&a);
printf("%d",a);
scanf从键盘得到输入的a值,然后用printf打印输出到屏幕上
基本用法
用于读取用户的键盘输入,运行到这时会停下来等待用户输入,遇到回车就会处理输入,原型头文件在stdio.h中
它的第一个参数和printf一致,表示输入的数据类型,
变量前必须加上&运算符,指针除外,传的不是值,是地址
scanf处理时,会自动过滤空格字符,制表符和换行符等,用户空格回车分行都不影响解读。但输入必须和占位符之间的格式一致,会自动从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止
int x;
float y;
//输入-13.45e12# 0
scanf("%d",&x);
printf("%d",x);
scanf("%f",&y);
printf("%f",y);
上述,第一个%d读取整数,遇到小数点不符合格式停止读取,所以x输出-13,然后读到#不符合,停止读取,其中e12为科学计数法,表示*10^12次方,所以y输出为0.45*e12,小数会有误差,结果如下:
scanf的返回值
返回成功读取的字符个数,如果发生读取错误或遇到文件结尾会返回常量EOF,值-1
int a=0;
int n=scanf("%d",&a);
printf("%d",n);
输入crtl+z打断输入,返回值-1
占位符
占位符基本和pirntf一致,
%[]: 指定匹配的字符格式,遇到不符合的停止。如[0-9],只接收0-9的数字
除过%c外,都会自动忽略开始输出的空格部分,如果%c想跳过空格,可以写为% c
,夹一个空格
%s的不能读取空格,所以不能读取英语句子,会自动在字符串末尾添加\0
%s读取字符串也不会检测长度是否超过,超过数组长度可能会崩溃,为了防止这种情况,可以写为%[m]s
,m为整数,读取的最大长度,超过的会扔掉
赋值忽略符
用户的输入可能不符合格式,只要吧*号加在占位符的后面,该占位符就会被丢弃
int year=0;
int month=0;
int day=0;
scanf("%d-%d-%d",&year.&month,&day);
上述需要用户输入的格式为2011-1-1,如果输入为2011/1/1或其他格式,就会解析失败,所以修改为下写法:
int year=0;
int month=0;
int day=0;
scanf("%d%*c%d%*c%d",&year.&month,&day);
用%*c读取一个字符并忽略,无论输入什么格式都不会影响读取