顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

在这里插入图片描述

欢迎关注博主 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/786052.html

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

相关文章

用Canvas绘制一个高可配置的圆形进度条

&#x1f680; 用Canvas绘制一个高可配置的圆形进度条 问题分析与拆解第一步&#xff0c;初始化一些默认参数&#xff0c;处理canvas模糊问题第二步&#xff0c;定义绘制函数1. 定义绘制主函数入口&#xff0c;该函数汇集了我们定义的其它绘制方法2. 定义绘制圆环函数3. 定义绘…

【跨境分享】中国商家如何卷到国外?电商独立站和电商平台的优势对比

为什么要选择独立站而不是电商平台 对于跨境电商经营者而言&#xff0c;采取多平台、多站点的运营策略是至关重要的战略布局。这一做法不仅有助于分散风险&#xff0c;避免将所有投资集中于单一市场&#xff0c;从而降低“所有鸡蛋置于同一篮子”的隐患&#xff0c;而且有利于拓…

最近换工作的一些启示,清华学姐篇

最近更新频率慢下来了&#xff0c;一部分原因是沉迷运动不能自拔&#xff0c;还有一部分原因是业余分出来很大的精力来拓展个人的边界&#xff0c;希望在工作之外取得一些成绩&#xff0c;写作上耽误了不少&#xff0c;很难做到日更。 所以整体上今年更新频率较低&#xff0c;但…

揭秘机器学习如何改变广告营销游戏规则

揭秘机器学习如何改变广告营销游戏规则 一、前言1.1 大数据时代的到来1.2 广告营销面临的挑战1.3 机器学习为广告营销带来的机遇 二、机器学习在广告营销中的应用2.1 了解消费者2.1.1 数据收集和分析2.1.2 行为模型的建立2.1.3 消费者画像的制作 2.2 定位广告投放人群2.2.1 人群…

vscode取消未使用变量的提示(爆红)

目前项目正在使用ts&#xff08;TypeScript&#xff09;&#xff0c;可以在 tsconfig.json 文件中调整编译选项 在你的项目中找到并打开 tsconfig.json 文件&#xff0c;将noUnusedLocals和noUnusedParameters设置为false&#xff0c;关闭vscode重新打开项目即可 {"comp…

ISO 20000认证:驱动企业IT服务管理变革的利器

在信息技术驱动商业发展的今天&#xff0c;企业对高效、可靠和安全的IT服务需求日益增长。ISO 20000作为国际公认的IT服务管理标准&#xff0c;能够帮助企业在竞争激烈的市场环境中脱颖而出&#xff0c;实现IT服务管理的全面提升。本文将深入探讨ISO 20000认证如何帮助企业优化…

机器学习中的可解释性

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础 人工智能Python基础 人工智能基础核心知识 人工智能BI核心知识 人工智能CV核心知识 为什么我们需要了解模型如何进行预测 我们是否应该始终信任表现良好的模型&#xff1f;模型可能会拒绝你的抵押贷款申请或诊断你患…

基础跟张宇,强化用36讲还是高数辅导讲义?

基础跟的张宇老师&#xff0c;强化阶段跟谁要看基础学的怎么样&#xff01; 因为张宇老师今年课程大改版&#xff0c;和以往的课程一点也不一样&#xff01; 具体变动是&#xff1a; 张宇老师把往年强化阶段的知识前移&#xff0c;也就是说现在的基础阶段要讲的内容是以往基…

一文读懂:LLM大模型RAG

RAG 检索增强生成&#xff08;Retrieval Augmented Generation&#xff09;&#xff0c;简称 RAG&#xff0c;已经成为当前最火热的LLM应用方案。经历今年年初那一波大模型潮&#xff0c;想必大家对大模型的能力有了一定的了解&#xff0c;但是当我们将大模型应用于实际业务场…

分布式一致性算法:Raft学习

