流程控制
C 语言的程序是顺序执行,即先执行前面的语句,再执行后面的语句。对于C语言来说,一般来说,只有顺序、选择、循环三种执行方式。
if语句
if语句用于条件判断,满足条件时,就执行。
if (expression) statement
上面式子中,表达式expression为真(值不为0)时,就执行statement语句。
在C语言中,真的定义比较广泛,可以是1,可以是2,也可以是其他非零的正整数。
if后面的判断条件expression外面必须有圆括号,否则会报错。语句体部分statement可以是一个语句,也可以是放在大括号里面的复合语句。
在之前语句的博文中我们曾经学习过,有些循环语句后面只能跟随一条语句执行,在这里我们便认识了这种语句的运行方式。
下面是一个例子
if(x==1) printf("hehe");
上面示例中,当变量x为10时,就会输出hehe。对于只有一个语句的语句体,语句部分通常另起一行。
if(x==1)
printf("hehe");
这里注意代码的缩进,一个良好的缩进习惯会大大减少编程出错的可能行。
如果有多条语句,就需要把他们放在打括号里,使其变成一个代码块。例如
if (flag == 1)
{
count++;
printf("%d ", i);
}
这里笔者建议,只要是可用可不用大括号的语句,一律采用大括号形式,防止因粗心不注意产生的错误
if语句可以带有else分支,指定条件不成立时(表达式expression的值为0),所要执行的代码。
if(a>b)
{
printf("a>b");
}else{
printf("a<b);
}
如果else的语句部分多于一行,同样可以把它们放在大括号里面
else可以与另一个if语句连用,构成多重判断
if (num % 3 == 0)
{
printf("余数是0\n");
}
else if (num % 3 == 1)
{
printf("余数是1\n");
}
else
{
printf("余数是2\n");
}
如果有多个if和else,可以记住这样一条规则,else总是跟最接近的if匹配。
三元运算符 ?:
C 语言有一个三元表达式?:,可以用作if…else的简写形式
<expression1> ? <expression2> : <expression3>
这个操作符的含义是,表达式expression1如果为true(非0值),就执行expression2,否则执行expression3。
switch语句
switch 语句是一种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重的else if改成更易用、可读性更好的形式。
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
上面代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到对应的值,就执行default分支。
下面是一个例子;
int main()
{
int num = 0;
int n = 1;
scanf("%f", &num);
switch (num % 3)
{
case 0:
printf("余数是0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
上面示例中,根据变量 num%3 不同的值,会执行不同的case分支。如果等于0,执行case 0的部分;如果等于1,执行case 1的部分;否则,执行default的部分。default表示处理以上所有case都不匹配的情况。
每个case语句体的结尾,都应该有一个break语句,作用是跳出整个switch结构,不再往下执行。如果缺少break,就会导致继续执行下一个case或default分支。
case后面的语句体,不用放在大括号里面,这也是为什么需要break的原因。
default分支用来处理前面的 case 都不匹配的情况,最好放在所有 case 的后面,这样就不用写break语句。这个分支是可选的,如果没有该分支,遇到所有的 case 都不匹配的情况,就会直接跳出整个 switch 代码块。
switch判断条件的值一定!一定!一定!是个整数!
while 语句
while语句用于循环结构,满足条件时,不断执行循环体。
while (expression)
statement
上面代码中,如果表达式expression为非零值(表示真),就会执行statement语句,然后再次判断expression是否为零;如果expression为零(表示伪)就跳出循环,不再执行循环体。
如果循环体有多个语句,就需要使用大括号将这些语句组合在一起。
while (expression)
{
statement;
statement;
}
下面是一个例子
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
上面代码中,循环体会执行10次,每次将i增加1,直到等于10才退出循环。
只要条件为真,while会产生无限循环。下面是一种常见的无限循环的写法。
do…while
do…while结构是while的变体,它会先执行一次循环体,然后再判断是否满足条件。如果满足的话,就继续执行循环体,否则跳出循环。
可以简记为:先执行,后判断
上面代码中,不管条件expression是否成立,循环体statement至少会执行一次。每次statement执行完毕,就会判断一次expression,决定是否结束循环。
如果循环部分有多条语句,就需要放在大括号里面。
i = 10;
do {
printf("i is %d\n", i);
i++;
} while (i < 10);
printf("All done!\n");
上面例子中,变量i并不满足小于10的条件,但是循环体还是会执行一次。
for语句
for语句是最常用的循环结构,通常用于精确控制循环次数
for (initialization; continuation; action)
statement;
上面代码中,for语句的条件部分(即圆括号里面的部分)有三个表达式。
- initialization:初始化表达式,用于初始化循环变量,只执行一次。
- continuation:判断表达式,只要为true,就会不断执行循环体。
- action:循环变量处理表达式,每轮循环结束后执行,使得循环变量发生变化。
可以简记为:初始值,循环的条件 循环的变化
循环体部分的statement可以是一条语句,也可以是放在大括号里面的复合语句。
for的三个表达式都不是必需的,甚至可以全部省略,这会形成无限循环
break语句
break语句有两种用法。一种是与switch语句配套使用,用来中断某个分支的执行,这种用法前面已经介绍过了。另一种用法是在循环体内部跳出循环,不再进行后面的循环了。
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d, %d\n", i, j);
break;
}
}
break命令只能跳出循环体和switch结构,不能跳出if结构
continue 语句
continue语句用于在循环体内部终止本轮循环,进入下一轮循环。只要遇到continue语句,循环体内部后面的语句就不执行了,回到循环体的头部,开始执行下一轮循环。
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d, %d\n", i, j);
continue;
}
}