机器语言、机器语言、c语言、语言层次比较、语言进化史、system函数、代码注释、gcc配置、C语言的特点、代码片段配置、命令行参数、转义字符、cup与寄存器之间的关系、存储单位、变量

C语言:

机器语言:

机器语言是由一组0和1系列组成的指令码,这些指令码值cpu制造厂商规定出来的,机器语言是能够直接被机器认识的,但是不利于人学习,为解决这个问题,于是又出现了汇编语言。

机器语言:

汇编语言是一些取代了0和1的一些标识符,人类可以较为轻松认识的语言,汇编语言可以被编译为机器语言。

什么是C语言(C语言也是高级语言)

C语言是人和机器之间交流的语言,相对于汇编来说,C语言是可以被人容易掌握的一门语言,同样它也可以被编译为机器语言。这类语言更利于程序设计,这类语言被称为高级语言。

机器语言、机器语言、c语言、语言层次比较、语言进化史、system函数、代码注释、gcc配置、C语言的特点、代码片段配置、命令行参数、转义字符、cup与寄存器之间的关系、存储单位、变量_第1张图片
语言进化史
机器语言、机器语言、c语言、语言层次比较、语言进化史、system函数、代码注释、gcc配置、C语言的特点、代码片段配置、命令行参数、转义字符、cup与寄存器之间的关系、存储单位、变量_第2张图片
机器语言、机器语言、c语言、语言层次比较、语言进化史、system函数、代码注释、gcc配置、C语言的特点、代码片段配置、命令行参数、转义字符、cup与寄存器之间的关系、存储单位、变量_第3张图片
C语言的特点:

优点:执行速度快、功能强大、编程自由

缺点:写代码实现周期长、过于自由,经验不足易出错、对平台库依赖较少
机器语言、机器语言、c语言、语言层次比较、语言进化史、system函数、代码注释、gcc配置、C语言的特点、代码片段配置、命令行参数、转义字符、cup与寄存器之间的关系、存储单位、变量_第4张图片
C语言应用领域:

网站后端、底层操作系统、多媒体应用、网络游戏、造出另一个语言、驱动程序、配备了微处理器的设备(嵌入式)等

第一个C语言程序:HelloWorld

C语言文件为后缀为点c的文件,如hello.c文件:

// 包含头文件:#号引入的包含头文件stdio.h,stdio.h是c语言系统的一个文件,其中std代表标准,i代表input,o代表outpu输出,h代表header头文件
#include // 此行代码表示:一个标准的输入输出头文件(输出表示可以向屏幕打印内容)
int main(){ // int 表示函数的返回类型,main表示主程序的入口函数,小括号中可以传入参数列表,大括号是函数体,用来实现具体业务逻辑的代码
  printf("hello world,我是第一个C语言程序!");
  return 0;
}

编译器:

C语言是不能直接被计算机认识的,如果想要计算机运行C语言程序,那么就要使用编译器将C语言编译为计算机认识的语言。编译器可以用vs或gcc。

一、gcc配置:

1.win+r输入cmd打开终端:gcc -v查看是否有gcc安装,如果没有进行下一步:

2.如果提示没有gcc,那么去官网:https://sourceforge.net/projects/mingw/files/ 拉到网页下面找到MinGW-W64 GCC下最新版本(也可以回退一两个小版本,这里我选8.1.0下的x86_64-posix-sjlj)进行下载,下载完后将安装包解压到F:\xitong\gcc目录下(这里放到自己文件夹目录即可)

3.解压后的bin目录为:F:\xitong\gcc\mingw64\bin

4.配置环境变量:鼠标在此电脑图标右击–属性–高级系统设置–环境变量–

系统变量–双击path–新建–将解压后的bin文件路径输入到输入框后点确认

5.打开命令行输入:gcc -v 看到以下信息表示安装成功:
机器语言、机器语言、c语言、语言层次比较、语言进化史、system函数、代码注释、gcc配置、C语言的特点、代码片段配置、命令行参数、转义字符、cup与寄存器之间的关系、存储单位、变量_第5张图片
6.将命令行目录定位到hello.c目录下,并输入以下命令进行编译(编译后可以看到一个a.exe新文件):

