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
变量:系统会自动根据变量的类型大小 为变量开辟内存空间
变量的值 可以被修改
int num = 10;
void num=10;//系统无法给num开辟空间(无法判断void的大小) 所以定义失败记住:变量名的 命名规则
变量由字母、数值、下划线组成 不能以数值开头。不能是关键字
2、整型
整型常量:10
变量的初始化:
定义变量的时候 给变量赋值 叫初始化。
int num = 10;//是初始化
int data;
data=10; //不是初始化变量的使用:读(取值) 写(赋值)
变量的声明:先使用 后定义 必须事先对变量进行声明
获取键盘输入:scanf获取键盘输入函数
#include <stdio.h>
int scanf(const char *format, ...);
format:获取数据的格式3、字符类型 char
字符常量 'a' '0' '2'
单引号 只能作用一个字符,转义字符除外
A:'a' B:'#' C:'12'错误 D:'2'单引号:
第一个作用:'a' 描述a为字符
第二个作用:取字符的ASCII值

printf %c 输出的是字符
printf %d输出的是字符的ASCII值
字符的大小写转换:
键盘输入一个字符,如果是大写 就转换成小写 如果是小写就转换成大写
'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 long4、二进制、八进制、十进制、十六机制
二进制: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-15、原码、反码、补码
计算机存储的是数据的补码。
原码:数据的二进制形式
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修饰变量为只读
//const修饰num为只读变量本质是变量
//只读变量只能初始化不能被赋值
const int num
100;
num = 200;//error.2、register修饰寄存器变量
如果变量 别高频繁使用 会自动将变量存储在寄存器中 目的:提高访问效率
如果用户想将变量 直接放入寄存器中 可以加register修饰
void test03 (){
//将num放入寄存器中提高访问效率num也叫寄存器变量
register int num = 10;
//不能对寄存器变量取地址&num是错误的
# //&取的是内存地址而num可能在寄存器中所以取地址失败
//register修饰的变量只是尽量放入寄存器中。
}3、volatile关键字
volatile int num = 10;//对num的访问 必须从内存访问4、sizeof测量类型的大小
5、typedef给已有的类型重新取个别名
不能创建新类型。
将长且复杂的类型名 取一个短小的名称。
typedef作用的步骤:
1、先用 已有的类型 定义一个普通的变量
2、用别名 替换 变量名
3、在整个表达式最前方 加typedef
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
场景: 将指定位 清02、| 按位或
语法:有1为1 全0为0
特点:和1或置1, 和0或 保持不变
场景:将指定位 置13、~按位取反
语法:0变1 1变0
~1100 0011 == 0011 11004、^ 按位异或
语法:相同为0 不同为1
特点:和1异或取反 和0异或保持不变
场景:将指定位 发生翻转移位
左移<<:左边丢弃 右边补0
右移>>:右边丢弃 左边补0(补1)
算术右移、逻辑右移 都是编译器决定,用户无法确定
无符号数:右边丢弃 左边补0
有符号数:
正数:右边丢弃 左边补0
负数:右边丢弃 左边补0(逻辑右移)
负数:右边丢弃 左边补1(算术右移)三目运算符
?:---> 表达式1 ? 值1:值2
如果表达式1为真 整个表达式的值为值1
如果表达式1为假 整个表达式的值为值2
阿源的知识库