c语言有三大控制结构 顺序结构、选择(分支)结构、循环结构
分支结构语句:
ifif~else
if~else if
switch
if 语句 (三种基本类型)
if (表达式) { 语句 }
作用:当表达式的值为真(非0),就执行语句
“表达式”:任意的C语言合法的表达式都可以
“语句”:
单语句:只有一条语句
复合语句:用 {} 把多条语句括起来eg: int a = 200, b = 100; if (a < b) { // 出现的括号一定要成双成对 a = 250; // 代码缩进 一般缩进大小(四个空格)是一个 tab printf("%a\n", a); }
编程建议:不管if后面是单语句,还是复合语句,请先写 {},再到里面补充语句
具有良好编程风格
if (表达式) { 语句1 } else { 语句2 }
作用:当表达式的值为真(非0)时,就执行语句1,否则就执行语句2
“表达式”:任意合法的C语言表达式都可以
“语句”:
单语句:只有一条语句
复合语句:用 {} 把多条语句括起来
if (表达式1) { 语句1 } else if (表达式2) { 语句2 } else if (表达式n) { 语句n } ...... else { 语句n+1 }
if~else if:用来把整个的条件域分多个连续的区间讨论
if语句的嵌套:“条件里面分条件”
if () { if () { 语句 } else { 语句 } } else { if () { 语句 } else { 语句 } if () { 语句 if () { 语句 } else { 语句 } } else { if () { 语句 } else { 语句 } }
else匹配问题:
else 总是与它上面的最近的、未匹配(同级)的if语句匹配
switch语句(开关语句)
形式:
switch (表达式) { case 常量表达式1: 语句1 case 常量表达式2: 语句2 break; ... case 常量表达式n: 语句n default: 语句m }
(1) ”表达式“的值必须为整数值(整型、字符型、枚举、有确定值的变量及表达式),即可以列 举的值
(2) ”常量表达式“的值也必须为整数值(只能是常量或常量表达式,不能是有确定值的变量 及表达式),且每个 case 后面的常量表达式的值必须不相同
(3) 判断顺序是上到下,当某个case后面的常量表达式的值与switch的表达式的值
相同时,就会开打”开关“,会执行冒号后面的语句,直到有break语句就会提前
结束switch语句,否则就会轮到下一个case,且不会比较常量表达式的值就直
接执行冒号后面的语句,直到所有语句执行完毕
(4) break 语句用来提前跳出switch语句。常用的用法时每个case后面都会有一个break
(5) 当所有的case后面的常量表达式都不匹配,这时就会执行default后面的语句,且也会打 开”开关“
C语言循环种类:
while
do~while
for
goto语句与if语句构成循环
goto语句:无条件跳转语句
goto 语句标号;
"语句标号":在C语言中,把以无符号与某一行的地址相关联
格式为在某一行的开始处定义一个符号,然后再加上一个冒号eg:
loop:
n++;
goto loop;eg:
goto loop; // 跳过中间部分
n++; loop:
作用:
(1)与if语句向上跳转构成循环结构,但是我们不要用goto来实现循环
(2)向后跳转可以跳出多重循环结构,linux内核驱动源码用goto跳转
硬件的反初始化是很常用的用法(3)如果在goto语句跳过的这个代码段中存在变量定义的话,不影响后续对于相应变 量的使用。主要影响的是跳过的这段代码中如果有对于相关变量初始化的一个 操作,那么这个初始化操作它是不生效的
注意:goto是无条件跳转语句,导致程序的可读性变差,要慎重使用goto
goto语句模拟if~else
#include <stdio.h> int main(int argc, char *argv[]) { int n; scanf("%d", &n); n % 2 == 0 && ({goto if_stmt; 1;}); //():把{}变成一个具有返回值的表达式,返回值是{}中最后一个表达式的值,{}把多条语句合并成一个复合语句 !(n % 2 == 0) && ({goto else_stmt; 1;}); if_stmt: printf("%d是偶数\n", n); goto if_end; else_stmt: printf("%d是奇数\n", n); if_end: return 0; }
goto语句模拟while
#include <stdio.h> int main(int argc, char *argv[]) { int n, i = 1; scanf("%d", &n); judge: if (i < n) { goto stmt; } else { goto while_end; } stmt: printf("%d ", i); i++; goto judge; while_end: printf("\n"); return 0; }
goto语句模拟for
#include <stdio.h> int main(int argc, char *argv[]) { int n, i; scanf("%d", &n); for_1: i = 1; goto for_2; for_2: if (i <= n) { goto for_4; } else { goto for_end; } for_3: i++; goto for_2; for_4: if (i % 3 == 0) { goto for_3; } printf("%d ", i); goto for_3; for_end: printf("\n"); return 0; }
while
while (表达式) {
语句}
作用:当表达式的值为真(非0),就执行”语句“,否则就结束while循环体
当进入循环体执行完”语句“后,再重复判断表达式的值...”表达式“:所有合法的表达式都可以
”语句“:
单语句
复合语句编写建议:不管while后面有没有语句,请先写 {},再到里面补充语句
do~while
do {
语句} while (表达式);
作用:先无条件执行一次语句,再判断表达式的值,如果表达式的值为真(非0),
就再执行循环体语句,...直到表达式的值为假(0),那么就结束循环。
"表达式":所有合法的表达式都可以
"语句":
单语句
复合语句
do~while语句的意义:just do it!
编程建议:不管do后面没有语句,请先写 {},再到里面补充语句
for
for (表达式1; 表达式2; 表达式3) {
语句}
⭐执行流程:首次进入for循环体先无条件执行一次表达式1,再判断表达式2
的值,若为真,就执行循环语句,最后执行表达式3,一个循环结束。
从第二次循环起就不再执行表达式1了,直接判断表达式2的值的真假,
若为真,就继续循环,若为假,就结束for循环"语句":
单语句
复合语句for循环体完全等效于如下的while循环体:
表达式1;
while (表达式2) {
语句
表达式3;
}
唯一的区别是for循环体中的表达式123都可以为空(表达式2为空,意思判断条件为真),
但是while里的表达式2不能为空⭐while循环和for循环的区别:一般来说,while更注重循环条件,for更注重循环次数
当然啦,它俩是可以相互替换
break语句
(1) 用于switch语句中,用于跳出switch语句
(2) 用于循环体中(while/do~while/for),用于跳出它所属的循环
continue语句
continue语句只能用于循环体中(while/do~while/for),用来提前结束本次循环,进入下次循环
注意:for循环中使用continue在提前进入下次循环前,会执行表达式3!
补充
for ( ; y>0; y--) ; y先--再代入判断
while(y--) ; 先把y代入判断再--