1. HelloWorld

配置部署好 vsCode 之后,就可以直接在上面写代码了,新建一个新的C程序文件,向屏幕输出一串字符 “Hello World!”,如下图所示:
最简单的 Hello World 程序
notion image
下面,从整体上来分析一下这个最简单的C语言程序,将这个最简程序的各个部分剖析清楚,明白我们写下的每一个字符的具体含义。

2. 程序的基本结构

2.1 头文件

  1. C语言程序中,任何符号(包括变量和函数)的使用,都是需要提前声明的。
  1. 如果程序用到了系统库函数,那么就需要包含相应的系统头文件来进行声明。
  1. 上述代码中用到了库函数 printf,而这个函数的声明在头文件 stdio.h 中,因此在该程序中需要包含此头文件。
声明
  • 概念:对源文件外定义的某个符号进行描述的过程,称为声明
  • 作用:经过声明的符号,编译器才能正确识别和编译,否则编译器不认识,无法判定语法错误
  • 符号:变量、函数等
  • 示例:

2.2 主函数

  1. 主函数是必须有的,每一个C语言程序都有main函数,哪怕是空的。
  1. 主函数的名字是固定的,叫 main ,这个函数名不可被挪作他用。
  1. 主函数是程序的入口,也就是程序开始运行的地方。
  1. 主函数分解如下:
在 Linux 环境下,主函数 main 根据程序最终是否需要接收外部命令行参数,实际上有两个版本:
在初学阶段,可不必理会带外部参数的版本,等到学完数组和指针再回过来复习即可。

2.3 printf函数

C语言被称为是一种面向过程的模块化语言,所谓的模块,值得是一个个功能明确、各司其职的封装函数,它们就像一块块积木,被合理有机地拼搭起来,形成复杂、健壮的程序。
在这之中,系统标准C库提供了非常多“模块”,printf 就是其中之一,它的功能就是:向终端输出一段指定格式的数据。

格式输出控制符

  • 概念:函数 printf 被称为格式化IO函数,因为它是按照指定格式来操作数据的。以常见的整数、浮点数和字符串为例,printf 函数相关的控制格式符如下所示:
  • 语法点:
    • 类似 %d、%f 被称为格式控制符
    • 一个格式控制符对应一个数据
    • ‘\n’ 是一个字符,表示回车符,详细 ASCII 码表参阅教案3。
  • 格式控制符:
      1. 十进制整数:%d
      1. 八进制整数:%o
      1. 十六进制整数:%x
      1. 字符:%c
      1. 字符串:%s
      1. 单精度浮点数:%f
      1. 双精度浮点数:%lf
      1. 长双精度浮点数:%Lf
      1. 地址:%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文档的九个分册:
      1. Shell命令(默认已安装)
      1. 系统调用
      1. 库函数
      1. 特殊文件(通常出现在/dev目录下)
      1. 文件的特殊格式或协定(例如/etc/passwd的格式)
      1. 游戏
      1. 杂项(例如一些宏定义)
      1. 系统管理员命令(通常只能由管理员执行)
      1. 非标准内核例程

3.1 man手册的安装

注意,在安装了虚拟机Ubuntu或者WSL之后,可以在这类Linux系统上安装man手册,在默认情况下,系统只安装第一册,其他的帮助信息一般需要用户自己手动安装,安装指令如下:

3.2 man手册的查询

使用man手册查询命令、函数时,一般直接在man后面接上待查条目即可,但有时候会遇到同一个待查询的条目存在于多个man分册的情况,这就需要先罗列出该条目所在的分册信息,然后再根据需要去选择帮助文档的序号。
注意: 进入man手册之后,可以按q退出
在 Windows 系统中,无法使用上述命令,可上官方网站在线查找帮助,或直接下载离线版帮助手册即可:
  1. 点击进入在线 man官网
  1. 点击下载离线 帮助手册.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】答:原则上可以自己下载,自己安装,但如果想要直接一键下载,开箱即食,可以点击下面的链接:
【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。
  1. 安装vscode。
在下载界面,找到对应系统的版本。
notion image
由于macOS系统本身已经自带了C/C++的编译环境,因此可以直接在文件夹中创建源码文件,编辑并编译运行。编译的时候,右键点击文件,在弹出的菜单中点击“在终端中打开”:
notion image
  1. 在终端中,直接敲命令编译程序:
notion image
【5】问:vsCode通过SSH连接不上Ubuntu怎么解决?
【5】答:尝试如下操作:
  1. Ubuntu已安装SSH服务,且处于running状态(命令:sudo apt install sshsudo service ssh status
  1. 关闭Windows、Ubuntu防火墙(命令: sudo ufw disable
  1. vsCode中的SSH插件的IP地址和用户名填写正确
  1. 配置vsCode的SSH插件,正确设置config文件的路径,如:
notion image
  1. 确保Ubuntu的网络服务正在运行,如:(按win+r打开命令行输入 services.msc
notion image
  1. 删除 Ubuntu 系统中 ~/.vscode-server,重新连接
  1. 删除 Windows 系统中的C:\Users\Administrator\.ssh\ 下的所有文件,重新链接
 
 

「课堂练习1」

使用 vsCode 编写一段代码,显示自己的学校和姓名。
解答
本题主要考察 vsCode 软件的安装和配置。
参考代码

「课堂练习2」

使用 qtCreator 编写一段代码,显示自己的学校和姓名。
解答
本题主要考察 qtCreator 软件的安装和配置。
参考代码

「课堂练习3」

使用man手册查询系统调用fork函数的用法,并编写一个程序试试它的效果
解析
通过man手册查看fork函数的用法:
通过查阅代码,得知 fork 函数专用于创建一个新的进程,可以让原有的进程“分裂”成两个一模一样的进程,也就是有两个进程执行 fork 后续的代码。可以用下面的代码简单地验证这个结论:
参考代码

「课堂练习4」

麻花疼同学写了下面这个程序,请指出你认为不妥的地方。
解析:
  1. 系统原有的头文件要用尖括号,自定义的头文件采用双引号,因此第一行要改成 <stdio.h>
  1. C语言主函数返回值类型为整型,参数列表可以为空,改成: int main()
  1. 函数主体必须使用大括号括起来
  1. 代码块必须要缩进
  1. 浮点数的科学计数法中的e或E前面必须有数字,因此 e21 是错误的,可以改成1e21
  1. 题目中rate是未初始化的变量,因此其值是无意义的
#include <stdio.h> int main() { float g, h; float tax, rate=1; g = 1e21; tax = rate * g; printf("%f\n", tax); )
 
相关文章
C语言(1)模拟电路仿真软件CircuitJS
Loading...