3.1:定义
数据类型分为:
原子类型:不可以再分解的基本类型
结构类型:由若干数据类型组合而成的,是可以再分解的数据类型
3.2:基本数据类型
(1)整数
整型 --int (4字节)
短整型 --short int(2字节)
长整型 --long int (8字节)
(2)浮点数(实数)
单精度浮点数 --float (4字节)
双精度浮点数 --double(8字节)
(3)字符(字符型变量并不是将字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元)
单个字符 --char (1字节)
字符串 --str(字符串:character string是一个或多个字符的序列)
(一):以数字‘\0’结尾的字符数组是字符串
(二):字符串处理以‘\0’作为结束符,后面的字符不会输出
(三):C语言中没有专门存储字符串的变量类型,字符串都被存储在char类型的数组中
/*
时间:2022年3月23日14:58:20
目的:测试char的用法
*/
#include
int main(void)
{
char ch;
printf("please enter a character.\n");
scanf_s("%c",&ch); //%c指明待打印的字符
printf("the code for %c is %d\n",ch,ch);
return 0;
}
/*
output:
please enter a character.
C
the code for C is 67
*/
3.3:复合类型数据
枚举
(1)什么是枚举?
把一个事物所有可能的取值一一列举出来
(2)怎么使用枚举?
enum weekday //enum:枚举(列举类别)
{
MonDay, TuesDay, WednesDay, ThursDay, FriDay, SaturDay, SunDay
};
void f(enum weekday i)
{
switch (i)
{
case 0:
printf("MonDay!\n");
break;
case 1:
printf("TuesDay!\n");
break;
case 2:
printf("WednesDay!\n");
break;
case 3:
printf("ThursDay!\n");
break;
case 4:
printf("FriDay!\n");
break;
case 5:
printf("SaturDay!\n");
break;
case 6:
printf("SunDay!\n");
break;
}
}
int main(void)
{
f(FriDay); //虽然FriDay本质上就是5,但直接写成f(5)就是错的
return 0;
}
(3)枚举优缺点
代码更安全(书写麻烦)
数据类型决定:1数据占内存字节数
2数据取值范围
3其上可进行的操作
数据类型的存在意义:给变量分配合适的内存空间
3.4:常量、变量、标识符
3.4.1:标识符
定义:用来命名变量、常量、函数等的字符序列
组成:
-只能由字母、数字、下划线组成,且第一个字符必须是字母或下划线
-大小写敏感
-不能使用关键字(关键字:C语言中预先保留的单词)
长度:最长32个字符
3.4.2:常量
定义:程序运行时其值不能改变的量(即常数)
分类:
1>符号常量:用标识符代表常量
2>直接常量:
(1)整型常量(二、八、十、十六进制的整数)
(2)实型常量(浮点数)(默认double型)
(3)字符常量(用单引号括起来的单个普通字符或转义字符<反斜线后跟一个字符或一个代码值表示>)
(4)字符串常量
定义:用双引号括起来的字符序列
存储:每一个字符串尾自动加一个‘\0’作为字符串结束标志
整数以补码的形式转化为二进制代码存储在计算机中;
实数以IEEE754标准转化为二进制代码存储在计算机中;
字符与整数的存储方式相同
*浮点数的存储所带来的问题
float和double都不能保证可以精确的存储一个小数
例子:
float i = 99.9;
printf(“%f\n”);
在vs2019中的输出结果:99.900002
3.4.3:变量(初始化就是赋值的意思;不初始化的变量通常就是垃圾值)
1>定义:其值可以改变的量
2>如何定义变量?
数据类型 变量名 = 要赋的值;
等价于
数据类型 变量名;
变量名 = 要赋的值;
eg:
int i = 3; 等价于 int i ; i=3;
int i, j = 3; 等价于 int i; int j; j =3;
3>分类
(1)整型变量:占字节数随机器不同而不同,一般占一个机器字符(short
(2)实型变量(float、double)
(3)字符变量(char)
4>变量的作用域和存储方式
❶按作用域分
①全局变量
在所有函数外部定义的变量(使用范围:从定义位置开始到整个程序结束)
②局部变量
在一个函数内部定义的变量或函数的形参(使用范围:只能在本函数内部使用)
#注意问题
1.全局变量和局部变量命名的冲突问题
2.在一个函数内部如果定义的局部变量的名字和全局变量名字一样时,局部变量会屏蔽掉全局变量
❷按变量的存储方式分
静态变量
自动变量
寄存器变量
3.4.4:运算符和表达式
(1)算数运算符 + - * / %
%:运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同;
被除数小于除数时,运算结果等于被除数
两个小数是不可以作为取模运算的
(2)关系运算符
1 关系运算符:用来对两个数值进行比较的运算符
2 六种关系运算符:
(1)< 小于 (2)<=小于等于
(2)> 大于 (4)>=大于等于
优先级相同(高)
(5)==等于 (6)!= 不等于
优先级相同(低)
3 关系表达式:用关系运算符将两个表达式连接起来(关系表达式的值是一个逻辑值,非真即假)
(3)逻辑运算符
1 三种逻辑运算符:
&&(与) ||(或) 双目(元)运算符
!(非) 一目(元)运算符
2 逻辑表达式:用逻辑运算符将关系表达式或逻辑量连接起来(逻辑表达式的值应该是逻辑量“真”或“假”)
3 编译系统在表示逻辑运算时以数值1代表“真”,以数值0代表“假”
(4)赋值运算符
= += -=
/= *= %=
1.= 赋值运算符
变量=表达式如:a=3;将a的值赋为3
2./= 除后赋值
变量/=表达式 如:a/=3;即a=a/3
3.*= 乘后赋值
变量=表达式 如:a=3;即a=a*3
4.%= 取余后赋值
变量%=表达式 如:a%=3;即a=a%3
5.+= 加后赋值
变量+=表达式 如:a+=3;即a=a+3
6.-= 减后赋值
变量-=表达式如:a-=3;即a=a-3
(5)自增(自减)运算符【使变量值加1或减1】
分类:前置自增:++i(先让变量+1,然后进行表达式计算)
后置自增:i++(先使用i值,再执行i+1)
#include
using namespace std; //使用名字空间std
int main02()
{
//前置和后置的区别
//前置递增:先让变量+1,然后进行表达式运算
int a = 10;
int b = ++a * 10;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
//后置递增
int a2 = 10;
int b2 = a2++ * 10;
cout << "a2 = " << a2 << endl;
cout << "b2 = " << b2 << endl;
return 0;
}
/*
output:
a = 11
b = 110
a2 = 11
b2 = 100
*/
出现原因:自增速度快
代码更精炼
学习自增应明白的几个问题?
1>在编程时应该尽量屏蔽掉前自增和后自增的差别
2>i++或++i单独成一个语句,不要把它作为一个完整复合句的一部分来使用
(6)三目运算符
A ? B : C 等价于
if(A)
B;
Else
C;
(7)逗号表达式
格式:(A,B,C,D)
功能:从左到右去执行,最终表达式的值是最后一项的值
(8)位运算符
现实意义:通过位运算符我们可以对数据的操作精确到每一位
& -- 按位与 && -- 逻辑与(也叫并且)
&&与&的含义完全不同
例子:1&1 = 1
1&0 = 0
0&0 = 0
0&1 = 0
| -- 按位或 || -- 逻辑或
|与||的含义完全不同
例子:1|1 = 1
1|0 = 1
0|0 = 0
0|1 = 1
~ -- 按位取反
-- ~i就是把i变量所有的二进制位取反
^ -- 按位异或
-- 相同为0,不同为1
<< -- 按位左移
例子:i<<1表示把i的所有二进制位左移一位,右边补零(左移n位相当于乘2的n次方)
>> -- 按位右移
例子:i>>1表示把i的所有二进制位右移一位,左边一般补零,当然也可能补1(左移n位相当于除以2的n次方,前提是数据不能丢失)
优先级:!> 算术运算符 > 关系运算符 > &&、|| > 赋值运算符