C语言基础
C语言基础
day01
C语言特点
优点
代码量小
执行速度快
功能强大
编程自由
缺点
写代码实现周期长
可移植性较差
过于自由,经验不足出错
平台库依赖多
计算机结构组成
计算机系统组成
C语言关键字
9种控制语句
运算符
#include // 关键标识符,表示引入头文件,include
// stdio.h 系统标准输入,输出库对应的头文件,给printf服务
// <> 使用系统库函数 ""用户自定义库函数
//int 函数返回值是整形数据 main:函数名,程序唯一入口,必须有只写一次
int mian(void) // void函数调用不需要传参
{ //函数体:起始位置
printf("hello world\n");
system("pause")
return 0; //返回当前函数--退出程序
} //结束为止
解决提示窗一闪而过
用system函数解决
在return 0 之前,添加system(“pause”) 函数调用
借助vs工具解决
在项目上 -- 属性--配置属性--连接器--系统---子系统--下拉框中控制台
两种编写helloworld方式
1.借助vs工具编写
借助记事本,gcc编译工具
gcc环境变量的配置
使用记事本创建hellworld.c文件 在里面写程序
gcc编译工具 ,执行 gcc helloworld.c -o hello.exe
在终端中运行,hello.exe
注释
单行注释 //
多行注释 /* */
system 函数
执行系统命令
system(“cmd”)
清屏 cls
gcc编译四步骤
gcc - E hello.c -o hello.i
预处理 -E xxx.i 预处理文件
1. 头文件展开,不检查语法错误,可以展开任何文件
1. 宏定义替换 :将宏名替换为宏值
3. 替换注释 : 变成空行
4. 展开条件注释 : 根据条件展开指令
-
#include#define PI 3.14 int main(void) { printf("%d\n", PI); return 0; }
编译 -S hello.s 汇编文件
1. 将c程序翻译成汇编指令
2. 逐行检查语法错误 ,编译4步骤最耗时的过程
汇编 -c hello.o 目标文件
gcc -c hello.s -o hello.o
翻译将汇编指令翻译成对应的二进制代码
链接 hello.exe 可执行文件
-
数据段合并
-
数据地址回填
-
库引入
C语言可以嵌入汇编
代码调试
打开调试F5,调试 F11
监视,监视变量名的变化
VS快捷键
day02
常量与变量
常量:不会变化的量
-
”A”,”hello”,“10”,”1.234567”,””
-
define PI 3.1415 定义宏 名+值
-
const int a = 10; const 关键字修饰的变量,表示只读变量
#include
#define PI 3.145
int main(void)
{
int r = 3;
float s = PI * r * r;
float l = 2 * PI * r;
//printf("圆的周长%f\n",l);
//printf("圆的面积%f\n",s);
printf("圆的周长%.2f\n", l); // 保留小数点后两位
printf("圆的面积%.2f\n", s);
return 0;
}
const int a = 10 定义语法 const类型名 变量名 = 变量值
变量的定义语法
变量三要素 :类型名,变量名 ,变量值
float a = PI * r* r 变量值是表达式
变量的声明:
1. int a; 没有变量值的变量定义
2. extern int a; 添加了关键字
3. 变量定义会开辟内存空间,变量声明不会开辟内存空间
4. 当编译器编译程序时,在变量使用之前,如果没有看到变量定义,编译器会自动寻找一个变量声明提升为定义,如果该变量声明有extern 关键字,无法提升
5. 定义变量时,尽量不要重名
6.
标识符,变量和常量的统一
命名规则:
1. 通常常量使用大写,变量使用小写,大小写严格区分
2. 只能使用,字母数字下划线 命名标识符,数字不能开头,
1. int a5ir = 10;
2. int _34f = 6
3. float a2_i85c 5.4
3. 禁止使用关键字,系统函数做标识符
整型变量定义输出
格式
%d 输出一个有符号10进制的int类型
%x 输出8进制int类型
%X 16进制int类型 字幕以小写输出
%u输出10进制无符号数
有符号整型
signed:有符号 ,不常用
- int 类型 4字节 %d
- int 名 = 值
- int a = 40;
- short 类型 2字节 %hd
- short 名 = 值
- long 类型 4字节 %ld win 32/64 linux 32:4,64:8
- long 名 = 值
- long long 类型 %lld 8字节
- long long 名 = 值
无符号整型
unsigned :无符号 只表示数据量,而没有方向
int 名 = 值
- ? int 类型 4字节 %u
- unsigned int 名 = 值
- unsigned int a = 40;
- short 类型 2字节 %hu
- unsigned short 名 = 值
- long 类型 4字节 %lu
- unsigned long 名 = 值
- long long 类型 8字节 %llu
- unsigned long long 名 = 值
定义常量
define N 1024
sizeof 关键字
不是函数,用来求一个变量类型的大小,返回一个无符号整数使用%u,接收返回值
方法1 sizeof (类型名)
sizeof (变量名)
char字符类型
存储一个字符
‘a’,A%,#0
格式匹配符
%c
字符ASCLL码 (记忆 )
‘A’:65
‘a’ 97
‘0’ 48
‘\n’ 10
‘\0’ 0
转义字符 ‘\’ 将普通字符转为特殊,反之
转义字符表
实型
float 单精度 4字节
%f 使用格式符 ,默认保留6位
float v1 = 1.22
double 双精度 8字节 默认是双精度
float v2 = 3.456
unsigned float 无符号的浮点型
unsigned double 无符号的浮点型
printf("m = %5.2f\n",m); 输出含义是 :显示5位数(包含小数点),不足8位用0填充,并且保留3位小数,对第4位四舍五入
输出格式匹配符
- %d %u %o %x
- %hd %hu
- %ld %lu
- %lld % llu
- %c %f %lf
进制和转换:
十进制转2进制。 --- 除2反向取余法。 【重点】
十进制转8进制。 --- 除8反向取余法。
十进制转16进制。--- 除16反向取余法。
int a = 56; -- 111000
int b = 173; -- 10101101
2进制转10进制。
2^10 = 1024
2^9 = 512
2^8 = 256
2^7 = 128
2^6 = 64
2^5 = 32
2^4 = 16
2^3 = 8
2^2 = 4
8进制:
8进制转10进制。
定义8进制数语法:
056: 零开头,每位数0~7之间。 ---- 46
0124: ---- 84
8进制转2进制。
按421码将每个八进制位展开。
056:5--》 101。 6--》 110 。
101110
05326:5 --》 101。 3--》 011。 2--》 010。 6--》 110
2进制转8进制:
1 010 111 010 110: 012726
自右向左,每3位一组,按421码转换。高位不足三位补0
16进制:
语法: 以0x开头,每位 取 0-9/A-F/a-f
A -- 10
B -- 11
C -- 12
D -- 13
E -- 14
F -- 15
16 -- 10:
0x1A: 16+10 = 26
0x13F:15+3x16+256
16 -- 2:
0x1A: 00011010
0x13F: 000100111111
2 -- 16:
0001 0011 1111: 13F
自右向左,每4位一组,按8421码转换。高位不足三位补0
总结:
int m = 0x15F4;
int n = 345;
int var = 010011; // 不允许。 不能给变量直接复制 二进制数据。
输出格式:
%d %u %o %x %hd %hu %ld %lu %lld %llu %c %f %lf
%d %u %x %c %s
存储知识:
1 bit位 就是一个 二进制位
一个字节 1B = 8bit位。
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
源码反码补码:【了解】
源码:
43 -> 00101011
-43 --> 10101011
反码:
43 -> 00101011
-43 --> 10101011
11010100
补码:(现今计算机采用的存储形式)
43 -> 00101011 : 正数不变
-43 --> 11010101 : 负数,最高位表符号位, 其余取反+1
43-27 ==》 43 + -27
人为规定: 10000000 --》 -128
char 类型:1字节 8个bit位。 数值位有7个。
有符号: -2^7 --- 2^7-1 == -2^(8-1) -- 2(8-1) -1
--》 -128 ~ 127
无符号: 0 ~ 2^8 -1
--》 0~255
不要超出该数据类型的存储范围。
short类型:2字节 16bit
有符号: -2^15 --- 2^15-1 == -2^(16-1) -- 2(16-1) -1
--》 -32768 ~ 32767
无符号: 0 ~ 2^8 -1
--》 0~65535
int 类型:4字节 -2^(32-1) -- 2^(32-1)-1
有符号:
--》 -2147483648 ~ 2147483647
无符号: 0~2^32 -1
--》 0~4294967295
long类型:4字节
有符号:
--》 -2147483648 ~ 2147483647
无符号: 0~2^32 -1
--》 0~4294967295
longlong 类型:8字节
有符号:
--》 -2^(63) ~ 2^(63)-1
无符号:
--》 0~2^63-1
day03
类型限定符
extern: 表示声明,没有内存空间,不能提升
const: 限定一个常量,常量的值不能修改
volatile 防止编译器优化代码
register 定义寄存器变量,提高效率,register是建议性指令而不是命令指令,如果cpu是空闲寄存器那么register无效
字符 char ch = ‘A’ 一个字节
字符串 “abdh” 双引号引着字符串,一定有一个结束标记“\0”
printf() %s 挨着从字符串第一个字符开始打印,打印到‘\0’结束
‘a’ 不等于 “a”
printf()函数
%s 打印字符串
%d 打印整数
%c 打印字符
%x 打印16进制数
%u 打印无符号
%m. n 打印实型,一共有m位 (整数小数,小数点,n位小数)
%0m. nf 不足n位前面补0
%% 显示一个% 转移字符对%无效
%Ns 显示N个字符的字符串,不足用空格向左填充
puchar()函数
可以直接输出ASCII码
不能输出字符串
‘abc’ 既不是有效字符,也不是有效字符串
scanf 函数
从键盘接受用户输入
接收整数
%d
int a,b,c 创建变量空间 等待接收用户输入
接收字符%c
char a,b,c
scanf_s(“%c%c%c”,&a,&b,&c)
接收字符串 %s
char str[] = “”;
char str[]; 定义一个数组,用来接收用户输入的字符串
scanf(%s,str); //变量名要取地址传给scanf 数组名本身表示地址,不用&
为了防止数据溢出,scanf_s应该用以下形式,抛弃scanf函数
scanf具有安全隐患,数据能存储但是不被保护【空间不足不要使用】
scanf函数接收字符串,碰到空格和换行自动终止,不能使用csanf接收带有空格的字符串
scanf_s("%c,%c",&a,1,&b,1);
getchar()函数
从键盘用户输入获取一个字符
打印换行常用putchar(“\n”)
算术运算
除0错误
对0取余错误操作
除法运算得到的结果赋值给整型变量取整数部分
++ --
前缀自增
int a = 10;
++a;
先自增,再取值
后缀自增
int a = 10
a++;
先取值,再自增
int a = 10;
printf("a=%d\n", a++);
printf("a=%d\n", a);
printf("a=%d\n", ++a);
printf("a=%d\n", a);
printf("a=%d\n", a--);
printf("a=%d\n", a);
printf("a=%d\n", --a);
printf("a=%d\n", a);
赋值运算符
int a = 5;
a +=10’
a-=30;
a%=5
比较运算
== 判断是否相等
!= 不等于
<=
逻辑运算
与或非