啵啵啵啵啵啵啵啵啵啵啵啵啵啵啵

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关注公粽号 《机器和智能》 回复关键词 “python项目实战” 即可获取美哆商城视频资源!


博主介绍:
CSDN博客专家,CSDN优质创作者,CSDN实力新星,CSDN内容合伙人;
阿里云社区专家博主;
华为云社区云享专家;
51CTO社区入驻博主,掘金社区入驻博主,支付宝社区入驻博主,博客园博主。


C语言必备知识

    • 1. 什么是编程语言
    • 2. 程序和指令
    • 3. 计算机语言的发展
    • 4. CPU内部结构
    • 5. C语言应用领域
    • 6. 包含头文件
    • 7. main函数
    • 8. 代码块与作用域
    • 9. 代码行与注释
    • 10. main函数参数与返回值
    • 11. system函数
    • 12. C程序的编译过程
    • 13. 开发环境


专栏:《精通C语言》


1. 什么是编程语言

编程语言就是人和计算机交流的语言。

2. 程序和指令

指令是对计算机进行程序控制的最小单位,指令的集合构成指令系统。而程序则是为完成一项特定任务而用某种计算机语言编写的一组指令序列。
在这里插入图片描述

3. 计算机语言的发展

  • 计算机的组成
    在这里插入图片描述

  • 机器语言:在上面的计算机组成中可以看到,中央处理器CPU起着控制整个计算机运作的作用,而CPU都有一个指令系统,这个指令系统就是机器语言,机器语言是直接控制计算机硬件工作的语言,它是由0和1二进制数(由硬件电路决定,电平只有高低两种状态)组成的指令码,而这些指令码一般是由CPU厂商从生产CPU时就规定好的,不同型号的计算机其机器语言是互不相通的。

  • 汇编语言:机器语言是由计算机识别的0、1序列,应为计算机的硬件电路只有高电平和低电平两种状态。而对于人类来说,这些0、1序列显然是不可读的(没有人会喜欢看一堆0、1数字吧)。这时候就出现了汇编语言,汇编语言通过标识符来代替0、1序列,对人类来说是可读且易于理解的。但是,计算机只认识二进制的0和1,通过汇编语言是无法直接操作计算机硬件的。那么,如何把人类可读的汇编语言转换成计算机可读的二进制0、1序列呢?这就有了编译器,编译器是一段用来做翻译工作的程序,它既可以识别汇编语言又可以识别二进制机器语言,并且知道二者之间的对应关系。这样,通过编译器就可以把人类认识的汇编语言转换成计算机认识的机器语言了。

  • 高级语言:高级语言是更加通用和便捷的编程语言,通过高级语言,人们更加关注解决问题的逻辑和更高效的求解方式。高级语言有面向过程的C语言、面向对象的C++、Java、Python等。同样,高级语言也需要编译器来翻译为机器语言。实际上,编程语言没有高低之分,面向对象也并不一定就比面向过程高级,C语言一样可以实现面向对象编程,Linus这种顶级大佬不就是使用C语言写出了大名鼎鼎的Linux操作系统吗,而C++、Java、Python等面向对象语言的底层也都是由C语言实现的。

4. CPU内部结构

  • CPU的位数
    CPU内部最基本的存储单元是寄存器,CPU通过总线(地址、控制、数据)来和外部设备交互,总线的宽度是8位,同时CPU的寄存器也是8位,那么这个CPU就叫8位CPU。如果总线是32位,寄存器也是32位,那么这个CPU就是32位CPU。有一种CPU内部的寄存器是32位的,但总线是16位,这种叫做准32位CPU。所有的64位CPU兼容32位的指令,所以在64位的CPU上是可以识别32位的指令。在64位的CPU构架上运行了64位的软件操作系统,那么这个系统是64位,在64位的CPU构架上,运行了32位的软件操作系统,那么这个系统就是32位的,64位的软件不能运行在32位的CPU之上。
  • 寄存器、缓存、内存
    CPU工作时,先预先把要用的数据从硬盘读到内存,然后再把即将要用的数据读到寄存器。也就是说CPU和寄存器进行交互,寄存器和内存进行交互( CPU<—>寄存器<—>内存)。我们知道,操作寄存器的速度远远大于操作内存的速度,缓存是为了缓冲二者之间的速度差,如果总是操作内存中的同一址地的数据,每次都去内存取值,会严重影响速度,于是就在寄存器与内存之间设置一个缓存,从缓存提取数据的速度远高于内存(CPU<—>寄存器<—>缓存 <—> 内存)。

