有时在程序中,需要将某一部分逻辑重复许多次(比如轮询、计数、监听),这时候就需要循环语句出场了。
C 中循环语句有三类: for 、 while 、 do...while 。
for循环
for 循环通常用于有限、循环次数已知的循环。
for循环用法
1 | for (init;condition;increment){ |
init 语句在循环开始前执行,用于循环初始化操作,一般用于初始化循环控制变量。在 C99 及更新的 ANSI C 标准下,可以在 init 语句中声明变量,其作用域在 for 循环内部(包括 condition 和 increment 语句)。
condition 为循环进行的条件,为真时会执行循环体,为假时则结束循环。在 init 语句结束后即执行 condition 判断。
increment 为一轮循环结束后的操作,在循环体结束后执行,一般用于迭代循环控制变量。
init、condition、increment均可为空,但是语句之间的分号必须保留。condition语句为真时会被视为常真。
init、condition、increment均只能使用单条语句而不能使用代码块。如果想使用多条语句可以使用括号表达式,在此处括号表达式的括号可以省略。
for后可以是单一语句或代码块,称为循环体。for括号后的第一个代码块或第一条语句会被for语句识别。当然,直接在for语句括号后加分号(即不跟随任何语句)也是可行的,即空循环体。
1 | int i = 0; |
for循环控制语句
在 for 循环内部,可以使用一些特殊的循环控制语句。
break,用于结束当前所在的循环。如果存在多层循环嵌套则只会结束当前层而不会影响外层。continue,用于立即结束当前轮循环并开始新一轮循环。
1 | int i = 0; |
while循环
相比 for 循环, while 循环通常用于循环次数未知的循环或无限循环。
while循环基本用法
1 | while (condition){ |
condition 为循环进行的条件,为真时会执行循环体,为假时则结束循环。在循环开始前会进行一次判断。
condition只能使用单条语句而不能使用代码块。如果想使用多条语句可以使用括号表达式,在此处括号表达式的括号可以省略。
while后可以是单一语句或代码块,称为循环体。while括号后的第一个代码块或第一条语句会被while语句识别。当然,直接在while语句括号后加分号(即不跟随任何语句)也是可行的,即空循环体。
1 | int i = 0; |
while循环控制语句
在 while 循环内部,可以使用一些特殊的循环控制语句: break 、 continue ,用法及作用同 for 。
1 | int i = 0; |
do…while循环
do...while 循环是 while 的孪生兄弟,基本用法基本一模一样。
do…while循环基本用法
1 | do { |
condition 为循环进行的条件,为真时会进入下一轮循环,为假时则结束循环。
condition只能使用单条语句而不能使用代码块。如果想使用多条语句可以使用括号表达式,在此处括号表达式的括号可以省略。
do后可以是单一语句或代码块,称为循环体。do括号后的第一个代码块或第一条语句会被do..while语句识别,而且do和while之前插入多条语句或代码块会导致编译器报错。do和while之前可以不包含任何语句或代码块(do后必须加分号),即空循环体。
1 | int i = 0; |
与
while不同,do...while会先执行一次循环体再进行判断,循环体会至少执行一次。while如果起始条件判断为假则不会执行循环体。
do…while循环控制语句
在 do...while 循环内部,可以使用一些特殊的循环控制语句: break 、 continue ,用法及作用同 for 。
1 | int i = 0; |
goto语句
和字面意思一样, goto 语句允许在程序逻辑内部到处跳。使用 goto 语句首先需要在程序内部打上标记,标记格式很简单: label:statement 。使用 goto label; 可以让程序直接跳转到 label 标记的语句。
1 |
|
goto 通常用来一次性跳出多层循环(对应的 break 语句只能跳出一层循环),也可以用来快速跳过或回溯代码逻辑。
写在最后
循环语句极大简化了程序中的重复逻辑,但是要注意循环控制的逻辑,避免死循环或无效循环。