本章内容:
- C语言的数据类型
- 常量与变量
- 标准输入输出函数
- C语言的运算符和表达式
- 运算符的优先级和结合性
- 不同数据类型之间的转换
1.C语言的数据类型
1.1 数据类型 ![](https://i-blog.csdnimg.cn/blog_migrate/e8d38c5adaf1d6e16b338312899b07cc.png)
整型:Int short long longlong 关键字
字符型:char
浮点型:float double
数据类型的意义:
- 数据类型就是用来指定内存空间大小的。例如:定义变量
求数据类型的占用内存可以使用运算符sizeof来求。
每种数据类型的占用内存都不一样,这样可以更好合理分配内存。
- 数据类型就是用来处理不同的类型的数据的。例如:整数、小数
1.2 类型修饰符
unsigned--无符号
unsigned 可以修饰 int short long longlong,不可修饰float double
unsigned short int 等效于 unsigned short (int可以省略,unsigned不可以省略)
unsigned long int 等效于 unsigned long (int可以省略)
unsigned long long int 等效于 unsigned long long (int可以省略)
经过无符号unsigned修饰之后的类型是没有负数部分(就是没有符号位)
signed --有符号
signed 可以修饰int short long longlong,不可修饰float double
用signed来修饰数据类型是可以省略的,如果没有修饰符都默认为signed
两者的区别:在于有无负数部分,(就是有无符号位)
基本数据类型的内存大小和数值范围
有符号与无符号的数据类型的取值范围不一样(就是有无符号位)。
2. 常量与变量
2.1 常量的概念
在程序运行过程中,其值不能被改变的量称为常量。
作用:用于记录程序中不可更改的数据。
2.2 数值常量(常量也有数据类型)
- 整型常量 88、99、100…
常量也是有数据类型,例如100默认为int类型
100ll 中的ll标识longlong(ll是小写LL)
100ul :无符号long
100u :无符号int
- 浮点常量 12.34、88.99f…
浮点型常量在数值后没有标识时就默认为double
12.12f:标识的是float类型
2.3 字符常量
- 普通字符常量(ASCII表)
char a=’c’;字符常量赋值必须用 ‘ ’ 括起来。如 ‘a’;
- 转义字符常量
\ddd,中的三个d是用八进制 0-7来标识,不可以是超过7 例如:’\123’,’\070’
‘\018’//错误
\xhh,中的hh是用十六进制数表示,范围在0-9 A B C D E F,例如:’\x78’’\x7f’
2.4 字符串常量
字符串常量是由多个字符构成的。 字符串常量必须用“ ”括起来 。如 “hello”;
字符串常量的定义:
字符串是以‘\0’作为结束标志。
2.5 符号常量
通过一个符号代表一个常量数值,常量名通常采用大写,符号常量可以通过两种形式来定义。
常量的定义格式:
宏:#define PI 3.1415926 使用符合PI代替常量3.1415926
这个语法不是c语言语法,而是预编译指令语法,没有;结尾
const:const float PI=3.1415926;
这个语法是标准c语言常变量语法
2.6 变量的概念
在程序的运行过程中,其值可以改变的量称为变量。
作用:给一段指定的内存空间起名,方便操作这段内存。
变量在内存中占据一定的存储单元,用来存放该变量的值。变量由变量类型、变量名、变量值组成。变量的类型表明该变量用来存储什么类型的数据,变量名用来区分不同的变量,在变量的存储单元中存放的值为变量值。在使用一个变量之前,必须要先定义,即“先定义,后使用”的原则(为什么要先定义?原因:变量定义是为变量指定数据类型,这样编译时就能在内存中分配相应的存储单元)。
定义的一般格式:数据类型 变量名1= 初始值1, 变量名2= 初始值2, ...;
变量的定义和初始化:
格式:
-
-
-
- 先定义后初始化
-
-
-
-
-
- 定义的同时初始化
-
-
-
-
-
- 同时定义多个并初始化或者不初始化
-
-
总结变量定义的格式:数据类型 变量名(标识符) = 变量的值
2.7 变量的命名规则
作用:C规定给标识符(变量、常量)命名时,有一套自己的规则
* 标识符不能是关键字
* 标识符只能由字母、数字、下划线组成,不可以有特殊符合 + - /&…
* 第一个字符必须为字母或下划线,不能以数字开头
* 标识符中字母区分大小写
建议:给标识符命名时,争取做到见名知意的效果,方便自己和他人的阅读
2.8 C语言的关键字
需要掌握的内容:
- 基本数据类型的关键字,会写。
- 转义字符 \ddd \xhh。
- 常量是种类、常量也是有数据类型
- 变量的定义与命名规则
- 懂得unsigned&signed的修饰后的区别。
- 记住基本数据类型占用内存空间大小,记住简单的取值范围。
3.标准输入输出函数---<stdio.h>头文件
3.1标准输出函数printf
以什么样的格式打印(输出)
%md;的m表示需要输出的位数,如果输出的值的位数不够会在左边补空格。
3.2标准输入函数scanf
输入 --以什么的格式输入
注意:
- scanf不能识别回车键,所以在使用此函数时,不能加入 \n .scanf("%c\n",&n); 错
- scanf 中有什么内容,就要输入什么内容。scanf("c=%c",&n); 输入是要加入c=
- 输入多个字符时,scanf 中有空格,输入时可以不输入空格,scanf 中没有空格,输入时可以输入空格,
- 输入多个字符时,scanf 中最后没有空格,输入回车后结束。scanf 中最后有空格,输入回车后不会结束。
总结:使用scanf作为输入时,要特别小心。
一般情况下,输入字符或字符串时,可以使用getchar 或者gets函数。后面再讲。
3.3输入输出的控制字符串
printf("s=%s","abcd");
练习:
以%d %c %x %f 的格式输入并输出对应格式的数据
例如:scanf(“%d”,&a);
printf(“%d”,a);
3.4计算机数制--二进制
在计算机中有二进制、八进制、十进制、十六进制数。我们需要了解并且懂得它们之间的转换。
进制就是进位方式,逢几进一。
任何数据在计算机中都是以二进制的形式存在的。二进制就是0/1. 逻辑0与逻辑1
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0)。
进制表示:
- 二进制 由0,1组成。以0b开头 例如:0b0001 1000 逢二进一
- 八进制 由0,1,…7组成。以0开头 例如:080 070 014
- 十进制 由0,1,…9组成。整数默认是十进制的 10 8 9…
- 十六进制 由0,1,…9,a,b,c,d,e,f(大小写均可)。以0x开头 0x41 0xff 0x10…
3.5进制之间的转换
十进制转二进制:除二得余,余数反转
7 --》0000 0111
十进制转八进制:除8得余,余数反转
十进制转十六进制:除16得余,余数反转
3.6八四二一码
在进制中将十进制排除,八进制和十六进制转换二进制是非常简单。
3个二进制位为一个八进制位,4个二进制位为一个十六进制位。
八进制转二进制
0141-> 01100001
0157->001101111
十六进制转二进制
二进制转十进制
0001 0111à
1*2^0+1*2^1+1*2^2+0*2^3+1*2^4=
1+2+4+16=23
4.C语言的运算符和表达式
4.1表达式的概念
表达式,是编译器能读懂的计算机语句,由运算符和操作数按一定语法规则组合而成,根据运算符决定对操作数进行何种运算,并得出唯一的运算结果。
例如:-1、2+3、a*b、2-1+c、a&&c、….
4.2运算符
运算符,顾名思义,是指具有运算意义的符号,比如加运算符(+),减运算符(-)等;
(1)算术运算符:+、 -、 *、 /(取整)、 %(取余)、++、 --
(2)赋值运算符:= 给变量赋值一个值。
例如:int a =10;
(3)关系运算符:> 、 < 、== 、 >= 、 <= 、 !=
关系运算符它的值只有两种:真(非0) 和 假(0)一般情况用1表示真。
(4)逻辑运算符:!、 && 、 || --用来判断 表达式的值。!
如果原来表达式的值为真,则变假,反之假变真
(5)&& --用于判断多个表达式的值,只有所有的表达式都为真,结果才为真。
运算规则:有0为0,全1为1
只要有一个条件不成立,不再往下判断。
if(表达式1 &&表达式2&&表达式3)
如果表达1不成立,表达式2与3不再判断执行
如果表达2不成立,表达式3不再判断执行
3)|| --用于判断多个表达式的值,只要有一个表达式都为真,结果为真。
运算规则:有1出1,全0出0
只要有一个条件成立,不再往下判断。
if(表达式1 ||表达式2||表达式3)
如果表达1成立,表达式2与3不再判断
如果表达2成立,表达式3不再判断
- 条件运算符(三目运算符) ?: 三目运算是c语言中唯一条
格式:表达式1?表达式2:表达式3
如果表达式1的值为真,则整个表达式的值为表达式2的值。
否则为表达式3的值。
- 逗号运算符:,
表达式1,表达式2,表达式3,……
运算规则:结果为最后一个表达式的值。
(6)求字节数运算符:sizeof
sizeof(int)
(7)强制类型转换运算符:(类型)
格式(类型)数据类型
如把一个int强制转换成float
(float)4 -->4.0
(8)位运算符:<< 、 >> 、~ 、 | 、&、 ^ 在嵌入式中比较重要。二进制位的运算。
位运算的运算步骤:先把数据转换位二进制,再进行位运算。
1) << : 左移
格式 : n<<m ;n左移m位 ,
第一种算法:扩大倍数,把n的值扩大了2^m倍。
n=2; n<<1 ->4 n<<2->8 2*2^2
第二种算法:换成二进制位算。左移了m位,高位(左边)移出m个位,在右边补m个0;
需要把无符号char的1左移1位
2<<1 ->0000 0010—>0000 0100
2)>> : 右移
格式 : n>>m ;n右移m位 ,
第一种算法:缩小倍数,把n的值缩小了2^m倍。
a= 64>>3 ; a= 8 ;
第二种算法:换成二进制位算。右移了m位,在左边补m个0;
64 =16*4 0x40 -- 0100 0000
000 01000 -->8
- ~ 按位取反 ,二进制位0变为1 ,1变为0
Unsigned char a=1,b;
b=~a;
0000 0001à1111 1110 ->0xfe
- | 按位或 有1出1,全0为0,对应的位码的二进制数进行按位或运算。
Unsigned char a=1,b=8;
a|b=?
高位ß---低位
76543210
0000 0001
0000 1000
0000 1001 结果:9
a=0xff b=0x83;
a|b=?
1111 1111
1000 0011
1111 1111
在嵌入式中可以把一个数据或者寄存器中的某个位置一。
a=1, 现在需要把a的第2位变为1,其余位不变怎么操作?
a=a|0x02;
0000 0001
0000 0010
0000 0011
- & 按位与 有0出0,全1为1
对应的位码的二进制数进行按位或运算。
Unsigned char a=0xf0,b=0x33;
a&b=?
1111 0000
0011 0011
0011 0000->0x30
在嵌入式中可以把一个数据或者寄存器中的某个位变为0。
- ^ 按位异或 不同为1,相同为0
- Unsigned char a=0xf0,b=0x33;
a^b=?
1111 0000
0011 0011
1100 0011->0xc3
位运算的使用:复合运算
- 把一个值的某位置1,其他位不变。
unsigned int a=8888;把a这个值的第8位设置为1,其他位不变。
- 把一个值的某位清0,其他位不变。
unsigned int a=8888;把a这个值的第7位设置为0,其他位不变。8760
- 把一个值的某几位设置为想要的值,其他位不变。
(9)指针运算符:*
(10)地址运算符:&
(11)下标运算符:[]
(12)成员运算符:.
(13)指向成员的运算符:->
(14)复合赋值运算:+= -= *= /= %= |= &= ^= <<= >>= ……
+=:加等于
注意原型转换
5.运算符的优先级和结合性
5.1 优先级(PDF运算符优先级)
5.2 结合性(PDF运算符优先级)
6.不同数据类型之间的转换
6.1自动类型转换
6.2强制类型转换