【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤
目录
1.8 使用 C 语言的 7 个步骤
1.8.1 第 1 步:定义程序的目标
1.8.2 第 2 步:设计程序
1.8.3 第 3 步:编写代码
1.8.4 第 4 步:编译
1.8.5 第 5 步:运行程序
1.8.6 第 6 步:测试和调试程序
1.8.7 第 7 步:维护和修改代码
1.8.8 说明
1.8 使用 C 语言的 7 个步骤
C 是编译型语言。如果之前使用过编译型语言(如,Pascal、FORTRAN),就会很熟悉组建 C 程序的几个基本步骤。但是,如果以前使用的是解释型语言(如,BASIC、Python、JavaScript)或面向图形界面语言(如,Visual Basic),或者甚至没接触过任何编程语言,就有必要学习如何编译。别担心,这并不复杂。
首先,为了让读者对编程有大概的了解,我们把编写 C 程序的过程分解成 7 个步骤(见图1.3)。

注意,这是理想状态。在实际的使用过程中,尤其是在较大型的项目中,可能要做一些重复的工作,根据下一个步骤的情况来调整或改进上一个步骤。
1.8.1 第 1 步:定义程序的目标
在动手写程序之前,要在脑中有清晰的思路。想要程序去做什么首先自己要明确自己想做什么,思考你的程序需要哪些信息,要进行哪些计算和控制,以及程序应该要报告什么信息。在这一步骤中,不涉及具体的计算机语言,应该用一般术语来描述问题。
1.8.2 第 2 步:设计程序
对程序应该完成什么任务有概念性的认识后,就应该考虑如何用程序来完成它。例如,用户界面应该是怎样的?如何组织程序?目标用户是谁?准备花多长时间来完成这个程序?
除此之外,还要决定在程序(还可能是辅助文件)中如何表示数据,以及用什么方法处理数据。学习 C 语言之初,遇到的问题都很简单,没什么可选的。但是,随着要处理的情况越来越复杂,需要决策和考虑的方面也越来越多。通常,选择一个合适的方式表示信息可以更容易地设计程序和处理数据。
再次强调,应该用一般术语来描述问题,而不是用具体的代码。但是,你的某些决策可能取决于语言的特性。例如,在数据表示方面,C 的程序员就比 Pascal 的程序员有更多选择。
1.8.3 第 3 步:编写代码
设计好程序后,就可以编写代码来实现它。也就是说,把你设计的程序翻译成 C 语言。这里是真正需要使用 C 语言的地方。可以把思路写在纸上,但是最终还是要把代码输入计算机。
这个过程的机制取决于编程环境,我们稍后会详细介绍一些常见的环境。一般而言,使用文本编辑器创建源代码文件。该文件中内容就是你翻译的 C 语言代码。程序清单 1.1 是一个 C 源代码的示例。
程序清单 1.1 C 源代码示例:
#include <stdio.h>int main(void)
{int dogs;printf("How many dogs do you have?\n");scanf("%d", &dogs);printf("So you have %d dog(s)!\n", dogs);return 0;
}
在这一步骤中,应该给自己编写的程序添加文字注释。最简单的方式是使用 C 的注释工具在源代码中加入对代码的解释。第 2 章将详细介绍如何在代码中添加注释。
提示:
本专栏采用的 C 程序开发环境包括:
- 操作系统:Windows 11 (64 位)
- 集成开发环境(IDE):Visual Studio Code(VS code)
- 编译器与调试工具:MinGW,包含 GCC(GNU Compiler Collection)用于编译 C 代码,以及 GDB(GNU Debugger)用于调试。
- 命令行工具:使用 PowerShell 或命令提示符(cmd)进行编译和运行程序。
1.8.4 第 4 步:编译
接下来的这一步是编译源代码。再次提醒读者注意,编译的细节取决于编程的环境,我们稍后马上介绍一些常见的编程环境。现在,先从概念的角度讲解编译发生了什么事情。
前面介绍过,编译器是把源代码转换成可执行代码的程序(即把高级语言程序翻译成计算机能理解的机器语言指令集)。可执行代码是用计算机的机器语言表示的代码。这种语言由数字码表示的指令组成。如前所述,不同的计算机使用不同的机器语言方案。
C 编译器负责把 C 代码翻译成特定的机器语言。此外,C 编译器还将源代码与 C 库(库中包含大量的标准函数供用户使用,如 printf () 和 scanf() )的代码合并成最终的程序(更精确地说,应该是由一个被称为链接器的程序来链接库函数,但是在大多数系统中,编译器运行链接器)。其结果是,生成一个用户可以运行的可执行文件,其中包含着计算机能理解的代码。