gcc hello.c
gcc hello.c -o 文件名 // 这样编译会重新命名新的文件名并输出

7.运行a.exe, 继续在终端输入a.exe回车,可以看到:打印了:hello world!

提示:如果你要打印的字符串中有中文字符串,此时可能编译后打印会有乱码,是因为文件编码格式是utf-8,此时你可以执行gcc命令时在文件名前面加:-fexec-charset=GBK进行编译,此时编译后的exe文件就不会再乱码了,如:

gcc -fexec-charset=GBK hello.c

扩展:gcc编译的4个阶段:预处理、编译、汇编、链接

预处理:将hello.c生成一个hello.i文件,如果想要看到需要通过指令 -E (大写), hello.i也是一个c语言程序(提示:查看的时候需要后面使用-o输出一个文件,因为默认是直接打印在控制台的),预处理阶段会将头文件展开(头文件如:include)、宏替换、条件编译、取消注释…,如:

gcc -E hello.c -o hello.i

编译:将hello.i生成一个hello.s,此文件默认也是无法看到的,如果需要看到就要通过指令 -S (大写),hello.s是一个汇编文件,此过程会进行语法校验,如:

gcc -S hello.c -o hello.s

汇编:将hello.s文件生成一个hello.o文件,此文件默认也是看不到,如果要看到就要使用指令:-c(小写),hello.o文件是一个二进制文件,此文件可以被机器识别,如:

gcc -c hello.c -o hello.o

链接:将hello.o生成一个hello.exe可执行应用程序,在终端可以执行此程序。

二、vs创建c项目并编译:

vscode创建项目:打开vscode编辑器-文件-新建一个文件夹-在文件夹中新建一个c文件-Ctrl+j可打开vscode终端,cd到c程序文件目录下,可进行gcc编译和运行程序。

代码注释:

单行注释:

// 单行注释内容

多行注释:

/*多行注释内容,可进行换行*/

system函数:

system函数是c语言用来执行命令行中的命令的函数,使用它可以代替人直接操作计算机,如简单几行代码就实现对某个网址的ping测试和执行某个程序

#include
// 执行system函数需要引入lib文件,头文件为:,这里不引入会报错
#include
int main(){
  system("ping www.baidu.com"); // 控制台对www.baidu.com进行了ping
  system("pause"); // pause用来暂停程序,提示请按任意键继续...,
  system("hello.exe"); // 通过控制台执行了hello.exe程序
  return 0;
}

c4996错误提示:

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include
#include
int main(){
  // 1.vscode中不建议使用一些传统的c语言库函数,scanf、sprintf,因为会报c4996错误:
  char buf[1024] = { 0 };
  sprintf(buf, "%s","hello world");
  printf("%s",buf);
  system("pause");

  // 对以上代码执行并没有发现有错误警告,可能是新版本优化了这个问题,在其他版本如果遇到此问题,可以用一下方式解决:
  // 方式一: 引用宏:#define _CRT_SECURE_NO_WARNINGS
  // 方式二:禁用4996警告:#pragma warning(disable:4996)
  // 方式三:对整个程序添加宏_CRT_SECURE_NO_WARNINGS,老版本vscode可以右击项目找到属性,对其配置宏,新版本vscode中找不到配置
  return 0;
}

代码片段配置:

vscode编辑器中可以配置代码片段,用于快速生成代码框架,具体步骤如下:

1.设置->配置用户代码片段->选择c语言,配置c.json文件如:

{
	// 1.生成一个主要入口的代码片段
	"mainfram": { // 代码片段的名称
		"prefix": "fram", // 配置代码片段触发文本
		"body": [ // 要生成的代码片段,每行代码用双引号引起来
			"#include ",
      "#include",
      "#include",
			"#include",
      "int main(){",
      	"$2  system(\"pause\");",
      	"$2  return 0;",
      "}"
		],
		"description": "c语言入口函数" // 代码片段描述
	},
	// 2.生成一个打印内容的代码片段
	"printf": {
		"prefix": "pr",
		"body": [
			"printf();"
		],
		"description": "打印内容"
	}
}

