关于一些c语言基础概念的了解与学习

1.C语言概述

语言是人和人交流,C语言人和机器交流。只是,人可以不听另外一个人,但是,计算机是无条件服从。

2.C语言特点

1) 优点

  • 代码量小
  • 执行速度快
  • 功能强大
  • 编程自由

2) 缺点

  • 写代码实现周期长
  • 可移植性较差
  • 过于自由,经验不足易出错
  • 对平台库依赖较多

3.C语言应用领域

C语言的应用极其广泛,从网站后台,到底层操作系统,从多媒体应用大型网络游戏,均可使用C语言来开发:

  • C语言可以写网站后台程序
  • C语言可以专门针对某个主题写出功能强大的程序库
  • C语言可以写出大型游戏的引擎
  • C语言可以写出另一个语言来
  • C语言可以写操作系统和驱动程序,并且只能用C语言编写任何设备只要配置了微处理器,就都支持C语言从微波炉到手机,都是由C语言技术来推动的

4.C语言的简洁

C语言仅有32个关键字9种控制语句34种运算符,却能完成无数的功

5.编写第一个C语言程序:HelloWorld

#include<stdio.h>
int main(){
printf("Hello world\n");
return 0;
}

C语言的源代码文件是一个普通的文本文件,但扩展名必须是.c

6.代码分析

1) include头文件包含

  • #include的意思是头文件包#include <stdio.h>代表包含stdio.h这个头文件
  • 使用C语言库函数需要提前包含库函数对应的头文件,如这里使用了printf()函数,需要包含stdio.h头文件
  • 可以通过man 3 printf查看printf所需的头文件
  • 导入一个文件  stdio.h std是一个标准库; i 代表inputo 代表output;标准输入输出库 .h 头文件

#include< > 与 #include ""的区别:

  • < > 表示系统直接按系统指定的目录检索
  • "" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索
  • <>表示导入系统文件; "" 表示导入自定义文件

2) main函数

  • 一个完整的C语言程序,是由一个且只能有一个main()函数(又称主函数,必须有)和若干个其他函数结合而成(可选)。
  • main函数是C语言程序的入口,程序是从main函数开始执行

3) {} 括号,程序体和代码块

  • {}叫代码块,一个代码块内部可以有一条或者多条语句
  • C语言每句可执行代码都是";"分号结尾
  • 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号
  • 所有的可执行语句必须是在代码块里面

4) 注释

  • //叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读
  • /**/叫块注释
  • 块注释是C语言标准的注释方法
  • 行注释是从C++语言借鉴过来的

5) printf函数

  • printf是C语言库函数,功能是向标准输出设备输出一个字符串
  • printf(“hello world\n”);//\n的意思是回车换行

6) return语句

  • return代表函数执行完毕,返回return代表函数的终止
  • 如果main定义的时候前面是int,那么return后面就需要写一个整数;如果main定义的时候前面是void,那么return后面什么也不需要写
  • 在main函数中return 0代表程序执行成功,return -1代表程序执行失败
  • int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式

7.system函数

system函数的使用

功能:在已经运行的程序中执行另外一个外部程序

参数:外部可执行程序名字

返回值:成功:0.  失败:任意数字

示例代码:

#include<stdio.h>
#include<stdlib.h>
int main{
system("ls");//或者system("calc")
    return 0;
}

8. C程序编译步骤

C代码编译成可执行程序经过4步:

  • 预处理:宏定义展开头文件展开条件编译等,同时将代码中的注释删除,这里并不会检查语法
  • 编译:检查语法,将预处理后文件编译生成汇编文件
  • 汇编:将汇编文件生成目标文件(二进制文件)
  • 链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

9.宏的定义

#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为定义宏

宏替换

#define 名字 替换文本

步骤:
①在调用宏时,首先对参数进行检查,看看是否包含了任何由#define定义的符号。如果是它们首先被替换。
②替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替代。
③最后,再次对文本结果进行扫描,看看是否包含了任何由#define定义的符号。如果是就重复上述处理过程。
这样,宏定义参数和#define定义可以包含其他#define定义的符号。但是,宏不可以出现递归。

宏中的运算符

在定义宏时,经常会出现的两个运算符 # ##

  • #:出现在宏定义中的#运算符,会将其后面参数转化为一个字符串,我们把这种用法的成为字符串化运算符。
  • ##:常用于把多个参数连接在一起。

宏优点

  • 代码复用性好
  • 能提高性能

宏缺点

  • 不可调试(在预处理阶段进行了替换)
  • 无类型安全检查
  • 代码可读性差,容易出错

10.头文件的展开

①#include指令使另外一个文件被编译:预处理器先删除这条指令,并用包含文件的内容替换。这样一个文件被包含10次,那就实际被编译10次。
②库文件一般用 < > 包含;本地文件一般用 “ ” 包含。
③文件开头写:#pragma once 可以避免头文件的重复引入。

