1. HelloWorld
配置部署好 vsCode 之后,就可以直接在上面写代码了,新建一个新的C程序文件,向屏幕输出一串字符 “Hello World!”,如下图所示:
最简单的 Hello World 程序

下面,从整体上来分析一下这个最简单的C语言程序,将这个最简程序的各个部分剖析清楚,明白我们写下的每一个字符的具体含义。
2. 程序的基本结构
2.1 头文件
- C语言程序中,任何符号(包括变量和函数)的使用,都是需要提前声明的。
- 如果程序用到了系统库函数,那么就需要包含相应的系统头文件来进行声明。
- 上述代码中用到了库函数
printf,而这个函数的声明在头文件stdio.h中,因此在该程序中需要包含此头文件。
声明
- 概念:对源文件外定义的某个符号进行描述的过程,称为声明
- 作用:经过声明的符号,编译器才能正确识别和编译,否则编译器不认识,无法判定语法错误
- 符号:变量、函数等
- 示例:
2.2 主函数
- 主函数是必须有的,每一个C语言程序都有main函数,哪怕是空的。
- 主函数的名字是固定的,叫 main ,这个函数名不可被挪作他用。
- 主函数是程序的入口,也就是程序开始运行的地方。
- 主函数分解如下:
在 Linux 环境下,主函数 main 根据程序最终是否需要接收外部命令行参数,实际上有两个版本:
在初学阶段,可不必理会带外部参数的版本,等到学完数组和指针再回过来复习即可。
2.3 printf函数
C语言被称为是一种面向过程的模块化语言,所谓的模块,值得是一个个功能明确、各司其职的封装函数,它们就像一块块积木,被合理有机地拼搭起来,形成复杂、健壮的程序。
在这之中,系统标准C库提供了非常多“模块”,
printf 就是其中之一,它的功能就是:向终端输出一段指定格式的数据。格式输出控制符
- 概念:函数
printf被称为格式化IO函数,因为它是按照指定格式来操作数据的。以常见的整数、浮点数和字符串为例,printf函数相关的控制格式符如下所示:
- 语法点:
- 类似 %d、%f 被称为格式控制符
- 一个格式控制符对应一个数据
- ‘\n’ 是一个字符,表示回车符,详细 ASCII 码表参阅教案3。
- 格式控制符:
- 十进制整数:%d
- 八进制整数:%o
- 十六进制整数:%x
- 字符:%c
- 字符串:%s
- 单精度浮点数:%f
- 双精度浮点数:%lf
- 长双精度浮点数:%Lf
- 地址:%p
序号 | 格式控制符 | 对应数据类型 | 备注 |
1 | %d | int | 整型数据 |
2 | %u | unsigned int | 无符号整型数据 |
3 | %ld | long int | 长整型数据 |
4 | %lu | unsigned long int | 无符号长整型数据 |
5 | %hd | short int | 短整型数据 |
6 | %hu | unsigned short int | 无符号短整型数据 |
7 | %lld | long long int | 长长整型数据 |
8 | %llu | unsigned long long int | 无符号长长整型数据 |
9 | %hhd | char | 单字节整型数据 |
10 | %hhu | unsigned char | 无符号单字节整型数据 |
11 | %c | char | 字符 |
12 | %s | char * | 字符串 |
13 | %f 或 %e | float | 单精度浮点数 |
14 | %lf 或 %le | double | 双精度浮点数 |
15 | %Lf 或 %Le | long double | 长双精度浮点数 |
16 | %p | void * | 指针 |
12 | %.ns | char * | 取字符串前n个字符,n要改为具体数字 |
13 | %.nf | float | 保留n位有效数字,n要改为具体数字 |
15 | %x | unsigned 或 int | 十六进制整型数据 |
17 | %o | unsigned 或 int | 八进制整型数据 |
15 | %#x | unsigned 或 int | 十六进制整型数据,带0x前缀 |
17 | %#o | unsigned 或 int | 八进制整型数据,带0前缀 |
2.4 return语句
C语言中的关键字
return 的含义是结束一个函数,并返回某个数据(若有)。而具体到 main 函数中时,由于主函数 main 的结束同时也意味着整个程序的结束,因此在上述 Hello World 程序中 return 后整个程序就退出了。一般而言,程序正常退出时,main函数返回值是0;当程序异常退出时,main函数返回值是非0。
注意,main函数的返回值是给上一级进程的,因此理论上讲在当前的单进程程序中,main函数的返回值究竟是多少都无所谓,因为根本没有去使用这个返回值,除非在多进程程序中,进程间才需要使用main函数的返回值来传递信息。
3 man帮助手册
编程开发的过程中,需要使用众多的系统指令、各类函数库、系统调用、各类系统脚本文件等,这些种类繁多、功能各异的信息,可以通过统一的man手册来获取第一手资料,man文档是帮助信息的权威通道,是大多数教程、书籍的知识来源。
由于 man 手册所需要罗列的帮助条目众多,因此 man 手册被妥善地分为9册,不同的帮助信息被放入对应的man分册中:
- man文档的九个分册:
- Shell命令(默认已安装)
- 系统调用
- 库函数
- 特殊文件(通常出现在/dev目录下)
- 文件的特殊格式或协定(例如/etc/passwd的格式)
- 游戏
- 杂项(例如一些宏定义)
- 系统管理员命令(通常只能由管理员执行)
- 非标准内核例程
3.1 man手册的安装
注意,在安装了虚拟机Ubuntu或者WSL之后,可以在这类Linux系统上安装man手册,在默认情况下,系统只安装第一册,其他的帮助信息一般需要用户自己手动安装,安装指令如下:
3.2 man手册的查询
使用man手册查询命令、函数时,一般直接在man后面接上待查条目即可,但有时候会遇到同一个待查询的条目存在于多个man分册的情况,这就需要先罗列出该条目所在的分册信息,然后再根据需要去选择帮助文档的序号。
注意: 进入man手册之后,可以按
q退出在 Windows 系统中,无法使用上述命令,可上官方网站在线查找帮助,或直接下载离线版帮助手册即可:
- 点击进入在线 man官网
- 点击下载离线 帮助手册.zip
「课堂练习3」
使用man手册查询系统调用fork函数的用法,并编写一个程序试试它的效果。
4 代码风格规范
- 缩进:凡是有代码块的地方都必须缩进,一对大括号 { } 代表一个代码块
- 空格:标点符号后面,一般加空格
- 空行:不同逻辑段落中间,一般加空行
- 符号命名:尽量能一望便知,做到顾名思义,避免使用无意义字符
「课堂练习4」
麻花疼同学写了下面这个程序,请指出你认为不妥的地方。
#include "stdio.h"
main{}
(
float g; h;
float tax, rate;
g = e21;
tax = rate * g;
printf("%f\n", tax);
)1】问:视频中的虚拟机VMware和Ubuntu到哪里下载?
【1】答:原则上可以自己下载,自己安装,但如果想要直接一键下载,开箱即食,可以点击下面的链接:
- 下载 虚拟机VMware-16pro-含注册码(776MB):
- 下载 Ubuntu-20.04(3.75GB):
【2】问:可以用DEV-C++、vc++、virtual studio等软件来写C语言程序吗?
【2】答:可以。用什么IDE编辑编译C语言程序,理论上都是可以的,C语言的核心语法都是一样的,但由于嵌入式课程的核心技术之一是Linux,因此在Linux环境下编写C语言代码是最好的方式,推荐直接在Linux系统中写代码,或者在 Windows 下安装带有Cygwin环境的 vsCode 都是可以的。
【3】问:需要安装虚拟机吗?
【3】答:可以,如果电脑硬件资源配置足够,安装虚拟机并在上面运行Linux系统直接进行C语言编程当然是可以的,在后续的嵌入式学习中,纯Linux的编程开发是必备的技能,只不过在初学C语言阶段,在电脑硬件配置不足的情形下,可以不必安装虚拟机的。
【4】问:苹果电脑的vsCode怎么配置?
【4】答:苹果电脑中的vsCode安装配置与windows的基本一样,要注意的是安装软件的格式不同,另外无需安装 MinGW或Cygwin。
- 安装vscode。
- 下载 VSCode-darwin-universal.zip(249MB):
在下载界面,找到对应系统的版本。