5. C语言应用领域

网站后台、服务器、编写其他语言、操作系统、驱动、嵌入式/物联网、数据库、编译器等等。

6. 包含头文件

头文件的作用

  • 通过头文件提供的接口调用库功能。对于源代码的提供者不能或不愿将源代码公布给用户的情况,用户需要通过头文件或动/静态链接库来调用功能。通过头文件提供的接口可以实现在隐藏底层实现逻辑的前提下向用户提供功能,而用户则在不关心接口实现逻辑的前提下可以调用库功能,根据头文件接口从库中寻找代码的任务由编译器完成。
  • 头文件增强了编译器的类型检查。在使用接口时需要按照头文件中声明的接口形式进行传参并接收返回值,如果调用实现和声明形式不一致会引起编译器报错。

引入头文件的两种方式

  • #include <>:将指定文件引入到当前文件,搜索策略为,直接在编译器指定的路径处开始搜索,如果找不到被引入文件,则程序报错。因此系统提供的头文件推荐使用这种方式引入。如果是集成开发环境,比如VS,这个默认路径一般在VS安装目录下的一个名为 include 的路径下。在Linux中,一般默认路径是 /usr/include 或 /usr/lib 下的目录。
  • #include “”:将指定文件引入到当前文件,搜索策略为,首先在运行程序所在的目录处进行搜索,搜索失败后再到编译器指定的路径处搜索,如果仍然搜索失败,则直接报错。因此,用户自定义头文件必须用这种方式引入,系统提供的头文件也可以使用这种方式,但是会增加没必要的搜索,所以不推荐。
     头文件中一般要加#ifndef/#define/#endif来防止重复包含
    在这里插入图片描述

7. main函数

一个完整的C语言程序,有且只能有一个main()函数(又称主函数)和若干个其他功能函数结合而成,main()函数是必须要有的,而其它功能函数则根据实际需要选择性添加。main函数是C语言程序的入口,程序是从main函数开始执行。

8. 代码块与作用域

{ }内部是一个代码块,也就是一个作用域,代码块执行完毕,作用域内的栈内存被自动释放。在编程时{ }中的每一半括号都应占据单独一行,并上下对齐,这不是C强制要求,而是一种编程规范。

9. 代码行与注释

  • 可执行语句必须由分号;结尾
  • 可执行语句必须在代码块{}内部(函数体内、作用域内)
  • #开头表示预编译指令,不需要分号;结尾
  • C语言只能以/**/注释,尽量不要以//注释
  • C++中使用//进行行注释,使用/**/进行代码块注释

10. main函数参数与返回值

return语句表示函数执行完毕,一般写main函数的时候,都应该定义为int类型返回值,即int main(int argc, char* argv[])。
实际上main函数也是有参数和返回值的,只不过我们在平时的学习中可能很少用到,main的返回值是int类型的,main函数的参数在Linux下编程用的还是比较多的。我们在运行一个可执行文件的时候可以在命令行传入参数给argv[],也就是说argv[]是用来存放我们在命令行传入的参数的,而参数argc用于统计参数的个数。不管我们传不传参数, argv[0]默认就是程序运行的路径名。也就是说argc最小为1(命令行不传参),argv[0]是程序运行路径。
在这里插入图片描述

11. system函数

  • 包含头文件:
    #include <stdlib.h>
  • 函数原型:
    int system(const char *command);
  • 函数功能:
    system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed. During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored. 该函数主要功能是在一个已经运行的程序中执行另一个程序。
  • 函数返回值:
    The value returned is -1 on error (e.g. fork(2) failed), and the return status of the command otherwise.
  • 函数的使用:
    在这里插入图片描述

在使用VS写程序的时候,如果你运行程序的时候,打印窗口一闪而逝,我们可以在main()函数的return语句前加一个system(“pause”); 来表示暂停。

12. C程序的编译过程

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

GCC编译流程

选项含义
-E只进行预处理
-S(大写)只进行预处理和编译
-c(小写)只进行预处理、编译和汇编
-o file指定生成的输出文件名为 file

1) 预处理
在这里插入图片描述

如果不加重定向的话,默认会把预处理后的信息输出到标准输出,所以如果想要保留预处理后的程序,需要重定向到一个文件。可以看到预处理后的.i文件非常大,远远大于源文件,这是因为预处理进行了一系列的代码展开。
2) 编译
生成汇编代码
在这里插入图片描述

3) 汇编
在这里插入图片描述

4) 链接
生成可执行文件
在这里插入图片描述

在这里插入图片描述

