Skip to content

C语言基础 ​

1、C语言的关键字 ​

1、数据类型相关的关键字12 ​

char 、short、int 、long 、 float、double、
struct、union、enum 、signed、unsigned、void

计算机最小的存储单位为 二进制

计算机最小的分配单位为 字节

二进制:没位只能存放0或1 b

8位二进制位 == 1字节 B

1B == 8b1KB = 1024B 1MB = 1024KB 1GB = 1024MB

1TB = 1024GB 1PB = 1024TB 1EB = 1024PB

char 字符类型 1字节
short 短整型 2字节
int 整型 4字节
long 长整型 4字节
float 单精度浮点数 4字节
double 双精度浮点数 8字节
struct 结构体 union 共用体 enum枚举 signed有符号数 unsigned无符号数
void 空类型

2、存储相关关键字5 ​

register、static、const、auto、extern
register寄存器变量
static 静态变量
const只读变量
auto 自动变量

3、控制语句相关的关键字11 ​

if 、else 、break、continue、for 、while、do、switch case goto、default
if else switch case default条件控制语句
for while break continue goto 循环控制语句

4、其他关键字3 ​

sizeof、typedef、volatile
sizeof测量类型的大小
typedef给类型取别名
volatile防止编译器优化

2、数据类型关键字 ​

1、常量和变量 ​

常量:既见既所得 它的值不能修改

'a' '1' 10 "hello" 3.14f 3.14

变量:系统会自动根据变量的类型大小 为变量开辟内存空间

变量的值 可以被修改

c
int num = 10;
void num=10;//系统无法给num开辟空间(无法判断void的大小) 所以定义失败

记住:变量名的 命名规则

变量由字母、数值、下划线组成 不能以数值开头。不能是关键字

2、整型 ​

整型常量:10

变量的初始化:

定义变量的时候 给变量赋值 叫初始化。

c
int num = 10;//是初始化
int data;
data=10; //不是初始化

变量的使用:读(取值) 写(赋值)

变量的声明:先使用 后定义 必须事先对变量进行声明

获取键盘输入:scanf获取键盘输入函数

c
#include <stdio.h>
int scanf(const char *format, ...);
format:获取数据的格式

3、字符类型 char ​

字符常量 'a' '0' '2'

单引号 只能作用一个字符,转义字符除外

c
A:'a' B:'#' C:'12'错误 D:'2'

单引号:

第一个作用:'a' 描述a为字符

第二个作用:取字符的ASCII值

printf %c 输出的是字符

printf %d输出的是字符的ASCII值

字符的大小写转换:

键盘输入一个字符,如果是大写 就转换成小写 如果是小写就转换成大写

c
'a' 97 'b' 98 'c' 99 ...... 'z' 122
'A' 65 'B' 66 'c' 67 ...... 'z' 90

char ch = 'a';
ch = ch‐('a'‐'A');

char ch = 'A';
ch = ch+('a'‐'A');

4、实型(浮点数) ​

单精度浮点数(float) 双精度浮点数double

1、实型常量 3.14 3.14f

不以f结尾的实型常量为double类型

以f结尾的实型常量为float类型

指数形式: 123e3 代表 123*10 的三次方 123e-3

2、实型变量

float型:占4字节,7位有效数字,指数-37到38 3333.33333 double型:占8字节,16 位有效数字,指数-307到308

3、有符号数和无符号数 ​

有符号数:

数据二进制的最高位为符号位 其他位为数据位。
最高位为1 表示负数
最高位为0 表示正数
以一字节为例:xddd dddd
1111 1111~1000 0000~0000 0000~0111 1111
-127 ~-0 ~+0 ~+127
将-0看成-128
-128~127

//方式一:默认方式(推荐)
int num;//num为有符号数
//方式二:使用关键字signed显示说明
signed int num;

%d 输出有符号int
%hd输出有符号short
%ld输出有符号long
无符号数
没有符号位 所有二进制位都是数据位
0000 0000 ~1111 1111
0 ~ 255

unsigned int num;
%u 输出无符号unsigned int
%hu 输出无符号unsigned short
%lu 输出无符号unsigned long

4、二进制、八进制、十进制、十六机制 ​

二进制:0~1
c语言 不能直接输出二进制
八进制:0~7
八进制:以0开头 0123 %o 输出八进制 不区分正负数
十进制:0~9
十进制:123 %d %ld %hd %u %lu %hu
十六进制:0~9 a~f
十六进制:以0x12 %x 输出十六进制 不区分正负数
n进制:0~n-1

5、原码、反码、补码 ​

计算机存储的是数据的补码。
原码:数据的二进制形式
123:原码0111 1011

无符号数:
补码==反码==原码
123原码:0111 1011
123反码:0111 1011
123补码:0111 1011

有符号数:
正数:
补码==反码==原码
+123原码:0111 1011
+123反码:0111 1011
+123补码:0111 1011

负数:
反码==原码符号位不变 其他位按位取反。
补码==反码+1
-123原码:1111 1011
-123反码:1000 0100
-123补码:1000 0101

负数在计算机以补码的方式存储
非负数在计算机以原码的方式存储

6、计算机对数据的存储 ​

负数在计算机以补码的方式存储

非负数在计算机以原码的方式存储

八进制数 以原码存储

