C语言基础归纳 ---程序流程

本文深入解析程序控制流程中的关键语句,包括if、for、while、switch及goto语句的用法与特性。详细介绍了这些语句如何实现条件判断、循环执行及流程控制,旨在帮助开发者更好地理解和运用这些基础但强大的编程工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序中的语句是顺序执行的,除非由一个for、while、do-while、if、switch 或goto语句或一个函数调用将流程导向到其他地方去做其他的事情。
一条if 语句根据一个表达式的真值来有条件地执行代码。
for、while 和do-while 语句用于构建循环。在循环中,重复地执行相同的语句或一组语句,直到满足一个条件为止。
switch 语句根据一个整数表达式的算术值,来选择一组语句执行。
goto 语句无条件地跳转到一条标记的语句。
函数调用跳入到函数体中的代码。当该函数返回时,程序从函数调用之后的位置开始执行。



1 if
if 语句根据一个表达式的真值来有条件地执行代码。其形式如下:
1. if ( expression )
2.
3. statement
如果expression 计算为真(非零),将执行statement;否则,从if 语句之后的下一条语句开始继续执行。可以通过添加else 部分来扩展一条if 语句:
1. if ( expression )
2.
3. statement1
4.
5. else
6.
7. statement2
if 表达式为真(非零),将执行statement1;否则,执行statement2。
也可以通过添加else if 部分来扩展if 语句,如下所示:
1. if ( expression1 ) 2. 3. statement1 4. 5. else if ( expression2 ) 6. 7. statement2 8. 9. else if ( expression3 ) 10. 11. statement3 12. 13. ... 14. 15. else 16. 17. statementN

这个表达式按照顺序执行。当表达式的值非零时,对应的语句会执行,并且从if 语句之后的下一条语句开始继续执行。如果表达式都为假,则else 子句后面的语句会执行(就像一条简单的if 语句一样,else 子句是可选的,并且可以省略)。

2 条件表达式
条件表达式由3 个子表达式组成,其形式如下:
1. expression1 ? expression2 : expression3
当计算条件表达式时,先计算expression1 的值。如果它为真,将会执行expression2,并且整个表达式的值就是expression2 的值。expression3 不会执行。
如果expression1 为假,则执行expression3 并且条件表达式的值就是expression3的值。expression2 不会执行。条件表达式往往用作一条简单的if 语句的一种缩写形式。例如:
1. a = ( b > 0 ) ? c : d;
等价于:
1. if ( b > 0 )
2.
3. a = c;
4.
5. else
6.
7. a = d;

3 while
while 语句用来构成循环,如下所示:
1. while ( expression ) statement
当while 语句执行时,计算expression 的值,如果为真,则执行statement 并且再次计算条件。重复这一过程,直到表达式的值为假。此时,从while 后面的下一条语句开始继续执行。偶尔会见到这种结构:
1. while ( 1 )
2. {
3. ...
4. }
从while 的角度来看,这是一个无限循环。假设循环体内的内容是检查一个条件,并且当该条件满足的时候,跳出循环。

4 do-while
do-while 语句类似于while,区别在于,它的测试位于statement 之后,而不是在其之前:
1. do statement while ( expression );
其结果是,不管expression 的值是什么,statement 总是会执行一次。即便条件为假,循环体也至少要执行一次,然而,存在这种程序逻辑的情况并不常见。因此,do-while语句在实际中很少用到。

5 for
for 语句是最常用的循环结构。其形式如下:
1. for (expression1; expression2; expression3) statement
当执行一条for 语句时,会按照如下顺序进行:
1)在循环开始前,计算一次expression1。
2)计算expression2 的值。
3)如果expression2 为真,则执行statement;否则,循环结束,继续从循环后的下一条语句开始执行。
4)计算expression3。
5)重复步骤2、3、4 直到expression2 变为假。
计算expression1 和expression3 仅仅是为了其副作用。它们的值会丢弃。它们通常用来初始化和自增一个循环计数器变量:
1. int j;
2.
3. for ( j=0; j < 10; j++ )
4. {
5. // Something that needs doing 10 times
6. }
在for 结构中,任何表达式都可以省略(分号必须保留)。如果省略了expression2,则循环就是一个无限循环,类似于while( 1 ):
1. for ( i=0; ; i++ )
2. {
3. ...
4. // Check something and exit if the condition is met
5. }
注意 当使用循环来遍历一个数组的元素时,记住,数组的索引是从0 开始的,直到数组中元素的数目减1 为止:
1. int j;
2. int a[25];
3.
4. for (j=0; j < 25; j++ )
5. {
6. // Do something with a[j]
7. }
在前面的示例中,常见的错误是,把for 循环编写为for (j=1; j <= 25; j++)。