由于macOS系统本身已经自带了C/C++的编译环境,因此可以直接在文件夹中创建源码文件,编辑并编译运行。编译的时候,右键点击文件,在弹出的菜单中点击“在终端中打开”:

- 在终端中,直接敲命令编译程序:

【5】问:vsCode通过SSH连接不上Ubuntu怎么解决?
【5】答:尝试如下操作:
- Ubuntu已安装SSH服务,且处于running状态(命令:
sudo apt install ssh、sudo service ssh status)
- 关闭Windows、Ubuntu防火墙(命令:
sudo ufw disable)
- vsCode中的SSH插件的IP地址和用户名填写正确
- 配置vsCode的SSH插件,正确设置config文件的路径,如:

- 确保Ubuntu的网络服务正在运行,如:(按win+r打开命令行输入
services.msc)

- 删除 Ubuntu 系统中
~/.vscode-server,重新连接
- 删除 Windows 系统中的
C:\Users\Administrator\.ssh\下的所有文件,重新链接
「课堂练习1」
使用 vsCode 编写一段代码,显示自己的学校和姓名。
解答
本题主要考察 vsCode 软件的安装和配置。
参考代码
「课堂练习2」
使用 qtCreator 编写一段代码,显示自己的学校和姓名。
解答
本题主要考察 qtCreator 软件的安装和配置。
参考代码
「课堂练习3」
使用man手册查询系统调用fork函数的用法,并编写一个程序试试它的效果
解析
通过man手册查看fork函数的用法:
通过查阅代码,得知 fork 函数专用于创建一个新的进程,可以让原有的进程“分裂”成两个一模一样的进程,也就是有两个进程执行 fork 后续的代码。可以用下面的代码简单地验证这个结论:
参考代码
「课堂练习4」
麻花疼同学写了下面这个程序,请指出你认为不妥的地方。
解析:
- 系统原有的头文件要用尖括号,自定义的头文件采用双引号,因此第一行要改成 <stdio.h>
- C语言主函数返回值类型为整型,参数列表可以为空,改成: int main()
- 函数主体必须使用大括号括起来
- 代码块必须要缩进
- 浮点数的科学计数法中的e或E前面必须有数字,因此 e21 是错误的,可以改成1e21
- 题目中rate是未初始化的变量,因此其值是无意义的
#include <stdio.h>
int main()
{
float g, h;
float tax, rate=1;
g = 1e21;
tax = rate * g;
printf("%f\n", tax);
)- 作者:清弦子
- 链接:https://tangly1024.com/%E5%8D%95%E7%89%87%E6%9C%BA%E6%8A%80%E6%9C%AF/C02
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章
.jpg?table=collection&id=aeb9995f-c21f-83d9-b9b7-07efa597272a&t=aeb9995f-c21f-83d9-b9b7-07efa597272a)