1. 前言
本篇主要记录个人对C语言基本语法学习的思考和总结,着重于对C语言编程实质的思考,没有过多示例代码。
将在另外一篇博客中进行基本知识点的编程训练。
本文不定期更新和修正。最后更新日期:2021-07-31 17:55:13
主要从以下思路来学习:
<1>.数据表达
|-> 量(常量和变量)
|-> 数据类型
|-> 数据结构
<2>.控制结构
|-> 顺序结构
|-> 选择结构
|-> 循环结构
<3>.模块编程
|-> 表达式和返回值
|-> 语句
|-> 函数
|-> 头文件
2. 数据表达
2.1 量
量可以归纳为:常量和变量。
常量
常量就是我们说的字面量,直接书写在编程语言里面的对象。比如printf("数字:100
")
。
"数字",就是字面量字符常量;"100",就是字面量数字常量;":",就是字面量特殊字符常量
变量
C语言中,变量是内存区域的名称。也可以理解变量就是内存(或者内存的标签)
如定义变量的语句int a = 100;
,其执行的结果就是向编译器申请一片大小为int型的,名称为a内存区域,区域初始指为整型数字100。
操作系统是内存的管理者。应用程序申请内存后,由操作系统来分配。C语言程序因为需要编译器来编译,生成可执行文件。因此C语言语句的执行,实际是由编译器代理程序来向操作系统申请内存。
编译器在编译int a = 100;这句时,通过语法分析确定该语句要做的操作,编译为目标文件时告知操作系统要做的操作。
程序逻辑通过内存区域名称来使用内存内部的数据。内存区域除了有名称,还有地址,即内存地址。程序也可以通过地址操作符来使用内存内部的数据。
内存地址就是常说的指针。指针的操作符有:
*:解引地址。* 后面跟内存地址就是获取该地址处的内存值
&:取地址符。&后面跟变量,就是获取该变量的地址(指针)
总结一下:
- 内存的名称——变量
- 内存的地址——指针
- 内存的内容——值
示例代码:
# include<stdio.h>
int main(){
int a = 100;
printf("%d
",a); //打印内存(变量)a的值
printf("%d
",&a); //打印内存(变量)a的地址
scanf("%d",&a); //输入一个值,通过内存(变量)a地址存入内存(变量)a区域
printf("%d
",a); //打印内存(变量)a的值
printf("%d
",&a); //打印内存(变量)a的地址
return 0;
}
代码运行结果:
变量的值:100
变量的地址:-900142388
200
变量的值:200
变量的地址:-900142388
2.2 数据类型
数据类型是任何编程语言所具备的基本元素。
程序就是通过数据来实现不同的逻辑。一种比较经典的说法:程序=数据+算法。
因此编程语言为了解决实际问题,会根据现实世界万物表现和运行的方式,内置不同的数据类型。
数据类型可以分为静态单一数据类型,静态组合数据类型,动态数据类型。动态数据类型已经是数据结构的范畴。
数字与字符
观察单一数据类型可以发现,组成不同类型数据的元素,包括数字与字符。
数字不仅有整数,浮点数,还有有实数和虚数。
整数因为计算机支持和存放的方式,分为正负和不同的大小。
浮点数目因为计算机存放数据的位数分为单精度和双精度。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(){
}
数组
单一的数据类型不多。假如将数据混合,便构成了数据类型。
比如C语言静态数据类型,一维数组或者多维数组。
结构体
结构体则是包含了不同基本数据类型的数据类型。
共同体
3. 控制结构
控制结构是依据条件的程序运行方式,只有当【条件成立】时,才执行条件下的语句。
3.1 顺序结构
顺序执行就是【无条件】的情况。无论上一条语句执行做了什么,下一条语句继续执行。
一般程序是顺序执行的。C语言程序从main函数开始。main函数是一句一句执行。
示例程序:
#include <stdio.h>
void hello(){
printf("hello,world.I'm function:hello
");
}
int main(){
printf("hello,world.I'm function:main
");
hello();
return 0;
}
代码执行结果:
hello,world.I am function:main
hello,world.I am function:hello
上面这段代码,函数hello定义在主函数main前面,编译之后程序的执行顺序是先执行main,main函数调用hello时,才会被执行
3.2 选择结构
现实生活中,一往之前的情况只是众多情况最常见的,但是不唯一的。我们总会被很多条件限制,在符合这些条件时,才能够完成很多工作。
而C语言归纳了这种现象,通过选择结构和循环结构,完成程序的跳转。
3.2.1 条件结构
3.2.1.1 if...else...语句
由if引导的条件判断结构既简单也复杂。它是根据【条件的成立与否】来判断【语句执行与否】。
而条件则有可能是单一的条件,也有可能是多个条件。
条件的判断最终会产生一个真值(true或者false),if根据这个真值来确认是否执行条件下的语句模块。
语法结构如下:
if (条件判断的结果)
{
判断结果为真时,要执行的语句模块
}
else
{
判断结果为假时,要执行的语句模块
}
由上面的基本语法结构,衍生出其他语法结构,包括条件的嵌套。
情景1:特例处理
if (单一或者组合条件判断的结果为真)
{
判断结果为真时,要执行的语句模块
}
//这种适用于处理特殊情况
情景2:正反面
if (单一或者组合条件判断的结果为真)
{
判断结果为真时,要执行的语句模块
}
else
{
判断结果为假时,要执行的语句模块
}
//这种适用于仅仅存在2种互斥情况的场景
情景3:多种选择[区别于switch]
if (单一或者组合条件判断的结果为真)
{
判断结果为真时,要执行的语句模块
}
else if (单一或者组合条件判断的结果为真)
{
判断结果为真时,要执行的语句模块
}
else
{
上面条件均判断为假,要执行的语句模块
}
//适用于多个选择且互斥的场景
情景4:大条件下的小条件[嵌套]
if (单一或者组合条件判断的结果为真)
{
//情景1
if (单一或者组合的判断结果为真)
{
要执行的语句模块
}
//情景2
if (单一或者组合条件判断的结果为真)
{
要执行的语句模块
}
else
{
要执行的语句模块
}
//情景3
if (单一或者组合条件判断的结果为真)
{
要执行的语句模块
}
else if (单一或者组合条件判断的结果为真)
{
要执行的语句模块
}
else
{
结果为假时,要执行的语句模块
}
}
4. 模块编程
模块化编程在任何一种编程语言都存在。因为任何一门编程语言,必然会存在语句(指令)。
以某种形式(如空格,分号,换行符,缩进,花括号等)分开的语句,实际上就是编译器或者解释器能够编译或者解析的基本单位。
4.1 语句
运算符构成表达式。不同的运算符构成不同的表达式。
- 算术运算
- 关系运算
- 逻辑运算
- 赋值运算
- 位运算
表达式与语句分割形式,构成语句,是编译器或者解释器解析的单元。