【C语言1】基本数据类型、表达式及运算符
文章目录
- 1.基本数据类型、表达式及运算符
- 1.1 C语言中链接数据类型的种类
- 1.2 基本数据类型
- 1.2.1 整型
- 1.2.2 字符型
- 1.2.3 浮点型
- 1.2.4 缺省类型(空类型void)
- 1.2.5 泊尔类型(bool)
- 1.3 printf终端打印工具
- 1.4 常量与变量
- 1.5 表达式
- 1.6 类型转换
- 1.7 运算符
- 1.7.1 算数运算符
- 1.7.2 赋值运算符
- 1.7.3 三目运算符
- 1.7.4 逗号运算符和sizeof( )运算符
- 1.7.5 关系运算符
- 1.7.6 逻辑运算符
- 1.7.7 位运算符
- 运算符优先级
1.基本数据类型、表达式及运算符
本章思维导图:
此处为C语言汇总版:【C 语言md编辑器版】从0基础开始到熟练掌握【完整篇,共9部分】
1.1 C语言中链接数据类型的种类
基本数据类型
- 整型
- 字符型
- 浮点型
- 缺省型(空类型void)
- 泊尔类型(bool)
构造数据类型
指针类型
1.2 基本数据类型
在学习数据类型之前我们可以先学习两个关键字和转义字符、格式控制符、格式修饰符,有助于学习不同数据类型的大小。
运用sizeof( )关键字可以获取数据类型在内存中所占的字节数。
运用printf(" ")可以在终端打印引号内的内容。
转义字符:是通过特定的符号序列表示特殊字符或操作的方式,常用于处理不可打印字符或具有特殊意义的字符。
格式控制符:也被称为格式化字符串或格式化标识符。它们是用于指定数据格式的特殊字符序列。
1.2.1 整型
整型数据如int、short、long在内存中以补码形式存储。
有符号整型:可以表示正数,也可以表示负数
最高位为符号位(0:正数 1:负数)
其他位位数据位
正数的补码=原码 负数的补码=反码-1
例如:-2026
原码:1000 0111 1110 1010
反码:1111 1000 0001 0101
补码:1111 1000 0001 0110
无符号整型:仅能表示正数
- 最高位为符号位
整型数据的溢出:
例如:unsigned short 最大值+1?
最大值+1----》最小值
最小值-1-.–》最大值
●short短整型(内存中2字节)
无符号:0000 0000 0000 0000(最小值0) ——1111 1111 1111 1111(最大值65535)
有符号:1000 0000 0000 0000(最小值-32768) ——0111 1111 1111 1111(最大值32767)
●int整型(内存中为4字节)
●long长整型(内存中为8字节)
总结:
初学C语言时,int类型应该能满足大多数程序的整数类型需求。尽管如此,还应了解一下整型的其他形式。C语言提供3个附属关键字修饰基本整数类型:short、long和unsigned。应记住以下几点:
- short int类型(或者简写为short)占用的存储空间可能比int类型少,常用于较小数值的场合以节省空间。与int类似,short是有符号类型。
- long int或long占用的存储空间可能比int多,适用于较大数值的场合。与int类似,long是有符号类型。
- long long int或long long(C99标准加入)占用的储存空间可能比long多,适用于更大数值的场合。该类型至少占64位。与int类似,long long是有符号类型。
- unsigned int或unsigned只用于非负值的场合。这种类型与有符号类型表示的范围不同。例如,16位unsigned int允许的取值范围是0-65535,而不是-32768~32767。用于表示正负号的位现在用于表示另一个二进制位,所以无符号整型可以表示更大的数。
- 在C90 标准中,添加了 unsigned long int 或 unsigned long 和 unsigned int 或 unsignedshort 类型. C99 标准又添了 unsigned long long int 或 unsigned long long.
- 在任何有符号类型前面添加关键字signed,可强调使用有符号类型的意图。例如,short、shortint、signed short、signed short int 都表示同一种类型.
1.2.2 字符型
在所有的编程语言中,字符型数据都是以ASCII码(美国信息交换标准代码)的形式保存每一个字符都对应着一个编码,这个编码其实是一个整数来的,编码范围:0 ~ 127。因此字符型数据也可以当作整形数据进行运算。ASCII码表如下:
1.2.3 浮点型
用来表示小数的数据类型。
- 单精度浮点型:float
- 精度范围:6-8位
- 内存中占的字节数:4
- IEEE标准规定,double类型在内存中符号位(1bit)、指数位(8bits)、尾数位(23bits)方式存储。
8.125
符号位:0
1000.001——>1.000001 2^3
指数位:127+3=130——>1000 0010
尾数位:00000100000000000000000
内存位:0100 0001 0000 0010 0000 0000 0000 0000
0x41020000
- 双精度浮点型:double
- 精度范围:12-16位
- 内存中占的字节数:8
- EEE标准规定,double类型在内存中符号位(1bit)、指数位(11bits)、尾数位(52bits)方式存储。
8.125
符号位:0
1000.001——>1.000001 2^3
指数位:1023+3=1026——>100 0000 0010
尾数位:00000100000000000000000…(1后有46个0)
内存位:0100 0000 0010 0000 0100 0000 0000 0000…
0x40204000…
注意:浮点数据在储存时可能出现精度损失。
1.2.4 缺省类型(空类型void)
函数的形参和返回值:不返回参数、不返回数据。
用在函数和指针部分,目前暂做了解
1.2.5 泊尔类型(bool)
结果:true/false
#include<stdio.h>#include<stdbool.h>intmain(){boola=true;boolb=false;printf("sizeof(a):%d true:%d false:%d\n",a,a,b);return0;}//输出结果:sizeof(a):1true:1false:01.3 printf终端打印工具
用法:可以向终端打印出“”里面的内容,当遇到%开头的格式控制符时,将格式控制符换成逗号后面的值。
| 格式控制符号 | 意义 |
|---|---|
%d | 以十进制整型数据(int)方式打印 |
%ld | 以十进制整形数据(long)方式打印 |
%c | 以字符方式打印 |
%f | 以float类型控制打印 |
%lf | 以double类型控制打印 |
%u | 以无符号整形数据方式打印 |
%lu | 以无符号长整型方式打印 |
1.4 常量与变量
C 语言操作的对象。
常量
在程序运行过程中值不会发生改变的量叫做常量。
整型常量
不带任何后缀的整型常量默认为signed int类型。
u:无符号 L:长整型
十进制整型常量:
123 123L 123ul 123u 八进制整型常量:
0123 0123L 0123uL 0123u 十六进制整型常量:
0x123字符型常量
ASCII 表
‘字母/数字/特殊符号’——> 都是字符
特殊字符:
| 特殊字符符号 | 输出 |
|---|---|
\0 | 0 |
\a | 响铃 |
\b | 退格 |
\t | 横向制表符 |
\v | 纵向制表符 |
\n | 换行符 |
\r | 回车符 |
\\\ | \ |
\\(加三位数字,不足三位前面补 0) | 八进制的数 |
\x(两位数字) | 十六进制数 |
%% | % |
/" | " |
浮点型常量
小数默认是double类型。后缀加上f就为float类型。
例如:double型:
3.14 3.14E2 3.14e-2float型:
3.14f 3.14E2f 3.14e-2f字符串常量
“ ” 用双引号引起的内容即为字符串。
注:所有字符串在最后都会有‘\0’这个不可见字符作为字符串结束标志。
标识符常量(宏定义)
语法:define 标识符 数值
例:#define PI 3.14
注:标识符一般都采用纯大写,且只做代码的替换,不做其他运算。
变量
在程序运行过程中值可以发生改变的量叫做变量。
变量在 C 语言中的定义:
数据类型 名称
变量名的命名规则:
- 由数字、字母、下划线组成,其中数字不能作为开头;
- 需要避免与 C 语言关键字、库函数、系统函数重复;
- 名称一般具有代表意义;
命名规则种类:
驼峰法;例:MaxValue
Linux 内核命名(下划线);例:max_value
变量的初始化
语法:
数据类型 变量名 = 值变量的复制
1.5 表达式
定义:使用关系运算符连接常量或变量构成的句子。
注:任何表达式都会有一个确切类型的结果。
1.6 类型转换
显示强制转换
语法:
(目标类型) 转换对象强制转换带精度数据时,高精度会损失精度。
强转不会改变原数据。
隐式类型转换
转换规则:
此类型转换由操作系统完成。
1.7 运算符
1.7.1 算数运算符
- 双目运算符:
+ - * / % - 单目运算符:自增运算符(
++)自减运算符(--)
注:i++先用后加++i先加后用
求余运算符%必须是整型数据或与整型兼容的数据类型。
1.7.2 赋值运算符
=+=-=/=*=
赋值运算符优先级(14)极低,仅高于逗号,。
例:a += 10 +5——>a = (10 + 5)
a += b——>a = a + b其余的均类似
左值:放在运算符左边的数,只能是变量。
右值:放在运算符右边的数,可以是变量、常量、表达式。
两边需保持数据类型一致,否则在某些情况下,会出现数据改变。
例如:
int a = 3.14; //此时a只能储存正数部分int a = -100; unsigned int b = 0;b = a;//此时b会直接储存a所在内存的数据,数据的符号位变为数据位,数据改变。小空间数据类型放入大空间数据类型时,从低位开始储存,高位补符号位(数据不改变)大空间数据类型放入小空间数据,在小空间数据类型范围内数据不变,反之高位截断
1.7.3 三目运算符
三个操作数。
语法:表达式1 ?表达式2 :表达式3
若表达式1成立,则三目运算符的结果为表达式2,反之结果为表达式3。
1.7.4 逗号运算符和sizeof( )运算符
- 逗号运算符
逗号在式中为运算符,优先级最低。在其余位置一般为分隔符。
例:num = 2 + 3, 4 * 5, 6 - 4; //结果为5 num = (2 + 3, 4 * 5, 6 - 4); //结果为2 printf("%d\n", num ); \\此时逗号为分隔符 sizeof()
用来获取数据类型/常量/变量/表达式的结果在计算机内存中占的字节数。
返回结果:unsigned long
1.7.5 关系运算符
<>>=<===!=
详细知识点请见章节3.3 分支结构。
1.7.6 逻辑运算符
&&||
详细知识点请见章节3.3 分支结构。
1.7.7 位运算符
运算符优先级
| 优先级 | 运算符集合 | 运算目数 | 结合方向 |
|---|---|---|---|
| 1 | ()[]->. | 后缀运算符 | 左→右 |
| 2 | !~++---(类型)*&sizeof | 单目运算符 | 右→左 |
| 3 | */% | 双目运算符 | 左→右 |
| 4 | +- | 双目运算符 | 左→右 |
| 5 | <<>> | 双目运算符 | 左→右 |
| 6 | <<=>>= | 双目运算符 | 左→右 |
| 7 | ==!= | 双目运算符 | 左→右 |
| 8 | & | 双目运算符 | 左→右 |
| 9 | ^ | 双目运算符 | 左→右 |
| 10 | | | 双目运算符 | 左→右 |
| 11 | && | 双目运算符 | 左→右 |
| 12 | || | 双目运算符 | 左→右 |
| 13 | ?: | 三目运算符 | 右→左 |
| 14 | =+=-=*=/=%=<<=>>=&=^=|= | 双目赋值运算符 | 右→左 |
| 15 | , | 逗号运算符 | 左→右 |
