C语言教程-4-表达式和语句
我们前面已经学习了C语言最基本的数据存储,学习了如何使用变量
和常量
.
为了后面的知识:三种流程控制等,我们有必要现在就引入表达式和语句的概念.
这里简单甚至可能不准确的概括一下主要信息:
表达式由运算
构成,常见情况下
,如果在一个表达式后面添加一个分号;
,则他成为一条语句.
表达式
什么是表达式
cppreference标准定义为:表达式是运算符及其操作数的序列,它指定一个运算.
所谓运算符,就是类似+-*/
这样的符号,他可能有多个字符组成,C语言中有许多运算符,用于实现各种运算.
所谓操作数,就是运算符的运算对象,例如1+2
中的1
和2
即为+
的操作数.
C中的大部分语句都是表达式语句(见后面讲解语句
的部分),所以表达式
是C语言不可或缺的组成部分.大到一个函数调用,小到一个常量,都可以称为表达式,想要理解表达式,就要知道表达式有哪些.
实际上,我们之前见过的各种赋值,四则运算的操作,都属于表达式!
表达式有哪些
初等表达式
上图为C标准的描述,实际上已经比较清楚(真的假的???)
那么说人话就是,你平时见到的数字,字符,或者各种单个的标识符(例如变量n,函数名printf),都是初等表达式.
这"人话"说的可能还有点不清楚,举几个例子就好:
1 | int a=3,b=4; |
3~8行这些都是合法的初等表达式
另一方面,例如在1+2*3
中,2*3
作为其子表达式,1
作为初等表达式,也是其子表达式,更近一步,2*3
中,2
和3
都是初等表达式
不求值表达式
sizeof运算符的操作数是不求值表达式(除非它们是 VLA — 各位暂时不必理会).sizeof运算符用于查询对象或类型的大小.
更新的标准C11中新增的内容有:_Alignof
运算符的操作数、泛型选择的控制表达式及作为 _Alignof
的操作数的 VLA 的大小表达式亦为不求值的表达式.
其实很显然,这些由初等表达式和各种运算符组合起来的序列都是表达式,标准称:它指定一个运算(我们再把图放一遍)
不仅仅是用于计算算术运算的序列是表达式,其他的特殊运算(例如复合赋值,逻辑运算,关系运算,成员访问,函数调用)都能组成表达式.
换句话说,我们说学习C语言的大部分过程实际上就是学习如何正确编写合适的表达式用于计算
也不为过.
此外关于这些其他运算和运算符等的知识,将在后面进行讲解.
—WAHAHA,2023.9.23
语句
什么是语句
以下根据cppreference
的相关定义进行讲解.
c语言中,程序的基本单位是函数,而在每一个函数中(或者说一个过程),每一步运行的都是语句.
换句话说,语句是按顺序执行的 C 程序段。任何函数体都是一条复合语句,继而为语句或声明的序列
,例如:
1 | int main(void) |
语句的分类
首先必须要说明的一点是,下面的概念是相对严谨的描述(我根据cppreference进行描述),如果不理解不要紧,后面会进行穿插讲解,其实重要一点的就是要知道什么地方需要加;
什么地方不需要加.
语句有五种类型:
-
复合语句
或称块语句,由一对{}括起来,是花括号所包围的语句与声明的序列.
复合语句允许将一组声明和语句组合入一个单元,并将其在任何期待单个语句的场所使用(例如在 if 语句或循环语句中)—换句话说,一个复合语句中的所有语句将被视为一个整体的大语句进行使用.
1
2
3
4
5if (expr) // if 语句的开始
{ // 开始块
int n = 1; // 声明
printf("%d\n", n); // 表达式语句
} // 块结尾, if 语句结尾此外,一个复合语句内,会引入其自身的块作用域,此时块内部的变量将屏蔽外部同名的变量,有关
作用域
的知识将在后面进行讲解. -
表达式语句
跟随分号的表达式
是一条语句.无表达式的语句叫做
空语句
,空语句很重要,在后面讲解循环时会使用到.典型的 C 程序中大多数语句是表达式语句,例如
赋值
或函数调用
—例如前面说过的printf()的函数调用表达式.1
2
3
4puts("hello"); // 表达式语句
char *s;
while (*s++ != '\0')
; // 空语句 -
选择语句
选择语句根据表达式的值,选择数条语句之一执行—后面会讲解到的选择执行.
-
循环语句
循环语句重复执行一条语句,注意,这里将复合语句视为一条语句!
后面会讲解到的循环执行.
-
跳转语句
跳转语句无条件地转移控制流.
这里其实算是C保留了一点汇编的影子,C允许使用goto进行跳转.
跳转语句也有几种:
这些语句将在后面讲解其他执行顺序时进行讲解,放在顺序执行里为时过早.
---WAHAHA 2023.10.13
上一篇:C语言教程-3_2-基本输入输出
下一篇:C语言教程-5-顺序执行