11.简单的一些预处理命令:

预处理命令 含义
#define 宏替换
#undef 撤销定义过的宏名
#include 让编译程序将另一源文件嵌入到含有#include的程序中
#if #endif 如果#if后的常量表达式为true,则编译#if与#endif之间的代码,否则跳过这些代码。#endif标志着一个#if块的结束
#else #else建立另一个选择,在#if失败后编译
#elif 可以形成一个if else if 的阶梯状语句,进行多种编译选择
#line 改变当前行数和文件名,它们是在编译程序中预先定义的标识符
#error 编译程序中,只要遇到#error,就会生成一个编译错误提示信息,并停止编译
#pragma 为实现时定义的命令,它允许想编译程序传递各种命令

12.条件编译

#if 常量表达式
程序段 1
#else
程序段 2
#endif

#if 常量表达式
程序段 1
#elif 常量表达式
程序段 2
#else
程序段 3
#endif

13.CPU内部结构与寄存器

   64位和32位系统区别(了解)

  • 寄存器是CPU内部最基本的存储单元
  • CPU对外是通过总线(地址、控制、数据)来和外部设备交互的,总线的宽度是8位,同时CPU的寄存器也是8位,那么这个CPU就叫8位CPU
  • 如果总线是32位,寄存器也是32位的,那么这个CPU就是32位CPU
  • 有一种CPU内部的寄存器是32位的,但总线是16位,准32为CPU
  • 所有的64位CPU兼容32位的指令,32位要兼容16位的指令,所以在64位的CPU上是可以识别32位的指令
  • 在64位的CPU构架上运行了64位的软件操作系统,那么这个系统是64位
  • 在64位的CPU构架上,运行了32位的软件操作系统,那么这个系统就是32位
  • 64位的软件不能运行在32位的CPU之上

寄存器名字(了解)

8位

16位

32位

64位

A

AX

EAX

RAX

B

BX

EBX

RBX

C

CX

ECX

RCX

D

DX

EDX

RDX

寄存器、缓存、内存三者关系

  • 按与CPU远近来分,离得最近的是寄存器,然后缓存(CPU缓存),最后内存。
  • CPU计算时,先预先把要用的数据从硬盘读到内存,然后再把即将要用的数据读到寄存器。于是 CPU<--->寄存器<--->内存,这就是它们之间的信息交换。
  • 那为什么有缓存呢?因为如果经常操作内存中的同一址地的数据,就会影响速度。于是就在寄存器与内存之间设置一个缓存。
  • 因为从缓存提取的速度远高于内存。当然缓存价格肯定远远高于内存,不然的话,机器里就没有内存的存在。
  • 由此可以看出,从远近来看:CPU<--->寄存器<---> 缓存 <---> 内存。

 

14.汇编语言:

  • mov 移动
  • add 添加
  • push 压栈
  • pop 出栈
  • call 调用

eax 32位寄存器
简单加法计算:

__asm
{
    mov a, 10
    mov b, 20
    mov eax, a
    add eax, b
    mov c, eax
}

 

VS中C语言嵌套汇编代码(了解)

#include <stdio.h>
int main()
{
	//定义整型变量a, b, c
	int a;
	int b;
	int c;
	__asm
	{
		mov a, 3	//3的值放在a对应内存的位置
		mov b, 4	//4的值放在b对应内存的位置
		mov eax, a	//把a内存的值放在eax寄存器
		add eax, b	//eax和b相加,结果放在eax
		mov c, eax	//eax的值放在c中
	}
	printf("%d\n",  c);//把c的值输出
	return 0;//成功完成
}

VS反汇编

#include <stdio.h>
int main(){
	//定义整型变量a, b, c
	int a;
	int b;
	int c;
	a = 3;
	b = 4;
	c = a + b;	
	printf("%d\n",  c);//把c的值输出
	return 0;//成功完成
}

15.断点和单步调试:

  • 断点: 在选中行单击或按F9
  • 调试程序:在“调试”中选择“开始调试”或按F5
  • 逐语句执行:F11
  • 逐过程执行:F10
  • 跳出过程:Shift+f11
  • 停止调试:Shift+F5

操作步骤:

  • 设置断点F9

  • 进行调试

  • 选择反汇编按钮

  • 根据汇编代码分析程序

16.集成开发环境(IDE)

 

集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器编译器调试器图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。

例:Microsoft Visual Studio,Qt Creator

参考资料:

B站黑马程序员C语言基础教程(up:黑马程序员)

https://blog.csdn.net/weixin_44032272/article/details/102979109

https://blog.csdn.net/weixin_44826356/article/details/99763818

 

posted @ 2022-10-06 16:21  书文阁下  阅读(1119)  评论(0编辑  收藏  举报