C语言学习笔记2——数据,运算符
变量
概念
在程序执行过程中其中的值可以被改变的量
- 变量代表内存中具有特定属性的一个存储单元,他是用来存储数据的,也就是存变量的值
- 变量应有个名字,以便于通过名字访问变量
举例:
#include <stdio.h>
int main()
{
// ① 声明变量并初始化
int age = 21; // 注意:这里的 = 不是我们所认为的相等,在这里代表赋值操作,意思是将右边的值赋左边的变量
// ② 先声明,再赋值
int count;
count = 10;
// ③ 初始化并修改变量的值
int number = 12;
printf("%d\n",number);//12, %d是十进制int的格式化符
number = 22;
printf("%d\n",number);//22 我们对同一个变量进行赋值的时候,后面赋的值会覆盖掉前面赋的值
}
基本类型:我们创建变量的同时在内存中开辟对应的内存空间
命名规则:
-
变量名必须以字⺟(a~z)或者下划线(_)开头,后⾯可以跟若⼲个字⺟、数字或下划线;
-
变量名不能与C语⾔中已经存在的标识符(如:int,float,void,if,break等)重名;
变量名、变量值、变量所占存储单元之间的关系:
标识符
- 标识符的定义:⽤来表⽰对象的名字的有效字符。对象包括变量、常量、数组、函数、类型等。也就是标识符就是对象的名字。
- 标识符的构成:
①C语⾔规定标识符只能由字⺟、数字和下划线3种字符构成,且第⼀个必须为字⺟或者下划线。举例:number,_int
②编译系统对⼤⼩写敏感。变量名和函数名⼀般⽤⼩写字⺟+下划线,常量名和枚举名⼀般⽤⼤写字⺟+下划线。举例:
变量(set_count)函数(set_count())常量(SET_COUNT)
* C语⾔中有3类标识符
①关键字:有32个,系统有特定的含义和⽤途:如:float,int,if,else等,不能⽤作⾃定义表⽰符(变量和函数)
②系统预定义的标识符:如系统提供的库函数名sim,printf,main,scanf以及预处理命令define,include等
③⽤⼾标识符:⽤⼾定义的标识符,⽤来给程序的变量、⾃定义函数、符号常量、数组、结构体、共⽤体、⽂件等命名
注意:
在C语⾔中,要求对所⽤到的变量使⽤前必须先强制定义,即:先定义,后使⽤。
- C语⾔中有32个关键字,不允许⽤⼾⽤来定义标识符。
- 12个预处理命令:
说明:
- ⼀个类型说明语句可以同时定义多个类型的变量,各个变量之间使⽤逗号","分隔,多个同类型的变量也可以⽤多个类型说明语句定义:
// 一个类型说明语句可以同时定义多个类型的变量
int a,b,c,d;// 同类型
int a1 = 3,b1 = 4,c1 = 5, d1 = 6;
// 多个同类型的变量也可以用多个类型说明语句
int a;
int b;
int c;
int d;
int a1 = 3;
int b1 = 4;
int c1 = 5;
int d1 = 6;
- ⽤类型说明语句定义的变量只是说明了为这些变量分了存储空间。以便于存放与之相同类型的数据,在未对这些变量赋值前,这些变量中的值是随机的;
- C语⾔允许在定义变量的同时为变量赋初始值;
- 在为⻓整型变量初始化或者赋值时,如果被赋值数据为基本整型常量,则C编译系统⾃动将被赋值数据转换成与相应变量类型⼀致。
- 由于各种整型变量所占的字节数有限,因此,他们所能存放的整数有⼀定范围。
基本类型数据
整形数据
用来存放整型数据的变量
我们定义一个整型的变量,C编译系统实际是在内存中分配了能够存储一个整型数据的存储空间,并用变量名来标识这个空间,对该空间的使用也就可以通过变量名来访问。
若不知道你所用的C编译系统对变量分配的存储空间的大小,可用sizeof运算符查询,如:
printf("%d,%d,%d\n",sizeof(int),sizeof(short),sizeof(long));// 4,2,8
案例
整型变量的定义和使用。
#include <stdio.h>
int main()
{
int a,b,c,d;// 定义有符号整型变量,可以存储负数,也可以存储正数
unsigned int u;// 定义无符号整型变量,只能存储正数,正数的范围会变大
a = 12;
b = -24;
u = 10;
c = a + u,d = b + u;
printf("a+u=%d,b+u=%d\n",c,d);// a+u=22,b+u=-14;
}
整形数据在内存中的存储方式
- 数据在内存中是以二进制形式存放的
int i;//定义i为存储整形的变量
i=10;//给i赋整数10为值
则十进制数10的二进制形式为1010,这内存中存放形式为:
- 实际上数据在内存中是以二进制补码形式表示的。
- 正数补码和原码相同,负数的的补码是该数绝对值的二进制形式,按位取反加1
可见
在存放整数的存储单元中,最左边的一位表示符号位,符号位0表示正数,1表示负数
浮点型数据
概念:用来表达实数(小数)的数据类型
浮点型变量的分类
- 单精度浮点型(flaot):在64位系统中典型尺寸是4字节,精确到小数点后6位,%f
- 双精度浮点型(double):在64位系统中典型尺寸是8字节,精确到小数点后15~16位,%lf
- 长双精度浮点型(long double):在64位系统中典型尺寸是16字节,
注意:占用内存越多,能表达的精度就会越高
浮点型数据在内存中的存放形式
浮点型数据在内存中按照指数型形式进行存放,系统将一个浮点型数据分成小数部分和指数部分,分别存放
类别 | 符号位 | 指数位 | 小数部分 | 指数偏移量 |
---|---|---|---|---|
单精度 | 1位(剩31)6 | 8位(31~23) | 23位(22~00) | 127 |
双精度 | 1位(剩43) | 11位(62~52) | 52位(51~00) | 1023 |
字符型数据
概念:字符型变量用来存放字符变量
说明:一个字符只能存放一个字符,C编译系统 都规定一个字节的存储空间来存放一个字符,因此,一个字符变量在内存中的大小是1字节
字符数据在内存中的存储形式
字符常量存入一个字符便变量,实际上并不是把该字符本身存入内存单元中,二十将该字符对应的ASCII码存入内存单元
'a’的ASCII码为97、'b’的ASCII编为98,他们在内存中的存放形式:
实际上是按照二进制存放,形式为:
由此可见,在内存中字符数据的存储形式与整型数据类似,这就使得字符型数据和整型数据之间可以通用。也就是1个字符数据既可以字符形式输出,也可以以整数形式输出
- 以字符形式输出时,编译系统将内存单元中的ASCII码转换成相应的字符,然后输出。
- 以整数形式输出时,直接将ASCII码作为整数输出。
- 因此,可以对字符数据进行算术运算,这时相当于对其ASCII码进行算术运算
注意:字符数据只占1个字节,只能存放0~255范围内的整数。
C语言允许字符数据与整数直接进行算术运算,
可以相互赋值。每一个英文小写字母比它相应的大写字母的ASCII大32
运算符
各类数值型数据间的混合运算
-
整型、实型、字符型数据间可以进行混合运算,运算时,参加运算的两个数据如果 类型不同 ,则首先将其类型转换成一致再运算,转换规则是:
将优先级低的类型转换到优先级高的类型,被称作自动类型转换
注意:在混合运算过程中,系统所进行的类型转换并不改变原数据的类型,只是在运算过程中将其值变成同类型后在运算。
- C语言提供了强制类型转换(大转小 )运算,可得到一个所需类型的数据,强制类型转换的形式为:
①double)a 将a的值转换成double类型
②(int)(x+y)将x+y的结果转换为int类型
③(int)x+y将x的值转换成int类型后与y进行相加
④(float)(5%3)将5%3的值转换成float类型
特别需要说明的是:在强制类型转换的过程中,并不改变原变量的类型,只是在运算过程中将其值转换类型后再运算。
C语言运算符和C语言表达式
运算符
序号 | 名称 | 符号 | 序号 | 名称 | 符号 |
---|---|---|---|---|---|
1 | 算术运算符 | ±*/% | 8 | 指针运算符 | * & |
2 | 关系运算符 | > < >=<= == != | 9 | 字节数运算符 | sizeof |
3 | 位运算符 | << >> ~ | ^ & | 10 | 下标运算符 | [] |
4 | 赋值运算符 | = += -= *= /= %= | 11 | 强制类型转换运算符 | (类型) |
5 | 逻辑运算符 | ! && || | 12 | 分量运算符 | . -> |
6 | 条件运算符 | /: | 13 | 其他 | 函数调用运算符() |
7 | 逗号运算符 | , |
表达式
所谓表达式就是将操作对象用运算符连接起来的符合C语法规则的式子。
序号 | 名称 | 举例 | 说明 |
---|---|---|---|
1 | 算术表达式 | 2+6.7*3.5 | 计算结果是数值类型 |
2 | 关系表达式 | x>0,y<=z+6 | 计算结果是布尔类型 ,或0和非0 |
3 | 逻辑表达式 | x>0&&y>0 | 计算结果是布尔类型 ,或0和非0 |
4 | 赋值表达式 | a=5,sum+=i | 规则:右往左 |
5 | 逗号表达式 | x=3,y+=4,z-=8 | 分隔,并列,结果是最后一个表达式的值 |
C语言规定了运算符的优先级和结合性。在表达式求值时,按运算符的优先级别的高低次序执行。如果运算对象两侧的运算符优先别相同,如a+b+c,则按照规定的“结合方向”处理。
C语言运算符优先级
|
| ---- | ---------- | ------------- | ------------------------------------ |
| 1 | 算术表达式 | 2+6.7*3.5 | 计算结果是数值类型 |
| 2 | 关系表达式 | x>0,y<=z+6 | 计算结果是布尔类型 ,或0和非0 |
| 3 | 逻辑表达式 | x>0&&y>0 | 计算结果是布尔类型 ,或0和非0 |
| 4 | 赋值表达式 | a=5,sum+=i | 规则:右往左 |
| 5 | 逗号表达式 | x=3,y+=4,z-=8 | 分隔,并列,结果是最后一个表达式的值 |
C语言规定了运算符的优先级和结合性。在表达式求值时,按运算符的优先级别的高低次序执行。如果运算对象两侧的运算符优先别相同,如a+b+c,则按照规定的“结合方向”处理。