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. 展开条件注释 : 根据条件展开指令
  1. #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 可执行文件

  1. 数据段合并

  2. 数据地址回填

  3. 库引入

C语言可以嵌入汇编

代码调试

打开调试F5,调试 F11

监视,监视变量名的变化

VS快捷键

day02


常量与变量

常量:不会变化的量

  1. ”A”,”hello”,“10”,”1.234567”,””

  2. define PI 3.1415 定义宏 名+值

  3. 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

比较运算

== 判断是否相等

!= 不等于

<=

逻辑运算

与或非