6 break

break 语句用来跳出一个循环或一条switch 语句。
1. int j;
2. for (j=0; j < 100; j++ )
3. {
4. ...
5.
6. if ( someConditionMet ) break;
//Execution continues after the loop
7. }
从while、do、for 或switch 语句末尾后面的下一条语句开始继续执行。当有嵌套循环时,break 只是从最内层的循环跳出。编写一条break 语句,而没有一个循环或switch 结构包围它,这将会导致一个编译器错误:
1. error: break statement not within loop or switch
1.5.7 continue
1.5.7 continue
continue 用于while、do 或for 循环的内部,用来取消当前循环迭代
的执行。例如:
1. int j;
2. for (j=0; j < 100; j++ )
3. {
4. ...
5.
6. if ( doneWithIteration ) continue; // Skip to
the next iteration
7. ...
8. }
当执行continue 语句时,控制传递给循环的下一次迭代。在while或do 循环中,控制表达式针对下一次迭代而计算。在for 循环中,计算迭代表达式(即第三个表达式),然后,计算控制表达式(即第二个表达式)。编写一条continue 语句,而没有一个循环包围它,这将会导致一个编译器错误。

8 逗号表达式
逗号表达式由逗号隔开的两个或多个表达式组成:
1. expression1, expression2, ..., expressionN
该表达式按照从左到右的顺序计算,并且,整个表达式的值就是最右侧的子表达式的值。
逗号运算符的首要用法就是,在一个for 循环中初始化和更新多个循环变量。在如下示例的循环迭代中,j 从0 到MAX-1,并且k 从MAX-1 到0:
1. for ( j=0, k=MAX-1; j < MAX; j++, k--)
2. {
3. // Do something
4. }
在一个for 循环中使用逗号表达式时,只有计算子表达式的副作用(在前面的例子中,就是初始化并自增或自减j 和k)是重要的。逗号表达式的值会被丢弃。

9 switch
switch 根据一个整数表达式的值来分支到不同的语句。switch 语句的形式如下所示:
1. switch ( integer_expression )
2. {
3. case value1:
4. statement
5. break;
6.
7. case value2:
8. statement
9. break;
10. ...
11.
12. default:
13. statement
14. break;
15. }
这里与C 的其他部分稍微有点不一致,每个case 可以有多条语句,而不需要一条复合语句。
value1, value2, ...必须是整数、字符常量或者计算为一个整数的常量表达式(换句话说,它们在编译时必须得到一个整数)。不允许具有相同的整数值的重复的case。
当执行一条switch 语句时,计算integer_expression,并且,switch 将结果与整数case 标签相比较。如果找到一个匹配,执行将跳到匹配的case 标签后面的语句。执行顺序进行,直到遇到一条break 语句或到达了switch 的末尾。break 语句会导致执行跳出到
switch 之后的第一条语句。
case 后面并不一定必须有一条break 语句。如果省略了break,则执行将跳入到后续的case。如果你看到已有的代码中省略了break,这可能是一个错误(这是很容易犯的错误),
也可能是有意的(如果程序员想要一个case 及其后续的case 都执行相同的代码会这样做)。
integer_expression 没有和任何case 标签匹配,如果有该标签的话,执行将跳到可选的default:标签后面的语句。如果没有匹配也没有default:,那么switch 什么也不做,它将从switch 后面的第一条语句开始继续执行。

10 goto
C 提供了一条goto 语句:
1. goto label;
执行goto 语句时,控制将会无条件地跳转到label 所标记的语句:
1. label: statement
标签不是可执行的语句,它们只是标记出代码中的一个位置。
命名标签的规则与命名变量和函数的规则相同。
标签总是以一个冒号结束。
滥用goto 语句,可能会导致杂乱的、令人混淆的代码(通常称之为面条式代码)。通常的标准建议是,尽量不要使用goto 语句。尽管如此,goto 语句在某些情况下还是有用的,例如,跳出嵌套的循环(break 语句只能够跳出最内层的循环):
1. for ( i=0; i < MAX_I; i++ )
2. for ( j=0; j < MAX_J; j++ )
3. {
4. ...
5. if ( finished ) goto moreStuff;
6. }
7.
8. moreStuff: statement // more statements
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值