13. 开发环境

本系列文章使用的开发环境及工具主要有:

  • Linux:VMware虚拟机、CentOS 6操作系统

  • Windows:Visual Studio 2019

  • 远程终端:SecureCRT

  • 远程编辑:UE编辑器

编写C语言程序,可以使用Linux下的vim编辑器,在Windows系统可以直接使用IDE集成开发环境编写,也可以使用各种编辑器编写,比如notepad++、UE编辑器等等。编写好的C程序必须经过编译器编译为二进制可执行代码才能运行,在Linux操作系统中可以直接通过gcc命令或者编写makefile脚本编译程序,在Windows操作系统可以使用IDE(集成了代码编辑器、编译器、调试器和图形用户界面工具)的编译功能直接编译。
注意:

  • Linux编译后的可执行程序只能在Linux运行,Windows编译后的程序只能在Windows下运行。
  • 64位的Linux编译后的程序只能在64位Linux下运行,32位Linux编译后的程序只能在32位的Linux运行。
  • 64位的Windows编译后的程序只能在64位Windows下运行,32位Windows编译后的程序可以在64位的Windows运行。

附:VS快捷键

VS快捷键含义
Ctrl + k,Ctrl + f自动格式化代码
Ctrl + k,Ctrl + c注释代码
Ctrl + k,Ctrl + u取消注释代码
F9设置断点
F5调试运行
Ctrl + F5不调试运行
Ctrl + Shift + b编译,不运行
F10next调试
F11step调试

在这里插入图片描述
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/688356.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

swaggerHole:针对swaggerHub的公共API安全扫描工具

关于swaggerHole swaggerHole是一款针对swaggerHub的API安全扫描工具&#xff0c;该工具基于纯Python 3开发&#xff0c;可以帮助广大研究人员检索swaggerHub上公共API的相关敏感信息&#xff0c;整个任务过程均以自动化形式实现&#xff0c;且具备多线程特性和管道模式。 工具…

增加强制索引依然慢

版本: 阿里云RDS MySQL 8.0.25 线上数据库CPU达到100%, 定位到如下SQL EXPLAIN SELECT ssd.goods_no,ssd.goods_name,ssd.goods_spec,ssd.goods_unit,ssd.create_time,w.warehouse_name,sb.batch_no,swl.warehouse_region_location_name,sc.customer_name AS goodsOwnerName,s…

如何在MySQL中实现upsert:如果不存在则插入?

目录 1 使用 REPLACE 2 使用 INSERT ... ON DUPLICATE KEY UPDATE 使用 INSERT IGNORE 有效会导致 MySQL 在尝试执行语句时忽略执行错误 INSERT 。这意味着 包含 索引或 字段 INSERT IGNORE 中重复值的语句 不会 产生错误&#xff0c;而只是完全忽略该特定 命令。其明显目的是…

2048小游戏的菜鸡实现方法

# 2048小游戏的实现与分析 2048是一款非常受欢迎的数字滑块游戏&#xff0c;其目标是通过滑动和合并相同数字的方块来创建一个值为2048的方块。下面&#xff0c;我们将通过分析一个C语言实现的2048小游戏的源代码&#xff0c;来探索如何用编程实现这款游戏。 ## 游戏概述 20…

指针(初阶1)

一.指针是什么 通俗的讲&#xff0c;指针就是地址&#xff0c;其存在的意义就像宾馆房间的序号一样是为了更好的管理空间。 如下图&#xff1a; 如上图所示&#xff0c;指针就是指向内存中的一块空间&#xff0c;也就相当于地址 二.一个指针的大小是多少 之前我们学习过&#x…

Springboot注意点

1.Usermapper里加param注解 2.RequestParam 和 RequestBody的区别&#xff1a; RequestParam 和 RequestBody的区别&#xff1a; RequestParam 和 RequestBody 是Spring框架中用于处理HTTP请求的两个不同的注 get请求一般用url传参数&#xff0c;所以参数名和参数的值就在ur…

LCM — Least Common Multiple 最小公倍数

因为任何一个数都可以表示为若干个质数幂的乘积。 比如75 3*5*5&#xff0c;即 2^0 * 3^1 * 5^2 * 7^0 ... 那么对于两个数来说&#xff0c;gcd就是他们取每个质数的较小幂的乘积&#xff0c;lcm则相反。显然&#xff0c;这些幂加起来就是他们乘积。 gcd(a,b) * lcm(a,b) a…

