逻辑操作符
- 逻辑操作符:&&, ||, !
! :逻辑取反运算符(改变单个表达式的真假)。
&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。 - 下面是对于!的使用
#include <stdio.h>
int main()
{
int flag = 4;
if (flag)
printf("hehe\n");
return 0;
}
这里会打印hehe,因为flag是4,所以if (flag)代表的是1
#include <stdio.h>
int main()
{
int flag = 4;
if (!flag)
printf("hehe\n");
return 0;
}
这里就不会打印,因为if (!flag)为0;
3. 与运算符
4. 或运算符
下面是一个关于或的使用
int main()
{
int month = 0;
scanf("%d", &month);
//12 1 2 月是冬季
if (month == 12 || month == 1 || month == 2)
{
printf("冬季\n");
}
return 0;
}
- 小练习:输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
能被4整除并且不能被100整除是闰年
能被400整除是闰年
可以满足一个要求就可以了
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0))
{
printf("yes\n");
}
return 0;
}
6.短路
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
如代码:
if(month >= 3 && month <= 5)
表达式中&& 的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的结果是0的时候,及时不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。
对于 || 操作符是怎么样呢?
if(month == 12 || month==1 || month == 2)
如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。
所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值。
除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。
switch 语句是⼀种特殊形式的 if…else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀。
注意:switch 后的 expression 必须是整型表达式
case 后的值,必须是整形常量表达式
- 下面是if语句和switch语句的对⽐
练习:输⼊任意⼀个整数值,计算除3之后的余数
用if语句是
#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;
用switch语句时
#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;
}
写switch语句时注意
case后有一个空格,并且case以 : 结束
只可以int整形
注意break弹出要写
case要常量
switch语句要switch(n%3)判断时是准确的值即,而不是范围,才可用switch
9. 关于switch的举例
输⼊1-5,输出的是“⼯作⽇”; 输⼊6-7,输出 “休息日”
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
default:
printf("输入错误,请输入1~7的数字\n");
break;
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
这里许多case没有break是可以的,根据实际需求来的;
10. default是当case没有匹配到可以用到的,像上面那个代码输入8就是就是case匹配不到的情况,可以在最后case后面加一个default来说明输入的数不是1~8的情况
default也可以放在最前面
while语句
下面两个程序一个是for一个是while,区分两者的不同
int main()
{
for (1)
{
printf("hehe\n");
}
return 0;
}
这里最后输出的是hehe,只打印一次
int main()
{
while (1)
{
printf("hehe\n");
}
return 0;
}
这里最后是while的死循环
hehe
hehe
hehe
…
下面是while的循环流程
例子:输⼊⼀个正的整数,逆序打印这个整数的每⼀位
例如:
输⼊:1234,输出:4 3 2 1
输⼊:521,输出:1 2 5
分析:要满足逆序就是不断循环下面
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
while (n)
{
printf("%d",n%10);//这一步就是取余数即最后一个数
n = n / 10;
}
return 0;
}
for循环
- for(表达式1; 表达式2; 表达式3)
表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整
用for循环在屏幕上打印1~10的值
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
练习:计算1~100之间3的倍数的数字之和
int main()
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++)
{
//判断i是否是3的倍数
if (i % 3 == 0)
{
sum += i;
}
}
printf("sum = %d\n", sum);
return 0;
}
do while循环
do
语句;
while(表达式);
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳出循环;
⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
do while循环流程图
在屏幕上打印1~10的值
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i<=10);
return 0;
}
例子:输⼊⼀个正整数,计算这个整数是⼏位数?
例如:
输⼊:1234 输出:4
输⼊:12 输出:2
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
//1234
do
{
n = n / 10;
cnt++; //4 cnt =cnt+1; //cnt+=1;
} while (n);
printf("%d\n", cnt);
return 0;
}
break和continue
break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执⾏。
continue 的作⽤是跳过本次循环 continue 后边的代码,直接再从判断语句开始,在 for 循环和 while 循环中有所差异的。
下面是两者的区别
(while循环和break)
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i++;
}
break在i=5是直接跳出循环了,最后输出1,2,3,4
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
continue在i=5时直接有弹到判断语句while (i <= 10)了,然后一直重复,所以最后输出1,2,3,4然后进入死循环
for循环和break (与while没有差别)
for循环与continue
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
最后打印1,2,3,4,6,7,8,9,10,不打印5
因为相比于while循环,i++放到了前面了
do while循环与break和continue的关系与while与其的关系相似
C语言支持循环的嵌套
找出100~200之间的素数,并打印在屏幕上。
注:素数⼜称质数,只能被1和本⾝整除的数字。
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
//判断i是否是素数
//使用2~i-1之间的数字去试除i
//如果i被整除了,i就不是素数
//如果2~i-1之间的没有数字可以整除i,i就是素数
int j = 0;
int flag = 1;//假设i是素数
for (j = 2; j <= i-1; j++)
{
if (i % j == 0)
{
flag = 0;//如果有满足条件i % j == 0的i,那么输出flag=0,否则直到break弹出
break;
}
}
if (flag == 1)//flag==1代表的是素数
{
count++;
printf("%d ", i);
}
}
printf("\ncount = %d\n", count);
return 0;
}
go to语句
供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。
int main()
{
printf("hehe\n");
goto end;
printf("haha\n");
end:
printf("跳过haha的打印,直接来到这里\n");
return 0;
}
最终输出:hehe
跳过haha的打印,直接来到这里