编译器还会检查 C 语言程序是否有效。如果 C 编译器发现错误,就不生成可执行文件并报错。理解特定编译器报告的错误或警告信息是程序员要掌握的另一项技能。
扩展:
对于 C 程序的编译流程,我在一篇博客中进行了详尽的讲解,涵盖了从源代码到可执行文件的全过程,包括编译、汇编和链接等关键步骤,并具体介绍了 GCC 指令的应用。在该博客中,我还通过 Visual Studio Code 的命令行演示了这些指令的实际使用方法。对这一过程感兴趣的读者可以通过以下直达链接访问文章,深入了解并实践这些概念:C 语言的编译过程详解
1.8.5 第 5 步:运行程序
传统上,可执行文件是可运行的程序。在常见环境(包括 Windows 命令提示符模式、UNIX 终端模式和 Linux 终端模式)中运行程序要输入可执行文件的文件名,而其他环境可能要运行命令(如,在 VAX 中的 VMS)或一些其他机制。
例如,在 Windows 和 Macintosh 提供的集成开发环境(IDE)中,用户可以在 IDE 中通过选择菜单中的选项或按下特殊键来编辑和执行 C 程序。最终生成的程序可通过单击或双击文件名或图标直接在操作系统中运行。
提示:
VAX( Virtual Address eXtension )是一种可支持机器语言和虚拟地址的 32 位小型计算机。VMS(Virtual Memory System)是旧名,现在叫 OpenVMS,是一种用于服务器的操作系统,可在 VAX、Alpha 或 Itanium 处理器系列平台上运行。
扩展:
关于如何在 Visual Studio Code (VS Code) 中运行 C 程序,我在一篇博客中提供了详细的指南。该文章深入浅出地介绍了整个流程,从环境配置到编写、编译和执行代码的每一步骤。有兴趣了解更多或需要指导的读者,可以通过以下链接直接访问这篇文章:VS code 与终端模式中运行 C 程序详解
1.8.6 第 6 步:测试和调试程序
程序能运行是个好迹象,但有时也可能会出现运行错误。接下来,应该检查程序是否按照你所设计的思路运行。你会发现你的程序中有一些错误,计算机行话叫作 bug。
查找并修复程序错误的过程叫调试。学习的过程中不可避免会犯错,学习编程也是如此。因此,当你把所学的知识应用于编程时,最好为自己会犯错做好心理准备。随着你越来越老练,你所写的程序中的错误也会越来越不易察觉。
将来犯错的机会很多。你可能会犯基本的设计错误,可能错误地实现了一个好想法,可能忽视了输入检查导致程序瘫痪,可能会把圆括号放错地方,可能误用 C 语言或打错字,等等。把你将来犯错的地方列出来,这份错误列表应该会很长。
看到这里你可能会有些绝望,但是情况没那么糟。现在的编译器会捕获许多错误,而且自己也可以找到编译器未发现的错误。在学习本书的过程中,我们会给读者提供一些调试的建议。
提示:
在本专栏中,我将使用 Visual Studio Code (VS Code) 进行代码调试,并会详细记录和展示每一步操作过程。这样可以确保大家能够清晰地跟随学习,掌握调试技巧。
1.8.7 第 7 步:维护和修改代码
创建完程序后,你发现程序有错,或者想扩展程序的用途,这时就要修改程序。例如,用户输入以 Zz 开头的姓名时程序出现错误、你想到了一个更好的解决方案、想添加一个更好的新特性,或者要修改程序使其能在不同的计算机系统中运行,等等。如果在编写程序时清楚地做了注释并采用了合理的设计方案,这些事情都很简单。
1.8.8 说明
编程并非像描述那样是一个线性的过程。有时,要在不同的步骤之间往复。例如,在写代码时发现之前的设计不切实际,或者想到了一个更好的解决方案,或者等程序运行后,想改变原来的设计思路。对程序做文字注释为今后的修改提供了方便。
许多初学者经常忽略第 1 步和第 2 步(定义程序目标和设计程序),直接跳到第 3 步(编写代码)。刚开始学习时,编写的程序非常简单,完全可以在脑中构思好整个过程。即使写错了,也很容易发现。但是,随着编写的程序越来越庞大、越来越复杂,动脑不动手可不行,而且程序中隐藏的错误也越来越难找。最终,那些跳过前两个步骤的人往往浪费了更多的时间,因为他们写出的程序难看、缺乏条理、让人难以理解。要编写的程序越大越复杂,事先定义和设计程序环节的工作量就越大。
磨刀不误砍柴工,应该养成先规划再动手编写代码的好习惯,用纸和笔记录下程序的目标和设计框架。这样在编写代码的过程中会更加得心应手、条理清晰。
相关文章:
【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤
目录 1.8 使用 C 语言的 7 个步骤 1.8.1 第 1 步:定义程序的目标 1.8.2 第 2 步:设计程序 1.8.3 第 3 步:编写代码 1.8.4 第 4 步:编译 1.8.5 第 5 步:运行程序 1.8.6 第 6 步:测试和调试程序 1.8.…...
Docker 使用 Dockerfile 文件打包部署前端项目
编写 Dockerfile 文件: FROM nginx:latest ADD dist /etc/nginx/html/dist COPY nginx.conf /etc/nginx/nginx.conf ENV PATH /usr/sbin:$PATH EXPOSE 80 ENTRYPOINT ["nginx"] CMD ["-g","daemon off;"]编写 nginx.conf 文件&#…...
HTML-全
. CSS css后缀名的文件被html引用 在HTML中,CSS(层叠样式表,Cascading Style Sheets)是一种用于设置网页上的文本内容、图片布局和版面设计等外观样式的样式表语言。简单来说,CSS定义了HTML元素如何显示在浏览器中。…...
高效流程图绘制:开发设计流程图利器
在选择画流程图的工具时,不同的项目和使用场景会决定最佳的工具。以下是几款常见的流程图工具,并结合具体项目使用场景提供建议: 1. Lucidchart 特点: 在线协作:支持多人实时协作,适合团队合作。模板丰富&…...
数据仓库的概念
先用大白话讲一下,数据仓库的主要目的就是存储和分析大量结构化数据的。 > 那么它的核心目的是:支持商业智能(BI)和决策支持系统,也就是说,它不仅仅是为了存储,更重要的是为了分析提供便利。…...
AI - 谈谈RAG中的查询分析(2)
AI - 谈谈RAG中的查询分析(2) 大家好,RAG中的查询分析是比较有趣的一个点,内容丰富,并不是一句话能聊的清楚的。今天接着上一篇,继续探讨RAG中的查询分析,并在功能层面和代码层面持续改进。 功…...
Java基础面试题,46道Java基础八股文(4.8万字,30+手绘图)
Java是一种广泛使用的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)在1995年首次发布。它是一种面向对象的语言,这意味着它支持通过类和对象的概念来构造程序。 Java设计有一个核心理念:“编写一次&am…...
taro小程序马甲包插件
插件名 maloulab/taro-plugins-socksuppet-ci maloulab/taro-plugins-socksuppet-ci安装 yarn add maloulab/taro-plugins-socksuppet-ci or npm i maloulab/taro-plugins-socksuppet-ci插件描述 taro官方是提供了小程序集成插件的tarojs/plugin-mini-ci ,且支持…...
【分组去重】.NET开源 ORM 框架 SqlSugar 系列
💥 .NET开源 ORM 框架 SqlSugar 系列 🎉🎉🎉 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列…...
2020年
C D A C B B A B C B A 42...
基于Matlab卡尔曼滤波的GPS/INS集成导航系统研究与实现
随着智能交通和无人驾驶技术的迅猛发展,精确可靠的导航系统已成为提升车辆定位精度与安全性的重要技术。全球定位系统(GPS)和惯性导航系统(INS)在导航应用中各具优势:GPS提供全球定位信息,而INS…...
《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?“找不到mfc140u.dll文件”要怎么解决?教你几招轻松搞定
《只狼》运行时提示“mfc140u.dll文件缺失”的科普与解决方案 作为一名软件开发从业者,在游戏开发和维护过程中,我们经常会遇到各种运行时错误和系统报错。今天,我们就来探讨一下《只狼》这款游戏在运行时提示“mfc140u.dll文件缺失”的原因…...
C语言:指针与数组
一、. 数组名的理解 int arr[5] { 0,1,2,3,4 }; int* p &arr[0]; 在之前我们知道要取一个数组的首元素地址就可以使用&arr[0],但其实数组名本身就是地址,而且是数组首元素的地址。在下图中我们就通过测试看出,结果确实如此。 可是…...
win11无法检测到其他显示器-NVIDIA
https://www.nvidia.cn/software/nvidia-app/ https://cn.download.nvidia.cn/nvapp/client/11.0.1.163/NVIDIA_app_v11.0.1.163.exe 下载安装后,检测驱动、更新驱动。...
SQLite:DDL(数据定义语言)的基本用法
SQLite:DDL(数据定义语言)的基本用法 1 主要内容说明2 相关内容说明2.1 创建表格(create table)2.1.1 SQLite常见的数据类型2.1.1.1 integer(整型)2.1.1.2 text(文本型)2…...
AI工具集:一站式1000+人工智能工具导航站
在当今数字化时代,人工智能(AI)技术的飞速发展催生了众多实用的AI工具,但面对如此多的选择,想要找到适合自己的高质量AI工具却并非易事。网络搜索往往充斥着推广内容,真正有价值的信息被淹没其中。为了解决…...
视觉处理基础2
目录 1.池化层 1.1 概述 1.2 池化层计算 1.3 步长Stride 1.4 边缘填充Padding 1.5 多通道池化计算 1.6 池化层的作用 2. 卷积拓展 2.1 二维卷积 2.1.1 单通道版本 2.1.2 多通道版本 2.2 三维卷积 2.3 反卷积 2.4 空洞卷积(膨胀卷积) 2.5 …...
代码随想录第十四天|二叉树part02--226.翻转二叉树、101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
资料引用: 226.翻转二叉树(226.翻转二叉树) 101.对称二叉树(101.对称二叉树) 104.二叉树的最大深度(104.二叉树的最大深度) 111.二叉树的最小深度(111.二叉树的最小深度)…...
vue基础之7:天气案例、监视属性、深度监视、监视属性(简写)
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
JS实现高效导航——A*寻路算法+导航图简化法
一、如何实现两点间路径导航 导航实现的通用步骤,一般是: 1、网格划分 将地图划分为网格,即例如地图是一张图片,其像素为1000*1000,那我们将此图片划分为各个10*10的网格,从而提高寻路算法的计算量。 2、标…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: 问题原因: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...
