目录
9.3 do while循环中的break和continue
1. if语句
语法结构1:
if (表达式)
语句;
语法结构2:
if (表达式)
语句1;
else
语句2;
语法结构3:多条语句要带{ }
if (表达式)
{
语句1;
语句2;
语句n;
}
else
{
语句1;
语句2;
语句n;
}
语法结构4:嵌套if
if (表达式)
{
语句1;
语句2;
语句n;
}
else if(表达式)
{
语句1;
语句2;
语句n;
}
else if(表达式)
{
语句1;
语句2;
语句n;
}
else
{
语句1;
语句2;
语句n;
}
1.1悬空else问题
实例:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
结果:
原因在于:
如果有多个 if 和 else,else 总是跟最接近 的 if 匹配。 上⾯的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if 语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if 进⾏匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不 成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。 我们可以看到vs2019自动排版成比较容易理解的方式了。
更容易理解的方式是:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
2.关系操作符:
关系运算符:
> ⼤于运算符
< ⼩于运算符
>= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符
!= 不相等运算符
关系表达式通常返回 0 或 1 ,表⽰真假。
C 语⾔中, 0 表⽰假,所有⾮零值表⽰真。
多个关系运算符不宜连用
例:
i < j < k
因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
(i < j) < k
上⾯式⼦中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进⾏⽐较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使⽤下⾯的写法:
i < j && j < k
3.条件操作符(三目操作符)
表达式1 ? 表达式2 : 表达式3
如果 表达式1 为真,表达式2 计算,计算的结果是整个表达式的结果;如果 表达式1 为假, 表达式3 计算,计算的结果是整个表达式的结果。
4.逻辑操作符
!:逻辑取反运算符
&& :与运算符,并且的意思,两边都为真为真,否则为假
|| :或运算符,或者的意思,至少有一个为真才为真,否则为假
5.短路
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值。
6.switch语句
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值, 就执⾏ default 分⽀。
注意:
- switch 后的 expression 必须是整型表达式
- case 后的值,必须是整形常量表达式
if语句和switch语句的对⽐:
输⼊任意⼀个整数值,计算除3之后的余数
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 3 == 0)
printf("整除,余数为0\n");
else if (n % 3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
注意:
- case 和后边的数字之间必须有空格
- 每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。
如果没有 break 代码会继续玩下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。
7.for 循环
for(表达式1;表达式2;表达式3)
语句;//如果循环体要包含更多的语句,加上大括号
表达式1:⽤于循环变量的初始化
表达式2:⽤于循环结束条件的判断
表达式3:⽤于循环变量的调整
for循环的执行流程图
8.while 循环
while(表达式)
语句;//如果循环体想包含更多语句,加上大括号即可
语法结构与if语句非常相似,不同之处是while语句是可以实现循环效果的。
while语句的执行流程图
⾸先上来就是执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语 句,语句执⾏完后再继续判断,是否进⾏下⼀次判断。
对比while循环和for循环
例:打印1~100
#include<stdio.h>
int main()
{
for(int i = 1; i <= 100; i++)
{
printf("%d ", i);
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 1;//初始化
while (i <= 100)//判断
{
printf("%d ",i);
i = i+1;//调整
}
return 0;
}
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部 分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形 式上 for 循环要更优⼀些。
9.do while 循环
do
语句;
while(表达式);
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳 出循环;⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
} while (i <= 100);
return 0;
}
9.break和continue语句
在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中 提供了 break 和 continue 两个关键字,就是应该到循环中的。
- break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执 ⾏。
- continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所 差异的。
9.1 while循环中的break和continue
9.1.1 break举例
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
if (i == 6)
break;
printf("%d ", i);
i = i + 1;
}
return 0;
}
当i等于6的时候,循环到 break 的地⽅终⽌,不再打印,不再循环。 所以 break 的作⽤就是永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了。
9.1.2continue举例
continue 是继续的意思,在循环中的作⽤就是跳过本次循环中 continue 后边的代码,继续进⾏ 下⼀次循环的判断。
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
if (i == 6)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}
当i=5后,执行continue,直接跳过continue的代码,去循环的判断地方,由于跳过了i=i+1,所以i一直是5,程序陷入死循环。
continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成 死循环。
9.2 for循环中的break和continue
9.2.1 break举例
#include<stdio.h>
int main()
{
for (int i = 1; i <= 100; i++)
{
if (i == 6)
break;
printf("%d ", i);
}
return 0;
}
break 的作⽤是永久的终⽌循环,未来我们在某个条件发⽣的时候,不想再继续循环的时候,就可以 使⽤ break 来完成。
9.2.2 continue举例
#include<stdio.h>
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 6)
continue;
printf("%d ", i);
}
return 0;
}
所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。
9.3 do while循环中的break和continue
9.3.1 break举例
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 6)
break;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
9.3.2 continue举例
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 6)
continue;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
10.goto语句
C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数 内跳转到设置好的标号处。
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next:
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建 议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出 使⽤ goto 就⾮常的⽅便了。
for (...)
{
for (...)
{
for (...)
{
if (disaster)
goto error;
}
}
}
error:
//...
本来 for 循环想提前退出得使⽤ break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套 就得使⽤3个 break 才能跳出循环,所以在这种情况下我们使⽤ goto 语句就会更加的快捷。