一、词法符号
-
概念:是程序设计语言中有若干字符组成的有意义的最小语法单位。 -
分类:
- 从其作用分类:
关键字:由C语言系统预先定义的一些单词,有其固定的作用和意义,不能随意变更。 标志符:由编程人员自行定义命名的一些符号短语单词等,通常用于给变量、函数等命名。 运算符:运算规则,对应的一些符号 分隔符:对各个部分、区块进行分隔的符号://、/**/ # 空格 标点符号:{}、()、;、,
(一)C关键字: 32个
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsighed void volatile while
(二)标志符:
? 命名规则: ? 只能通过 字母 数字 和下划线组成 并且数字不能在首位
(三)运算符:
运算符分类 | 运算符 | 功能 |
---|
算术预算符 | + | 加法运算 | | - | 减法运算 | | * | 乘法运算 | | / | 除法运算 | | % | 取模或求余运算 | 逻辑运算符 | && | 逻辑与 | | || | 逻辑或 | | ! | 逻辑非 | 关系运算符 | > | 大于 | | < | 小于 | | >= | 大于等于 | | <= | 小于等于 | | == | 等于 | | != | 不等于 | 递增递减运算符 | ++ | 递增 | | – | 递减 | 地址运算符 | & | 返回变量的地址 | | * | 指向一个变量 | 逗号运算符 | , | 连接两个表达式 | sizeof运算符 | sizeof() | 求字节长度 | 三目运算符 | ?: | 条件表达式 |
二、gcc
- gcc生成执行文件的步骤:
- 预处理:将宏、头文件展开。.c文件——>.i文件
- 编译:将C语言代码转换为汇编指令。.i文件——>.s文件
- 汇编:将汇编指令转换为机器码。.s文件——>.o文件
- 链接:将各个文件的机器码放到一起生成一个可执行文件。各个.o文件——>.out文件
- C文件类型与后缀名(C语言规范)
文件类型 | 后缀名 |
---|
C源码文件 | .c | C头文件 | .h | 预处理后文件 | .i | 汇编文件 | .s | 二进制文件 | .o |
三、数据
(一)数值数据
- 数值数据包括:整型、浮点型数据。
- 进制:数值 = 字符 * 权重的位置幂
- 十进制:逢十进一。字符:0-9。
- 二进制:值前加”0b",表示二进制数,逢二进一。字符:0和1。
- 十六进制:值前加”0x“,表示十六进制数,逢十六进一。字符:0-9和a-f。
- 八进制:值前加”0“,表示八进制数,逢八进一。字符:0-7。在文件权限上使用,rw-rw-r–,二进制表示:110110100,八进制表示:664。
? 修改文件权限:chmod 权限八进制 文件名。
58 / 2 余 0
29 / 2 余 1
14 / 2 余 0
7 / 2 余 1
3 / 2 余 1
1 / 2 余 1
0
58 = 0b111010
0724 = 0b1 1101 100 = 468 = 0x01d4
0b1101 0011 = 0323 = 195 = 0xd3
256 = 0b1 0000 0000 = 0x0100
练习:
100瓶毒药内有一瓶是毒药,现在有8只实验小白鼠,每只小白鼠吃到毒药后,大约一小时后出现死亡,请问如何才能使鉴别时间最短?
步骤一:给100瓶药编号,并转换为二进制。
步骤二:让的i只老鼠,喝掉所有二进制中第i位为1的药
步骤三:一个周期后观察老鼠状态,第i只老鼠死了,说明毒药瓶子二进制的第i位是1(位置:从右往左1,2,3…),这样根据死了哪几只老鼠,就能得到二进制表示的哪几位是1了,进而最终可以得到毒药的标号。
(二)非数值数据
- 非数值数据包括:语言、文字、符号、图片、声音、逻辑关系等。
四、数据类型
(一)整型
-
范围:对应整数,-无穷~+无穷。 -
分类:int、short、char。
- char:使用8bit,即一个字节来存储这个数。
? 0b 0000 0000 ~ 0b 1111 1111即0~255,有256个数。 ? 有符号数:signed char,范围:-128 ~ +127 ? 无符号数:unsigned char,范围:0 ~ 255 - short:使用16bit,即2个字节来存储这个数。
? 16个0 ~ 16个1,范围:0~65535,有65536个数。 ? signed short,范围:-32768 ~ +32767 ? unsigned short,范围:0~65535 - int:使用4个字节来存储这个数,32bit(32位编译器)。64bit(64位编译器)。
32个0 ~ 32个1 即0~4294967295,有4294967296个数。 有符号数:signed int 无符号数:unsigned int
- 负数的表示:一个有符号数,则其存储空间的最高bit位表示这个数的正负,0代表正,1代表负,数在计算机中存储的是补码。
负数的源码、反码、补码
源码:负数的符号位 + 负数值的二进制表示
反码:源码求反
补码:源码求反加1
(二)浮点型
- 小数存储:小数的存储不是精确数,存储分3个部分。
- 符号位:1bit
- 指示位:8bit
- 有效位:表示有效位数。
- 单精度浮点数(float):4字节,32bit
- 符号位:1bit
- 指示位:8bit
- 有效位:表示有效位数,23bit,十进制七位。
- 双精度浮点数(double):8字节,64bit
- 符号位:1bit
- 指示位:11bit
- 有效位:表示有效位数,52bit。
- C语言中,白哦是一份很大或很小的常量,写作科学计数法。
0.0000000000121 1.21e-11
1231240020406781000 1.2312400e+18
(三)布尔类型
- 真:True、非0
- 假:False、0
0.0 是真
(四)void类型
- 概念:空类型,修饰函数,无返回值或指针可以指向任意类型。
(五)常量
- 概念:写程序时,给定的一些值,在程序运行过程中,这些值不会发生改变。
- 字符常量:对文字的存储,如’w’、‘a’、'!'等。
计算机对字符存储是将字符按某种规则(编码)编号,变成数再存储。如英文、字母、数字、符号常使用ASII编码。中文:GBK、UTF-8编码。
- 字符串常量:如"hello world!",这中常用双引号括起来的被称为字符串。存储时字符串有一个特殊的符号’\0’,等同于数值0。
- 标识符常量:对某个常量进行命名,在后代码中,出现这个标识符名字,都替换为对应的常量。又称宏定义。标识符常量在使用时,并不是调用的定义的表达式的值,而是原封不动地替换为该表达式。
#define PI 3.14
#define PI2 PI * PI
练习:
#include <stdio.h>
#define QUALITY 3.0e-23
#define QUART 950
int main()
{
float weight;
scanf("%f",weight);
weight = weight * QUART / QUALITY;
printf("num:%e\n",weight);
return 0;
}
五、变量
- 概念:对内存空间的命名,必须先定义再使用。
- 变量定义:
存储类型 数据类型 变量名;
- 存储类型:
存储类型 | 描述 |
---|
auto | 由编译器对变量的定义的位置等来自动设计变量的存储类型,通常auto可以省略。 | register | 寄存器类型,当一个变量,使用非常频繁,可以声明这个变量使用寄存器存储类型。 | const | 常量存储,存储变量到常量区,则这个变量的值不能修改。 | extern | 外部引用变量,编译时不需要该变量分配内存空间。 | static | 静态变量,编译时给变量分配静态区内存,静态区内存的特点:该区域的内存空间在程序开始运行时就分配好了,只有当程序结束(main退出),其空间才会被系统回收。 |
4.变量定义与初始化:变量的初始化是在被说明的同时赋给一个值。
存储类型 数据类型 变量名 = 对应类型的值;
<存储类型> <数据类型> <变量名> = <表达式>
表达式:就是由变量、常量、运算符按一定顺序构成的运算序列,表达式的值就是运算序列的结果。
int i = 0;
static double w = 100.56;
double result = 1;
double x = 5,y = x*2;
register int count = 0;
auto double s = 0;
unsigned long int name = 664207250925157143295UL;
float f = 5.0f;
- 类型转换:
(数据类型的名称) <表达式>
int a = 10;
float b = (float)a;
int c = int(b);
- 隐式类型转换:在某些情况下会自动执行类型转化,通常是向精度更高的转换。
六、表达式与运算符
- 表达式:就是由变量、常量、运算符按一定顺序构成的运算序列,表达式的值就是运算序列的结果。
- 运算符:对数据进行操作的动作,是一种告诉编译器执行特定的数学或逻辑操作的符号。
(一)算术运算符
- 算术运算符:主要用于算术运算的,算数运算符包括:+、-、、/、%,属于双目运算符,需要两个操作数(值或表达式)。+、-、、/:适用于数值,float、double;%:只适用于整型。
- 算术运算符的结果:结果是一个数值。
(二)逻辑运算
- 逻辑运算符包括:&&、||、!。
- 逻辑运算符的结果:结果是真1或假0。
运算符 | 描述 |
---|
&& | 逻辑与(有假为假) | || | 逻辑或(有真为真) | ! | 逻辑非 |
(三)关系运算符
- 关系运算符:数值大小关系比较。包括:>、<、>=、<=、==、!=。
- 关系运算符的结果:结果是真1或假0。
运算符 | 描述 |
---|
> | 大于 | < | 小于 | >= | 大于等于 | <= | 小于等于 | == | 等于 | != | 不等于 |
(四)赋值运算符
- 赋值运算符:将右侧的值(表达式的值、变量的值、常量)赋值给左侧的变量。赋值运算符包括:=、+=、-=、*=、/=。
- 赋值运算符的结果:结果是一个数值。
运算符 | 描述 |
---|
= | 赋值 | += | 加运算后赋值 | -= | 减运算后赋值 | *= | 乘法运算后赋值 | /= | 除法运算后赋值 |
(五)递增递减运算符
- 递增递减运算符:是单目运算符,只能与变量结合。
- 运算方法:
运算符 | 描述 |
---|
++a | 表达式的值为2,a的值为2 | –a | 表达式的值为0,a的值为0 | a++ | 表达式的值为1,a的值为2 | a– | 表达式的值为1,a的值为2 |
练习
设下列表达式都有int a = 1;一直++和-- 优先级高于+和-
表达式:(++a + 2);——a = 2 表达式的值为4
表达式:(a++ + 5);——a = 2 表达式的值为6
(六)位运算符
- 位运算符:只有整型
- 位运算符的运算规则:
运算符 | 功能描述 | 作用 |
---|
& | 与:有0为0 | 对整数的某些二进制位置0。 | | | 或:有1为1 | 对整数的某些二进制位置1。 | ^ | 异或:相异为1 | 对整数的某些二进制位取反。 | ~ | 取反:翻转 | 对整数的所有二进制位取反。 | << | 逻辑左移:高位舍弃,低位补0。 | 左移n位,相当于除以2的n次方 | >> | 逻辑右移:低位舍弃,高位补0。 | 右移n位,相当于乘以2的n次方 |
(七)地址运算符
- 地址运算符:是单目运算符,包括:&(取地址运算)、*(指针取值运算)。
- 地址:变量在内存中的编号。
(&a)——表达式的值是a的地址,是地址类型或指针类型。
*(&a)——表达式的值是变量a的值,指针取值运算与取地址运算互为逆运算。指针运算符操作的数的数据类型为地址或地址类型变量(指针变量)。
(八)特殊运算符
- 逗号运算符:分隔表达式,优先级是最低的。逗号表达式:(表达式1,表达式2,……表达式n),其值为表达式n。
- sizeof()运算符:sizeof(变量名或数据类型);作用本质是计算变量对应的数据类型或给定的数据类型所占用的内存空间大小,且其计算再编译时完成。
示例:
int a;
sizeof(a);
- 三目运算符:
- 结构:表达式1 ? 表达式2 : 表达式3;
- 逻辑:如果表达式1为真,则整个表达式的值是表达式2的值,并且表达式3不会被执行。如果表达式1为假,则整个表达式的值是表达式3的值,并且表达式2不会被执行。
//a、b、c三个数中的做大的一个数,赋值给x
//三目运算符的嵌套:优先跟最近的结合
x = a > b ? (a > c ? a : c) : (b > c ? b : c)
(九)运算符优先级
- 运算符的优先级:
最高优先级的 特殊运算符、地址操作符、后缀++、–
二级 单目运算符
算术运算符 > 关系运算符 > 位运算符(单目运算符~除外)> 逻辑运算符(单目运算符!除外) > 三目运算符 > 赋值运算符 > 逗号运算符
|