第二章:C/C++编程
本章讲解基础编程知识。
本章内容规划:
2.1节,概念及学习方法
2.2节,程序基本单元
2.3节,程序基本逻辑结构
2.4节,程序基本存储结构
2.5节,函数
2.6节,面向对象设计
2.7节,高级编程概述
2.1节,概念及学习方法
C/C++ 是一种流行全球的经典编程语言,起源于1972年贝尔实验室,程序运行效率高,可应用于各种系统平台上,Windows、macOS、Unix。现在流行的STM32单片机编程,使用的也是C语言。C++是C的超集,包含C语言的扩充。程序是鼓励阅读和分享的,相对于电子、机械、化学等其它学科,软件编程更易于在网络上找到学习资源。C++编程入门推荐一个网站:
https://www.runoob.com/cplusplus/cpp-tutorial.html
这个网站上包含比较全面的基础编程教程,除了C++、还有Android、Java、C#等。同时有非常方便的C++线上编译工具:
https://www.runoob.com/try/runcode.php?filename=helloworld&type=cpp
高级语言均需要先编辑,使用编译器将该程序编译成可执行文件后方可运行。本章内容均可以在该工具上学习实践。如果喜欢看书学习的同学,推荐《Visual C++程序设计》中国水利水电出版社:
这本C++教程内容简洁,又不至于过于简单,最适合编程入门。其它砖头厚的教材,内容丰富,但容易抓不住重点,难度过大,并不是适合初学者。个人推崇由浅入深,循序渐进的思路进行学习。本书学习以后,可以再看
《嗨翻C语言》《thinking in c++》《C++ Primer Plus》扩充学习。下面以一个简单而且经典的例子,开始我们的编程学习之旅。
//Example_1 #include <iostream> int main() { std::cout<<"Hello,world !"; return 0; }
在线上编译工具上左边的窗口输入(注意使用英文输入法,否则容易出错),点击运行,即可在右边的窗口得到结果,如下图:
“你好,世界!”,人生第一个程序,完成!下面开始解释该程序:
程序是按行编写,按行编译的。
第一行“//Example_1”是一个注释行,双斜杆“//”后面的内容并不会被编译,一般用于解释程序的作用,功能等等;
第二行“#include <iostream>”是预处理命令,声明使用iostream.h头文件,这样我们就能使用该文件已经实现的功能而不需要自己编写。
第三行“int main()”,声明main函数,main函数是程序的入口,最开始执行的地方。
第四行和第七行的{},声明main函数的开始和结束的位置。
第五行“std::cout<<"Hello,world !";”,是一个输出语句,使用std::cout向屏幕打印Hello,world !语句。std::cout在iostream.h中定义,常用于程序的调试,输出我们程序的运行信息。
第六行“return 0;”,是输出函数返回值。函数返回值,可以用来输出函数运行状态等。
本节我们简单了解了注释,头文件声明,主函数,输出函数,返回值这些概念。可能你还有诸多疑问,建议先放下。编程语言所有的规则定义均是人为设定的,我们先记住这些编程规则,在后续接触中慢慢了解,清晰这些概念。
2.2节,程序基本单元
本节我们将继续讲解语法,C++字符集是由英语字符、阿拉伯数字、英文符号构成,对大小写敏感。下面介绍C++语法词汇概念:关键字、标识符、标点符号、运算符,数据类型(数据类型转换),常量、变量。
2.2.1 关键字、标识符、标点符号、运算符
关键字,指的是C++语法已经使用的,有特定含义的词汇,我们不能再用该词汇命名变量名、类名等。
标识符,指的是用户自定义的词汇,用来标识变量名、类名、函数名等,以字母或下划线开始,由字母、数字、下划线构成的字符串,如:a,_a,a1,Name。
标点符号,程序中用来分割语句的符号,类似于中文的逗号句号。如下表所示:
标点符号 | 含义 |
空格 | 各成分之间分割 |
; | 语句结束标志 |
" | 单个字符标识,如'a' |
"" | 字符串标识,如"abcd" |
# | 预处理命令,一般用于定义头文件 |
{} | 复合语句 |
// | 行注释 |
/* */ | 多行注释 |
运算符,指的是程序用来运算的符号,如下表。注:
(1)优先级,指的是运算优先级别,类似于我们以前学习数学运算中的“先乘除后加减”。
(2)单目双目三目,指的是参与运算的数、变量的个数。
(3)结合方向,如赋值运算符“=”从右到左结合,如程序中a=1读作把1赋给变量a;c=a*2;读作把a乘以2的值赋给变量c。
下面学习一个简单的计算例子:
//Example_2 #include <iostream> using namespace std; //使用C++标准命名空间 int main() { int a = 1; //“=”是赋值符号,令变量a等于1 int b = 2; int c = a * b;//“=”是赋值符号,令变量c等于axb cout<<"a = 1;"<<endl;//endl是cout换行格式控制符号 cout<<"b = 2;"<<endl; cout<<"c = a * b;"<<endl; cout<<"c = "<< c <<endl; return 0; }
在线工具运行如下:
我们在后续使用时在做具体的示例,相关学习内容也可看菜鸟网站以下链接:https://www.runoob.com/cplusplus/cpp-operators.html
2.2.2 数据类型和数据类型转换
程序的数据,是存储在存储器当中,因此是有大小和精度的。为了更好得利用存储单元,C++定义了数据类型,下面介绍基本数字类型,如下表:
类型符号 | 名称 | 占用字节大小 | 范围 |
bool | 布尔类型 | 1 | false/0、true/1 |
char | 字符型 | 1 | -128 ~ 127 |
unsighed char | 无符号字符型 | 1 | 0 ~ 255 |
short | 短整型 | 2 | -2^15 ~ (2^15-1) |
int | 整型 | 4 | -2^31 ~ (2^31-1) |
unsighed int | 无符号整型 | 4 | 0 ~ (2^32-1) |
long | 长型 | 4 | -2^31 ~ (2^31-1) |
float | 浮点型 | 4 | ±(3.4x10^-38 ~ 3.4x10^38) |
double | 双精度型 | 8 | ±(1.7977x10^-308 ~ 1.7977x10^308) |
在编写程序时,我们应该根据变量的取值范围,合理地定义数字类型,有利于加快运算速度,减小计算资源的消耗,这在运算频率相对较低的单片机上尤为重要。
不同的数字类型参与运算,涉及到数据类型转换问题。类型转换分为隐式转换和强制转换。隐式转换是系统自动完成的转换:小数型与整数型之间的相互赋值,字符型与整型的相互赋值。强制转换,通过()完成。如例子:
float a = 1.111; int b =2; float c = (int)a*b;//a的值转化为整型后参与运算,即c = 1*2;
2.2.3常量、变量
常量,在程序运行中值保持不变,编译器并不会为常量分配内存,常见使用方式是符号常量,使用关键字const定义(须带数据类型),或者#define定义(不可带数字类型)。如下面例子:
const float SPEED= 0.70; //产量一般使用大写字母命名,以便与变量分开
#define PI 3.14159 //使用PI代表3.14159
变量,在程序运行中值是不固定的,编译器会根据变量类型为其分配内存空间。