2.执行代码片段,在vscode编辑器中,输入prefix对应的值加tab键回车即可,如:fram + tab + 回车

QT编写c语言程序:

qt是用来做一些页面程序的,它也是一个编辑器,qt底层也是由gcc编译的,这里不做过多解释,因为需要安装qt编辑器。

命令行参数:

命令行参数是指执行exe程序时在命令行输入的命令:

#include 
#include
#include
#include
// argc为命令行变量数量
// argv为命令行参数,当编译好的点.exe程序在被执行时,后面跟的参数将以数组的形式存在此变量中,如:a.exe aaa bbb ccc
int main(int argc, char *argv[]){
  printf("命令行变量数量argc:%d\n",argc); // 命令行变量数量argc:1
  printf("命令行参数argv:%d\n",argv); // 命令行参数argv:7433056、命令行参数argv:11103072,每次执行后面的数字都不一样,这是因为后面的数据类型为引用类型,数字为寄存器地址
  if (argc > 0) {
    for(int i = 0;i < argc;i++){
      printf("%s\n",argv[i]); // 当执行exe程序后面跟的命令将在这里一一打印,需要注意的是在vscode中不会打印点exe这条命令,但是在windows上自带的终端执行是会打印exe这条命令
    }
  };

  return 0;
}

转义字符:

程序中有部分特殊意思的字符是无法直接表述的,此时需要用到转义字符,如换行可以使用\n,部分如下:
机器语言、机器语言、c语言、语言层次比较、语言进化史、system函数、代码注释、gcc配置、C语言的特点、代码片段配置、命令行参数、转义字符、cup与寄存器之间的关系、存储单位、变量_第6张图片
cup与寄存器之间的关系:

cup: 类似于人类大脑,利用一些算法做一些计算。

内存: 存一些数据,如一个程序的代码,定义的一个变量等,存在中存储的数据是程序运行时的,未运行程序时数据是存在硬盘中的。

cup和内存之间是通过总线(总线是一类:地址总线、数据总线、控制总线等)进行工作的;

寄存器: cup和内存之间沟通的桥梁,寄存器比较稀缺。

**高速缓存:**因为寄存器是比较稀缺的,然而一些频繁用到的数据放到寄存器这样会占用寄存器空间,此时又出现了高速缓存,可以将一些不容易改变的数据放到高速缓存中(高速缓存又可分一级缓存,二级缓存等等)

**硬盘:**存储一些持久化的数据。

内存中的数据从cup处理到还给内存的过程中,原本cup处理数据是很快的,但是通过总线传输的过程是漫长的,此时为了解决传输过程中耗费大量时间的问题,cup中嵌入了一个叫寄存器的东西,这个寄存器可以理解为一个在cpu中的小内存,外面的内存会将多个指令一次传输给寄存器,然后cup在从寄存器中取数据运算,此时速度就快多了。

cup位数理解:如果主线是32位的cup,而寄存器是16位的,那么它可以称为准32位的cup,可以理解为从内存到寄存器一次可以传输32个,但是寄存器只能存16个;如果是32位cup,同时寄存器也是32位的,那么可以称为32位cup。

cup与它们之间的距离比较:cup—寄存器—高速缓存—硬盘

存储单位:

位(b):内存中最小的存储单位,一个bit位只能存一个0/1。

字节(B):8个bit位为一个字节Byte。

1 Byte = 8 bit

1 KB = 1024 Byte

1 MB = 1024 KB

1 GB = 1024 MB

1 TB = 1024 GB

1 PB = 1024 TB

1 EB = 1024 PB

1 ZB = 1024 EB

变量:

程序运行中可以发生变化的值,被称为变量,变量定义的格式:

数据类型 变量 = 初始值

#include 
#include
#include
#include
int main(){
  int num = 10;
  // printf(num); // c语言中直接输出变量是不行的,需要做格式化:
  printf("%d\n", num); // 10, %d表示一个整型,\n表示换行

  num = 5.23;
   printf("%d", num); // 5, 这里给小数会有精度损失
}

提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:[email protected]联系笔者删除。
笔者:苦海

你可能感兴趣的:(C,c语言,开发语言)