C语言:
机器语言:
机器语言是由一组0和1系列组成的指令码,这些指令码值cpu制造厂商规定出来的,机器语言是能够直接被机器认识的,但是不利于人学习,为解决这个问题,于是又出现了汇编语言。
机器语言:
汇编语言是一些取代了0和1的一些标识符,人类可以较为轻松认识的语言,汇编语言可以被编译为机器语言。
什么是C语言(C语言也是高级语言):
C语言是人和机器之间交流的语言,相对于汇编来说,C语言是可以被人容易掌握的一门语言,同样它也可以被编译为机器语言。这类语言更利于程序设计,这类语言被称为高级语言。
优点:执行速度快、功能强大、编程自由
缺点:写代码实现周期长、过于自由,经验不足易出错、对平台库依赖较少
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 看到以下信息表示安装成功:
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,部分如下:
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]联系笔者删除。
笔者:苦海