表达式(Expression)
表达式=运算符+操作数
表达式必须有一个执行结果,这个结果必须是一个值,例如 3*4+5
的结果 17,a=c=d=10
的结果是 10,printf("hello")
的结果是 5(printf 的返回值是成功打印的字符的个数)
运算符
- 算术运算符→算术表达式
- 关系运算符→关系表达式
- 逻辑运算符→逻辑表达式
操作数
函数是被命名的可执行代码块,具有返回值的函数也可以用在表达式中,把其返回值作为构成表达式的操作数,以下为例子:
#include<iostream>
int main(int argc, char** argv)
{
int sum=printf("hello \n"); //结果:hello
printf("sum=%d \n",sum); //sum=7
return 0;
}
语句(Statement)
以分号;
结束的往往称为语句,而不是表达式,例如 3*4+5;
、a=c=d;
等
表达式语句
int Sum(int a, int b)
{
return a + b;
}
int main()
{
int a =0;
a; /*变量表达式*/
1; /*常量表达式*/
a + 1; /*算术表达式*/
int b = 0;
b = a; /*赋值表达式*/
a == b; /*关系表达式*/
a && b; /*逻辑表达式*/
a = Sum(a, b); /*函数返回值为赋值表达式的操作数*/
return 0;
}
函数调用语句
函数调用语句:由函数调用后添加分号构成,一般形式为 函数名(实际参数表);
。执行函数调用语句,就是为函数传入实际参数,执行函数中的语句,并根据需要返回值的过程。函数调用语句的返回值也会被丢弃:
#include <stdio.h>
int Sum(int a, int b)
{
return a + b;
}
int main()
{
int a = 1;
int b = 2;
/*调用自定义函数,未用返回值*/
Sum(a, b);
/*调用库函数*/
printf("a = %d, b = %d\n", a, b);
return 0;
}
控制语句
- 条件判断语句(
if
语句,switch
语句) - 循环执行语句(
do while
语句,while
语句,for
语句) - 转向语句(
break
语句,goto
语句,continue
语句,return
语句)
复合语句
复合语句(compound statement)简称为语句块,它使用大括号把许多语句和声明组合到一起,形成单条语句。
语句块与简单的语句不同,语句块不用分号当作结尾。当出现语法上某处需要一条语句,但程序却需要执行多条语句时,就可以用到语句块。例如,可以在 if 语句中使用语句块,或者当循环体需要执行多条语句时,也可以使用语句块:
{
double result = 0.0, x = 0.0; // 声明
static long status = 0;
extern int limit;
++x; // 语句
if ( status == 0 )
{ // 新语句块
int i = 0;
while ( status == 0 && i < limit )
{ /* ... */ } // 另一个语句块
}
else
{ /* ... */ } // 第三个语句块
}
如果语句块内需要有声明,通常会把声明放在语句块的头部,在其他语句之前。然而,C99 并不强制这么做,允许将声明放在语句块内的任何地方。
在语句块内声明的名称将具有语句块作用域
。换句话说,这些名称只有自声明点开始,一直到语句块结尾之前有效。在这个作用域内,这种声明会把在语句块以外声明的同名称对象隐藏起来。
同样地,动态变量的存储周期也被限制在语句块中它们生成的地方。这意味着,如果一个变量没有被声明为 static 或 extern,那么该变量的存储空间会在语句块结束之后自动被释放。
空语句
int main()
{
int i = 0;
for (; i < 20; i++)
{
/*空语句*/
;
}
return 0;
}
代码块(Blocks)
和上面提到的复合语句(语句块)其实是相同的概念,所谓代码块,就是由{ }
包围起来的代码。代码块在C语言中随处可见,例如函数体、选择结构、循环结构等。
【注意】一般来说代码块花括号后不用加;
,但结构体在定义时视为一条完整的语句,所以在花括号后加;
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};