C语言是结构化的程序设计语言,这里的结构指顺序结构、选择结构、循环结构。
if语句
if语法形式
if(表达式)
语句;
表达式成立为真,则语句执行;表达式不成立为假,则语句不执行。
重点!
在从C语言中,0为假,非0为真。
#include<stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num%2==1)
printf("%d是奇数", num);
return 0;
}
else语法形式
if(表达式 )
语句1
else
语句2
示例如下所示:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("%d是奇数", num);
else
printf("%d是偶数", num);
return 0;
}
分支中包含多条语句
默认情况下,if和else的后边只能跟一条语句。
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age>=18)
printf("成年了\n");
printf("可以谈恋爱了\n");
return 0;
}
无论输入数据是否大于等于18,“可以恋爱了”都会打印在屏幕上。
if只能控制一条语句,即printf(“成年了\n”);
if语句若为真,则打印“成年了”。
if语句若为假,则不打印“成年了”。
printf(“可以谈恋爱了\n”); 该语句是独立存在的,无论if为真或假,该语句都会被执行。
***解决方案:***若需要if语句同时控制两条语句,可以借助大括号({ }),else同理。
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age>=18)
{
printf("成年了\n");
printf("可以谈恋爱了\n");
}
else
{
printf("未成年\n");
printf("不可以早恋哦\n");
}
return 0;
}
嵌套if
在if else 语句中,else可以与另一个if语句连用,构成多重判断。
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if(num==0)
printf("输入数字是0\n");
else if(num>0)
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
return 0 ;
}
悬空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;
}
#include<stdio.h>
int main()
{
int a=0;
int b=2;
if(a==1)
{ if(b==2)
printf("hehe\n");
else
printf("haha\n");
}
//else与第二个if进行匹配
return 0;
}
如果希望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;
}
带上适当的大括号,代码逻辑会更加清晰。
switch语句
switch语句是一种特殊形式的“if ……else……”结构,用于判断条件有多个结果的情况。
switch语法形式
switch(expression)
{
case value 1 : statement
case value 2 : statement
default : statement
}
依据表达式expression的不同值,执行相应的case语句。
若找不到对应的值,就执行default语句。
注意!!!
switch语句后的expression必须为整型表达式
case后面的值必须为整型常量表达式
题目:输入任意一个整数值,计算除以3后的余数。
//if语句
#include<stdio.h>
int mainI()
{
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 mainI()
{
int n = 0;
scanf("%d",&n);
switch(n%3==0)
{
case 0:
printf("整除,余数是0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
注意!!!
case和后面的数字之间必须有空格
每一个case语句的代码执行后,需要添加break,才可跳出switch语句
switch语句中的break
若上述switch语句中的break去除,出现什么情况?
//switch语句
#include<stdio.h>
int mainI()
{
int n = 0;
scanf("%d",&n);
switch(n%3==0)
{
case 0:
printf("整除,余数是0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
> 结果:
> 7
> 余数是1
> 余数是2
7除以3余数应该为1,但是实际输出结果多出一行“余数是2”
???
原因:
switch语句具有分支效果,只有在switch语句中继续使用break才可跳出switch语句。
若某一case语句后无break终止,代码会继续向下执行,直至遇见break语句或switch语句结束。
题目:输入一个数字(1~7),打印对应星期几
#include<stdio.h>
{
int main()
int day =0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
break语句不是每一个case语句中都要有的,依据实际情况判断。
上述题目出现变化,1至5输出工作日,6至7输出休息日。
#include<stdio.h>
{
int main()
int day =0;
scanf("%d",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
switch语句中的default
在使用switch语句时,可能会出现switch后面的表达式中的值无法匹配代码中的case语句的情况,这时需要引入default语句。
switch(expression)
{
case value 1 : statement
case value 2 : statement
default : statement
}
//若switch后面的expression结果既不是value 1,也不是value 2,就会执行default子句
示例如下所示:输入一个数字(1~7),打印对应星期几。(若输入数字超过范围限制,则提示“输入错误”)
> #include<stdio.h>
{
int main()
int day =0;
scanf("%d",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
提示:在switch语句中,case语句和default语句是没有顺序要求的,符合实际问题的需求即可。通常情况下,将default子句放于句尾处理。
while循环语句
while语法形式
while(表达式)
语句;
//若循环体想包含更多语句,可以添加大括号
if与while的代码对比
//代码
#include<stdio.h>
int main()
{
if(1)
printf("hehe\n");
return 0;
}
//代码2
#include<stdio.h>
int main()
{
while(1)
printf("hehe\n");
//若while后边的条件满足,死循环打印hehe
return 0;
}
while与if的最大区别:循环与否
for循环语句
for语法形式
for(表达式1;表达式2;表达式3)
语句;
//若循环体想包含更多语句,可以添加大括号
表达式1:用于循环变量的初始化
表达式2:用于循环结束条件的判断
表达式3:用于循环变量的调整
while循环和for循环的对比
for和while在实现循环过程中,均含有初始化、判断、调整三个部分,但for循环相对集中。
do-while循环语句
do-while语法形式
do
语句;
while(表达式);
示例如下所示:
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d",i);
i=i+1;
}
while(i<=10);
return 0;
}
break语句和continue语句
在循环执行的过程中,若出现某些情况,需要提前终止循环,可以使用break和continue两个关键字。
break:用于永久终止循环(只要break被执行,直接就会跳出循环,继续往后执行)
continue:跳过本次循环continue后面的代码
while循环中的break和continue
#inlcued<stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(1==5)
break;//当i等于5后,就会执行break语句,循环终止
printf("%d",i);
i=i+1;
}
return 0;
}
//打印1 2 3 4
#inlcued<stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(1==5)
continue;
//当i等于5后,执行continue语句,直接跳出continue循环,去循环判断的地方
//由于跳出i=i+1,所以i一直等于5,程序陷入死循环
printf("%d",i);
i=i+1;
}
return 0;
}
for循环中的break和continue
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<=10;i++)
{
if(i==5)
break;
printf("%d",i);
}
return 0;
}
//打印1 2 3 4
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<=10;i++)
{
if(i==5)
continue;//continue跳过后面打印,转至i++调整部分
printf("%d",i);
}
return 0;
}
//打印1 2 3 4 5 6 7 8 9 10
do-while循环中的break和continue
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
while(i<=10);
return 0;
}
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(i == 5)
break;
printf("%d ", i);
i = i + 1;
}
while(i<=10);
return 0;
}
goto语句
goto语句可以实现在同一个函数内跳转到设置好的标号处。
示例如下所示:
#include<stdio.h>
int mian()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
注意!!!
若goto语句使用不当,会在函数内部随意跳转,打乱程序执行流程。
在多层循环的代码中,使用goto语句可以快速跳出。
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//...
for语句若想要提前退出须使用break,一个break可以跳出一层for循环,多层for语句使用goto语句更为快捷。
如有错误,请指正批评!