文章目录
1.if语句
1.1if
语法:
if ( 表达式 )
语句
代码演示:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
代码执行流程图(if 语句执行流程 和 奇数判断):
1.2else
语法:
if ( 表达式 )
语句1
else
语句2
例如:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印数偶数
代码演示:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
1.3分支中包含多条语句
if 语句只能控制⼀条语句。
我们要 if 语句同时控制2条语句或多条语句时,就要用{ }将代码括起来,else 也可以跟上大括号。
代码演示:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
{
printf("成年了\n");
printf("可以交⼥朋友了\n");
}
else //else 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句
{
printf("未成年\n");
printf("不可以早恋哦\n");
}
return 0;
}
1.4嵌套if
在 if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。
代码演示1:
if(num == 0)
printf(“输⼊的数字是0\n”);
else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
printf(“输⼊的数字是正数\n”);
else
printf(“输⼊的数字是负数\n”);
后面标黄的代码时嵌套在第一个else 子句中,构成嵌套if 语句。
代码演示2:
if(num>0)
{
if(num%2 == 0)
printf(“偶数\n”);
else
printf(“奇数\n”);
}
else
{
printf(“输⼊的值是负数\n”);
}
标黄的代码是嵌套在if 语句中,构成嵌套语句。
以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断。
1.5悬空else 问题(注意)
如果有多个 if 和 else ,else 总是跟最接近的 if 匹配。
代码演示:
#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;
}
输出的结果是:啥都不输出。
为什么呢?
else 语句根最近的if 语句匹配,所以实际上代码是这样的:
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
a = 0不满足if 语句判断,则表达式为0,不输出。
如果我们要else 和第一个if 匹配,则如下:
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
{
printf("haha\n");
}
所以大家要注意括号使用。
2.关系操作符
⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称为“关系运算符”(relational operator)。
主要有下面6个:
• > ⼤于运算符
• < ⼩于运算符
• >= ⼤于等于运算符
• <= ⼩于等于运算符
• == 相等运算符
• != 不相等运算符)
关系表达式通常返回 0 或 1 ,表⽰真假。常⽤于 if 或 while 结构。
注意1:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符。
x == 3 写成 x = 3 。这个式⼦表⽰对变量 x 赋值 3 ,它的返回值为 3 ,所以 if 判断总是为真。
注意2:多个关系运算符不宜连⽤。
如:i<j<k
这是合法表达式,不会报错,但是通常出来不是我们要的结果。因为实际执行是这样的流程:(i<j)<k ,
(i<j)成立,则返回1,1和k比较
(i<j)不成立,则返回0,0和k比较。
所以我们真实想要判断 j 是否在i 和 k 之间,则如下:
i < j && j < k
&&表示并且的意思。
例子:我们输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年。
int main()
{
int age = 0;
scanf("%d", &age);
if (age>=18 && age<=36) //40
printf("青年\n");
else
printf("非青年\n");
return 0;
}
3.逻辑运算符&&,||,!
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
练习:闰年的判断
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则(2个都要成立):
- 能被4整除并且不能被100整除是闰年
- 能被400整除是闰年
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
printf("是闰年\n");
else
printf("不是闰年\n");
return 0;
}
注意:短路问题
逻辑运算符有个特点:它总是先对左侧的表达式求值,再对右边的表达式求值。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值(类似|| 或运算符,表达式只要有⼀个是真,整个表达式就是真)。这种情况称为“短路”。
4.switch语句
switch 语句是⼀种特殊形式的 if…else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀
注意:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整型常量表达式
4.1if 和switch对比
代码演示:输⼊任意⼀个整数值,计算除3之后的余数
if 语句
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 3 == 0)
{
printf("余数是0\n");
}
else if (num % 3 == 1)
{
printf("余数是1\n");
}
else
{
printf("余数是2\n");
}
return 0;
}
switch语句
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;
}
注意:
- case 和后边的数字之间必须有空格
- 每⼀个 case 语句中的代码执⾏完成后,只有加上 break ,才能跳出这个switch语句,当然,break 也不是每个 case 语句都得有。
代码练习演示:
- 输⼊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;
}
4.2switch中的default
举例直观看default用处:
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏default ⼦句。
所以我们在上个打印工作日练习中,可在switch语句中加上
default:
printf("输⼊错误\n");
break;
注意:在 switch 语句中 case 语句和 default 语句是没有顺序要求,default我们经常放在最后处理。
5.while循环
语法:
while(表达式)
语句;
//如果循环体想包含更多的语句,可以加上⼤括号
执行流程:
代码演示练习1.:打印1~10的值
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ",i);
i++;
}
return 0;
}
2.练习:输⼊⼀个正的整数,逆序打印这个整数的每⼀位
例如:
输⼊:1234,输出:4 3 2 1
输⼊:521,输出:1 2 5
int main()
{
int num = 0;
scanf("%d", &num);
while (num)
{
printf("%d ", num % 10);
num = num / 10;
}
}
思路:
1.⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4
2.找出倒数第⼆位,则使⽤ n=n/10 操作就可以先去掉最低位。
如:
n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第⼆位3。
3.循环1和2两个步骤,在n变成0之前,就能到所有的位。
6.for循环
语法:
for(表达式1;表达式2;表达式3)
语句;
表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整
执行流程:
while和for对比:
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形式上 for 循环要更优⼀些。
代码演示练习1:打印1~10
int main()
{
int i = 0;
for(i=1;i <= 10;i++)
{
printf("%d ",i);
}
return 0;
}
代码演示练习2:计算1~100之间3的倍数的数字之和
int main()
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i += 3)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
7.do-while循环
语法:
do
语句;
while(表达式);
执行流程:
代码演示练习1:打印1~10
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
练习2:输⼊⼀个正整数,计算这个整数是⼏位数?
例如:
输⼊:1234 输出:4
输⼊:12 输出:2
nt main()
{
int num = 0;
scanf("%d", &num);
int count = 0;
do
{
count++;
num = num / 10;
} while (num);
printf("%d\n", count);
return 0;
}
8.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 = i + 1;
}
return 0;
}
运行结果是1 2 3 4
当 i 等于5的时候,循环正 break 的地⽅终⽌,不再打印,不再循环。
while和continue 代码演示
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
//当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
printf("%d ", i);
i = i + 1;
}
return 0;
}
因为跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环。
for和break 代码演示:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
运行结果:1 2 3 4
break 的作⽤是永久的终⽌循环。
for和continue循环
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
//这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
运行结果:1 2 3 4 6 7 8 9 10
do while和break 代码演示:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
continue;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
9.循环的嵌套
代码演示练习:找出100~200之间的素数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
int i = 1;
//循环产⽣100~200的数字
for (i = 101; i <= 200; i = i + 2)
{
//判断i是否是素数
//使用2~i-1之间的数字去试除i
//如果i被整除了,i就不是素数
//如果2~i-1之间的没有数字可以整除i,i就是素数
int j = 0;
int flag = 1;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
10.goto语句
goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。
int main()
{
printf("hehe\n");
goto end;
printf("haha\n");
end:
printf("跳过haha的打印,直接来到这里\n");
return 0;
}
好处:在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//..
for 循环想提前退出得使⽤ break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套就得使⽤3个 break 才能跳出循环,所以在这种情况下我们使⽤ goto 语句就会更加的快捷。
若有不足地方,望各位指正,谢谢。