第四章:语句
- [4.1 空语句](#4.1 空语句)
- [4.2 表达式语句](#4.2 表达式语句)
- [4.3 代码块](#4.3 代码块)
- [4.4 if 语句](#4.4 if 语句)
- [4.5 while 语句](#4.5 while 语句)
-
- [4.5.1 break和continue](#4.5.1 break和continue)
- [4.6 for语句](#4.6 for语句)
- [4.7 do 语句](#4.7 do 语句)
- [4.8 switch 语句](#4.8 switch 语句)
-
- [4.8.1 switch 中的break](#4.8.1 switch 中的break)
- [4.8.2 switch 中的default](#4.8.2 switch 中的default)
- [4.9 goto语句](#4.9 goto语句)
4.1 空语句
空语句通常由一个分号(;
)表示,不执行任何操作
c
; // 这是一个空语句
4.2 表达式语句
表达式后面加上一个分号,就可以把表达式转变为语句
c
x = y + 3;
ch = getchar();
4.3 代码块
4.4 if 语句
c
//if语法
if(expression){
statement
}
else{
statement
}
在C的if语句和其他语言的if
语句中,只存在一个差别。C并不具备布尔类型,而是用整型来代替。0为假,非0为真。
悬空else问题:else和谁匹配问题。在Python中,由于依赖缩进来定义代码块,因此通常不会出现悬空else问题。但是,在其他语言(如C、C++、Java等)中,如果不正确地使用花括号,就可能出现这个问题。
c
if (condition1)
if (condition2)
statement1;
else
statement2;
在这个例子中,else
与哪个if
匹配是不明确的。根据语言的语法规则,else
将与最近的未匹配的if
语句匹配 ,即if (condition2)
。为了避免这种问题,应该始终确保使用花括号来明确界定代码块,尤其是在嵌套的if-else语句中。上述代码应该这样写:
c
if (condition1) {
if (condition2) {
statement1;
} else {
statement2;
}
}
在这个修改后的版本中,else
明确地与if (condition2)
匹配,使得代码的逻辑更加清晰。
4.5 while 语句
c
//while语法
while (expr) {
// 要重复执行的代码块
}
4.5.1 break和continue
- 在
while
循环中可以使用break
语句,用于永久终止循环。 - 在
while
循环中也可以使用continue
语句,它用于永久终止当前的那次循环。
4.6 for语句
c
//for语法
for(expression1; expression2 ; expression3 ){
statement;
}
for
语句的执行过程几乎和下面的while
语句一模一样:
c
expression1 ;
while ( expression2 ) {
statement;
expression3 ;
}
当然for
和while
两者也有差异,差异表现在 continue
语句 。
在 for
循环中,通常有一个初始化部分、一个条件检查部分、一个循环体和一个调整(或迭代)部分。这些部分在 for
语句的声明中就已经定义好了。当在循环体内遇到 continue
语句时,程序会跳过当前迭代剩余的代码,并直接跳到调整部分,然后开始下一次迭代的条件检查。
c
for (int i = 0; i < 10; i++) {
if (i == 5) {
continue; // 当 i 等于 5 时,跳过当前迭代剩余的部分
}
// 循环体的其余部分
printf("%d\n", i);
}
在这个例子中,当 i
等于 5 时,continue
语句会跳过 printf
调用,然后 i
会递增(这是 for
循环的调整部分),接着检查 i < 10
是否为真,以决定是否开始下一次迭代。
而在 while
循环中,循环体通常是一个代码块,它包含了需要检查的条件和所有需要执行的语句。没有像 for
循环那样的显式调整部分;循环的迭代通常通过在循环体内部修改条件变量来实现。因此,当在 while
循环的循环体内部遇到 continue
语句时,它会跳过当前迭代剩余的代码,并立即回到 while
语句的条件检查。如果条件仍然为真,循环将重新开始;如果条件为假,循环将终止。
c
int i = 0;
while (i < 10) {
if (i == 5) {
continue; // 当 i 等于 5 时,跳过当前迭代剩余的部分
}
// 循环体的其余部分
i++; // 这可以看作是调整部分,但在 while 循环中它是循环体的一部分
printf("%d\n", i);
}
4.7 do 语句
c
do{
statement;
}while (expression);
do-while
至少执行一次
4.8 switch 语句
c
switch (expression) {
case constant-expression1:
// 代码块1
break;
case constant-expression2:
// 代码块2
break;
// 可以有更多的 case 语句
default:
// 默认执行的代码块
break;
}
constant-expression1
:常量整型值表达式,不能是变量
4.8.1 switch 中的break
switch
语句的执行过程。首先是计算 expression
的值,然后执行流转到语句列表中其case
标签值与expression
的值匹配的语句。从这条语句起,直到语句列表的结束也就是switch
语句的底部,它们之间所有的语句均被执行。
如果遇到break
就直接执行到switch
底部
4.8.2 switch 中的default
default
写在任何一个case
标签可以出现的位置。当switch
表达式的值并不匹配所有case
标签的值时,这个default
子句后面的语句就会执行。所以,每个switch
语句中只能出现一条default
子句。但是,它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case
标签一样贯穿default
子句。
4.9 goto语句
不建议使用
goto
语句