十六进制 以原码存储

7、计算机对数据的取 ​

如果是对 无符号变量 进行取值:

不管是有符号提取(%d %hd %ld) 还是无符号提取(%u %hu %lu %o %x) 都是输出内存的原样数据。(16进制转化的10进制数)

·

如果是对 有符号变量 进行取值:(16进制输出的时候要补位)

系统会去看内存的最高位,如果最高位为0 表明正数, (有符号或无符号输出)都是内存原样 输出

​ 系统会去看内存的最高位,如果最高位为1 表明负数, 无符号输出(%u %lu %hu %o%x)都是 内存原样 输出, 有符号输出(%d %hd %ld),将内存数据求补码(得到原码)输出。

总结:
有符号数、并有符号提取、且内存最高位为1 将内存数据 求补码 输出 ,其他数据提取都是内存原样输出。
对无符号数据 提取 都是内存原样输出
对有符号数据 无符号提取 是内存原样输出
对有符号数、内存最高位为0 有符号提取 是内存原样输出

8、其他关键字 ​

1、const修饰变量为只读

c
//const修饰num为只读变量本质是变量
//只读变量只能初始化不能被赋值
const int num
100;
num = 200;//error.

2、register修饰寄存器变量

如果变量 别高频繁使用 会自动将变量存储在寄存器中 目的:提高访问效率

如果用户想将变量 直接放入寄存器中 可以加register修饰

c
void test03 (){
    //将num放入寄存器中提高访问效率num也叫寄存器变量
    register int num = 10;
    
    //不能对寄存器变量取地址&num是错误的
    &num; //&取的是内存地址而num可能在寄存器中所以取地址失败
    //register修饰的变量只是尽量放入寄存器中。
}

3、volatile关键字

c
volatile int num = 10;//对num的访问 必须从内存访问

4、sizeof测量类型的大小

5、typedef给已有的类型重新取个别名

不能创建新类型。

将长且复杂的类型名 取一个短小的名称。

typedef作用的步骤:

1、先用 已有的类型 定义一个普通的变量

2、用别名 替换 变量名

3、在整个表达式最前方 加typedef

c
typedef int MY_ARRAY[5];
MY_ARRAY arr;

typedef int *POINTER;//POINTER == int *
POINTER p;//int *p;

9、转义字符 ​

1 '\0' == ASCII 为0
2 '\n' == 换行符
3 '\t' == tab缩进符
4 '\r' ==回到行首符号
5 '\a' ==发出警报
'\ddd' 每个d的范围必须是0~7 3个d表示最多识别3位八进制数据
以下字符描述正确的是__A__
1 A:'\123' B:'\18' C:'\1234' D:'\183'
'\xhh' 每个h的范围0~9 a~f 2个h表示最多识别2位十六进制
以下字符描述正确的是__BD___
1 A:'\af' B:'\123' C:'\x3df' D:'\xab'

10、类型转换 ​

不同类型数据之间进行混合运算时必然涉及到类型的转换问题。

自动类型转换:保证精度不丢失 将小的类型 转成 大类型

11、运算符 ​

算数运算符 ​

+ ‐ * / % += ‐= *= /= %=

关系运算符 ​

(>、<、==、>=、<=、!= )

逻辑运算符 ​

&&逻辑与:
A && B A为真 且 B为真 整个表达式结果才为真。
A && B A或B只要有一个为假 整个表达式结果才为假。
注意:逻辑与&&的短路特性:
如果A为假 整个表达式为假, 那么B的真假决定不了整个表达式的结果,所以不
会再判断B的真假,就叫“短路特性

||逻辑或:
A || B A和B只要有一个为真 整个表达式结果为真。
A || B A和B同时假 整个表达式结果为假。
注意逻辑或||的短路特性:
如果A为真 整个表达式为真, 那么B的真假决定不了整个表达式的结果,所以不
会再判断B的真假,就叫“短路特性”

!逻辑非:
!真 == 假 !假==真
在c语言中 除了0为假 其他都为真

产生随机数 ​

srand(time(NULL))
num = rand()

位运算(二进制位运算) ​

1、& 按位与
语法:全1为1 有0为0
特点:和1相与保持不变 和0相与为0
场景: 将指定位 清0
2、| 按位或
语法:有1为1 全0为0
特点:和1或置1, 和0或 保持不变
场景:将指定位 置1
3、~按位取反
语法:0变1 1变0
~1100 0011 == 0011 1100
4、^ 按位异或
语法:相同为0 不同为1
特点:和1异或取反 和0异或保持不变
场景:将指定位 发生翻转

移位 ​

左移<<:左边丢弃 右边补0
右移>>:右边丢弃 左边补0(补1)
算术右移、逻辑右移 都是编译器决定,用户无法确定

无符号数:右边丢弃 左边补0
有符号数:
正数:右边丢弃 左边补0
负数:右边丢弃 左边补0(逻辑右移)
负数:右边丢弃 左边补1(算术右移)

三目运算符 ​

?:---> 表达式1 ? 值1:值2

如果表达式1为真 整个表达式的值为值1

如果表达式1为假 整个表达式的值为值2

逗号运算符 ​

12、自增自减运算符 ​

13、if控制语句 ​

14、switch选择语句 ​

15、for循环语句 ​

16、【while循环语句 ​