分布式一致性算法&#xff1a;Raft学习 1 什么是分布式系统&#xff1f; 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。这些节点可能位于不同的物理位置&#xff0c;但它们协同工作以提供一个统一的计算平台或服务。分布式系统…

springmvc重定向和返回json,如何同时实现?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

怎样把图片转成pdf文件,简鹿格式工厂轻松批量搞定

信息的存储和分享方式变得越来越多样化&#xff0c;而PDF文件以其跨平台兼容性和内容完整性&#xff0c;成为了许多用户首选的文档格式。无论是在学术研究、商务办公&#xff0c;还是个人创作中&#xff0c;将图片转换为PDF文件的需求日益凸显。 想象一下&#xff0c;当你需要整…

高性能Python网络框架实现网络应用详解

概要 Python作为一种广泛使用的编程语言,其简洁易读的语法和强大的生态系统,使得它在Web开发领域占据重要位置。高性能的网络框架是构建高效网络应用的关键因素之一。本文将介绍几个高性能的Python网络框架,详细描述它们的特点、使用场景及具体示例代码,帮助高效实现网络应…

veriloga要怎么在candence中编译和加密?

从编译器的角度来说&#xff0c;我在ADS中可能就是直接用notepad编写&#xff0c;然后生成检查&#xff0c;它会有提示成功或报错的信息。但是对比下来&#xff0c;我发现candence的编译器更加方便编写va&#xff0c;所以把运行成功的步骤记录下来,防止遗忘。 首先&#xff0c…

2024.7.9.小组汇报postman分享会

文章目录 一、前言&#xff08;一&#xff09;界面导航说明&#xff08;二&#xff09;发送第一个请求 二、基本功能&#xff08;一&#xff09;常见类型的接口请求(常见的接口有如下四种类型&#xff1a;1.查询参数的接口请求2.表单类型的接口请求3.上传文件的表单请求4.JSON …

关于MySQL mvcc

innodb mvcc mvcc 多版本并发控制 在RR isolution 情况下 trx在启动的时候就拍了个快照。这个快照是基于整个数据库的。 其实这个快照并不是说拷贝整个数据库。并不是说要拷贝出这100个G的数据。 innodb里面每个trx有一个唯一的trxID 叫做trx id .在trx 开始的时候向innodb系…

java基础01—根据源码分析128陷阱以及如何避免128陷阱

源码分析128陷阱 如上图所示&#xff0c;int类型数据超过127依旧能正常比较&#xff0c;但Integer类型就无法正确比较了 /*** Cache to support the object identity semantics of autoboxing for values between* -128 and 127 (inclusive) as required by JLS.** The cache …

C++内存的一些知识点

一、内存分区 在C中&#xff0c;内存主要分为以下几个区域&#xff1a; 代码区&#xff1a;存放函数体的二进制代码。 全局/静态存储区&#xff1a;存放全局变量和静态变量&#xff0c;这些变量在程序的整个运行期间都存在。常量存储区&#xff1a;存放常量&#xff0c;这些值…

新加坡工作和生活指北:教育篇

文章首发于公众号&#xff1a;Keegan小钢 新加坡的基础教育在东南亚处于领先地位&#xff0c;这点基本是人尽皆知&#xff0c;但很多人对其教育体系只是一知半解&#xff0c;今日我们就来深入了解一下。 新加坡的学校主要分为三大类&#xff1a;政府学校、国际学校、私立学校。…

谷歌上新!最强开源模型Gemma 2,27B媲美LLaMA3 70B,挑战3140亿Grok-1

文章目录 LMSYS Chatbot Arena&#xff1a;开源模型性能第一Gemma为什么这么强&#xff1f;架构创新对AI安全性的提升 A领域竞争激烈&#xff0c;GPT-4o 和 Claude 3.5 Sonnet 持续发力&#xff0c;谷歌迅速跟进。 谷歌为应对AI竞争所采取的策略&#xff1a;依靠 Gemini 闭源模…