一、逻辑操作符:&& , || , !
C语言中的逻辑操作符包括:
-
&&
逻辑与操作符:用于判断两个条件是否同时成立,如果两个条件都为真,返回真,否则返回假。 -
||
逻辑或操作符:用于判断两个条件是否存在一个为真,如果其中一个条件为真,返回真,否则返回假。 -
!
逻辑非操作符:用于将一个条件取反,如果条件为真,返回假,反之亦然。
这些逻辑操作符通常用于条件语句和循环语句中,可以帮助我们进行复杂的逻辑判断和控制程序流程。
练习:闰年的判断
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
- 能被4整除并且不能被100整除是闰年
- 能被400整除是闰年
#include <stdio.h>
//代码1
int main()
{
int year = 0;
scanf("%d", &year);
if(year%4==0 && year%100!=0)
printf("是闰年\n");
else if(year%400==0)
printf("是闰年\n");
return 0;
}
//代码2
int main()
{
int year = 0;
scanf("%d", &year);
if((year%4==0 && year%100!=0) || (year%400==0))
printf("是闰年\n");
return 0;
}
短路
C语言中的短路求值(Short-circuit evaluation)是指在逻辑表达式中,当第一个操作数已经可以确定整个表达式的值时,就不再对后面的操作数进行求值的过程。
例如,在一个if语句中,如果第一个条件为假,则不会再对后面的条件进行求值,因为无论后面是什么结果都不会影响整个if语句的结果。
C语言中的逻辑与(&&
)和逻辑或(||
)操作符都支持短路求值。当使用逻辑与操作符时,如果第一个操作数为假,则整个表达式为假,不再对后面的操作数进行求值;当使用逻辑或操作符时,如果第一个操作数为真,则整个表达式为真,不再对后面的操作数进行求值。
短路求值可以提高程序的效率和执行速度,同时也可以使程序更加简洁和易读。但是,在某些情况下,过度依赖短路求值可能会导致代码的理解和维护变得困难。因此,在编写代码时,需要根据具体情况灵活使用短路求值。
二、switch语句
C语言的 switch
语句是一种多分支的选择结构,它的作用是根据一个表达式的值,在若干个常量表达式中选择一个执行相应的语句。
switch 语句的基本语法如下:
switch(expression){
case constant1:
statement1;
break;
case constant2:
statement2;
break;
...
default:
statementN;
}
其中,expression 是要进行比较的表达式,constant1, constant2, … 是若干个常量表达式,用来与 expression 进行比较,如果匹配则执行相应的语句 (statement1, statement2, …)。如果所有的常量表达式都不匹配,则执行 default 后面的语句 (statementN)。
注意,每个 case
后面都要加上 break
语句,否则程序会继续执行下去,直到遇到 break
或 switch
语句结束为止。default
语句是可选的,但是通常建议加上,以处理未匹配的情况。在 switch
语句中 case
语句和 default
语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。不过我们通常是把 default
语句放在最后处理的。
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式
下面是一个简单的 switch 语句示例:
#include <stdio.h>
int main() {
int day = 3;
switch (day) {
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
printf("Saturday\n");
break;
case 7:
printf("Sunday\n");
break;
default:
printf("Invalid day\n");
break;
}
return 0;
}
输出结果为:
Wednesday
在上面的程序中,我们定义了一个变量 day 的值为 3,然后使用 switch 语句匹配该值,输出相应的星期几。由于 day 的值为 3,所以匹配了 case 3,输出了 Wednesday。
三、while循环
C语言中的while
循环是一个重复执行某个代码块的控制流结构。它的语法如下:
while (condition) {
// code block to be executed
}
在这个语法中,condition(条件)是一个布尔表达式或者可以被强制转换为布尔值的表达式。只要条件为真,code block(代码块)就会被重复执行。
while循环的工作流程如下:
- 检查条件,如果条件为false,跳出循环,继续执行下一条语句;
- 如果条件为true,执行循环中的代码块;
- 执行完毕后再次检查条件,如果条件为true,跳回步骤2。
需要注意的是,如果条件一直为true,那么while循环将一直循环下去,直到程序被强制结束或者出现其他跳出循环的语句(如break或return)。
下面是一个简单的while循环的示例,它会输出数字1到5:
#include <stdio.h>
int main() {
int i = 1;
while (i <= 5) {
printf("%d ", i);
i++;
}
return 0;
}
输出结果为:
1 2 3 4 5
四、for循环
C语言中的for
循环是一个常用的循环控制结构,它可以方便地进行循环计数,并且通常能够比while
循环更简洁地实现特定的循环需求。
for循环的语法如下:
for (表达式1;表达式2;表达式3) {
// code block to be executed
}
表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整
for循环的工作流程如下:
- 初始化计数器变量;
- 检查条件,如果为false,跳出循环,继续执行下一条语句;
- 如果条件为true,执行循环中的代码块;
- 执行完毕后执行计数器递增或递减的表达式;
- 再次检查条件,如果为true,跳回步骤3。
在for
循环中,可以省略任何一个或所有三个语句,但是分号必须保留。如果省略了条件,循环将一直进行下去,直到程序出现了break
、goto
、return
或异常等跳出循环的语句。
练习:在屏幕上打印1~10的值
参考代码:
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
五、do-while循环
C语言中的do-while
循环是一种基于条件的循环语句,它先执行循环体中的代码块,然后再进行条件判断,根据条件是否成立来决定是否再次执行循环操作。无论条件是否成立,do-while循环中的代码块至少会执行一次。
do-while
循环的语法格式如下:
do {
//循环体代码
} while (循环条件);
其中,循环条件是一个表达式,当其值为true(非零)时,继续执行循环体中的代码。如果循环条件为false(0),则跳出循环。与其他循环语句一样,do-while循环中的循环体代码可以是一个语句块(由一对大括号包围的多条语句)。
下面是一个do-while循环的示例代码:
#include <stdio.h>
int main() {
int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 5);
return 0;
}
以上代码中,循环体中的代码会被执行5次,因为循环条件为i < 5,只要i小于5时,就一直执行循环体中的代码,当i等于5时,循环结束。
六、break和continue语句
C语言中的break
和continue
语句常用于控制循环的流程。它们可以用在for
、while
、do-while
等循环控制语句中。
break语句
break
语句用于在循环执行过程中跳出该循环,它可以用于for
、while
、do-while
等循环结构。当break语句被执行时,程序会跳出当前循环,继续执行循环外的下一条语句。
示例代码:
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 10; i++) {
if (i == 5) {
break;
}
printf("%d\n", i);
}
return 0;
}
输出结果为:
0
1
2
3
4
当i等于5时,break
语句被执行,循环中断,因此只输出了0到4。
continue语句
continue
语句用于跳过循环中的某个迭代,继续执行下一次迭代,它同样可以用于for
、while
、do-while
等循环结构。continue
可以帮助我们跳过某⼀次循环 continue 后边的代码,直接到循环的判断部分,进行下⼀次循环的判断。
示例代码:
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 10; i++) {
if (i == 5) {
continue;
}
printf("%d\n", i);
}
return 0;
}
输出结果为:
0
1
2
3
4
6
7
8
9
当i等于5时,continue语句被执行,该次循环被跳过,因此不输出5,而是直接继续执行下一次循环输出6到9。
七、循环的嵌套
练习
找出100~200之间的素数,并打印在屏幕上。
注:素数又称质数,只能被1和本身整除的数字。
题目解析:
- 要从100 ~ 200之间找出素数,首先得有100~200之间的数,这⾥可以使用循环解决。
- 假设要判断i是否为素数,需要拿2 ~ i-1之间的数字去试除i,需要生成2~i-1之间的数字,也可以使用循环解决。
- 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。
参考代码:
#include <stdio.h>
int main()
{
int i = 0;
//循环产⽣100~200的数字
for(i=100; i<=200; i++)
{
//判断i是否为素数
//循环产⽣2~i-1之间的数字
int j = 0;
int flag = 1;//假设i是素数
for(j=2; j<i; j++)
{
if(i % j == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
printf("%d ", i);
}
return 0;
}
八、goto语句
在 C 语言中,可以使用 goto 语句跳转到程序中的其他位置。具体语法如下:
goto label;
// ...
label: statement;
其中,label 是一个用户定义的标签,statement 是要执行的语句。当程序执行到 goto 语句时,会跳转到 label 标记的位置执行 statement 语句,然后继续执行后面的语句。
使用 goto 语句可以跳出多重嵌套的循环或者在程序中实现类似 switch 语句的功能。但是,过度使用 goto 语句可能会使程序难以理解和维护,应该尽量避免滥用。