立创·天空星开发板-GD32F407VE-USART

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子&#xff0c;记录学习笔记。 立创天空星开发板-GD32F407VE-USART 基础通信概念同步通信 & 异步通信串行通信 & 并行通信双工 & 单工通讯速率码元 串口通信数据帧 串口封装 基础通信概念 通信协议是网络…

本地运行ChatTTS

TTS 是将文字转为语音的模型&#xff0c;最近很火的开源 TTS 项目&#xff0c;本地可以运行&#xff0c;运行环境 M2 Max&#xff0c;差不多每秒钟 4&#xff5e;&#xff5e;5 个字。本文将介绍如何在本地运行 ChatTTS。 下载源码 首先下载源代码 git clone https://github…

WPF中读取Excel文件的内容

演示效果 实现方案 1.首先导入需要的Dll(这部分可能需要你自己搜一下) Epplus.dll Excel.dll ICSharpCode.SharpZipLib.dll 2.在你的解决方案的的依赖项->添加引用->浏览->选择1中的这几个Dll点击确定。(添加依赖) 3.然后看代码内容 附上源码 using Excel; usi…

TypeScript环境安装与VScode编辑器的使用

说明大背景环境&#xff0c;我用的是window10系统。 1.安装node.js 。 去官网下载安装包。 虽然我去的是官网&#xff0c;但是不知为何下载了个不知名的东西&#xff0c;后来又找了个链接才下载正确了。 实际上就是一个.msi的文件。我用的版本&#xff1a;node-v18.19.0-x6…

【第四节】C/C++数据结构之树与二叉树

目录 一、基本概念与术语 二、树的ADT 三、二叉树的定义和术语 四、平衡二叉树 4.1 解释 4.2 相关经典操作 4.3 代码展示 一、基本概念与术语 树(Tree)是由一个或多个结点组成的有限集合T。其中: 1 有一个特定的结点&#xff0c;称为该树的根(root)结点&#xff1b; 2 …

GPT-4o:突出优势 和 应用场景

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

centos官方yum源不可用 解决方案(随手记)

昨天用yum安装软件的时候&#xff0c;就报错了 [rootop01 ~]# yum install -y net-tools CentOS Stream 8 - AppStream 73 B/s | 38 B 00:00 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlis…

从零开始:疾控中心实验室装修攻略,让你的实验室一步到位!

在当今充满挑战和变化的世界中&#xff0c;疾病的控制和预防成为了人类生存与发展的重要课题。而疾控中心作为防控疾病的核心机构&#xff0c;其疾控中心实验室设计建设显得尤为重要。下面广州实验室装修公司小编将分享疾控中心实验室设计建设方案&#xff0c;为疾病防控工作提…

“冻干”凭什么好吃不肥喵?既能当零食又可做主食的冻干分享

近年来&#xff0c;冻干猫粮因其高品质而备受喜爱&#xff0c;吸引了无数猫主人的目光&#xff0c;像我这样的资深养猫人早已开始选择冻干喂养。但新手养猫的人&#xff0c;可能会感到迷茫&#xff1a;冻干猫粮到底是什么&#xff1f;冻干可以一直当主食喂吗&#xff1f; 一、…

TqdmWarning: IProgress not found. Please update jupyter and ipywidgets.

jupyter notebook报错 在pycharm的terminal中 安装完成后就不会再报错了

缓存方法返回值

1. 业务需求 前端用户查询数据时,数据查询缓慢耗费时间; 基于缓存中间件实现缓存方法返回值:实现流程用户第一次查询时在数据库查询,并将查询的返回值存储在缓存中间件中,在缓存有效期内前端用户再次查询时,从缓存中间件缓存获取 2. 基于Redis实现 参考1 2.1 简单实现 引入…

电源小白入门学习10——浪涌、防浪涌器件、浪涌保护芯片

浪涌、防浪涌器件、浪涌保护芯片 浪涌浪涌保护器件的分类与原理保险丝TVS二极管新防护电路 浪涌 浪涌&#xff0c;相信不少学习过电子的同学或多或少都通过这个词&#xff0c;但是到底什么是浪涌呢&#xff0c;GPT给我的答案是这样的&#xff1a; 浪涌&#xff0c;也称为瞬态…

MS21112S单通道 LVDS 差分线路接收器

MS21112S 是一款单通道低压差分信号 (LVDS) 线 路接收器。在输入共模电压范围内&#xff0c;差分接收器可以 将 100mV 的差分输入电压转换成有效的逻辑输出。 该芯片可应用于 100Ω 的受控阻抗介质上&#xff0c;进行点对 点基带数据传输。传输介质可以是印刷电路板、…