分支
if语句
if
基本语法形式:
if(表达式)
语句;
表达式为真(非0)则执行语句,表达式为假(0)则语句不执行
例如:判断一个整数是否为奇数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if(num % 2 == 1)
printf("%d是奇数",num);
return 0;
}
else
上述问题改为判断一个整数的奇偶性,这时就需要 if...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);//添加else即可实现,
return 0;
}
分支中包含多条语句
一个if语句只能控制一条语句,如果想要控制多条语句,则需要“{}”将其括起来,else也可以用“{}”将语句括起来
#include <stdio.h>
int main
{
int age = 0;
scanf("%d\n",age);
if(age >= 18)
{ printf("成年了\n");
printf("可以开房了\n");
}
else
{
printf("未成年\n");
printf("不能开房嗷\n");
}
return 0;
}
如果没用{}括起来就会出现10岁未成年可以开房了的尴尬局面
嵌套if
例如:输入一个整数,判断输入的整数是正数还是非正数
这是两种写法,更推荐写法一,看着更加爽朗
#include <stdio.h>
int main
{
int age = 0;
scanf("%d",&age);
if(age < 18)
printf("少年\n");
else if(age <= 44)
printf("青年\n");
else if(age <= 59)
printf("中老年\n");
else if(age <= 90)
printf("老年");
else
printf("寿星");
return 0;
}
这是加上大括号的版本
悬空else
有多个if和else时,else总是和最近的if匹配
#include <stdio.h>
int main()
{
int a = 0;
int b = 3;
if(a==1)
if(b==3)
printf("1\n");
else
printf(“2\n");
return 0;
}
这段代码的运行结果是什么?答案是什么都不输出。
为什么?这是代码排版的问题,如果在vs编译器上这个else应该回合第二个if对齐,其实就是else与最近的if相匹配。现在分析,进入第一个if进行判断,成立之后才会有下面的内容,而此时已经不成立,所以直接出,执行结果,没有内容可以打印,程序运行结束,如果想要else和第一个if匹配,则需要{}
#include <stdio.h>
int main()
{
int a = 0;
int b = 3;
if(a==1)
{
if(b==3)
printf("1\n");
}
else
{
printf(“2\n");
}
return 0;
}
关系操作符
> >= < <= ==相等(要区别于“=”,这是赋值操作符) !=不相等
当变量和常量比较相等关系时,将变量写在等号右边
if(1 == x)
//如果不小心写成if(x = 1)编译器会报错,很容易发现错误
还有个需要避免的错误:多个关系操作符不宜连用
例如:
按照正常理解,hhh不应该打印,为什么呢?
其实编译器是执行下述表达式
(a < b) < c
由此我们引出逻辑操作符
逻辑操作符
!:逻辑取反操作符(改变单个表达式真假)
&& :并且(两侧表达式都为真,则为真,否则为假)
|| :或者(两侧至少有一个表达式为真,则为真,否则为假)
逻辑判断关系大家高中数学都有所学习,这里不过多赘述
条件操作符
又叫三目操作符,接受三个操作数,形式如下:
表达式1 ? 表达式2 : 表达式3
如果表达式1为真,则表达式2计算,表达式3不计算,表达式2是整个表达式的结果
如果表达式1为假,则表达式3计算,表达式2不计算,表达式3是整个表达式的结果
例如:使用条件操作符找两个数中的最大值
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
int max = (a > b ? a : b);
printf("%d\n",max);
return 0;
}
到这里,做个练习:输入年份year,判断是否为闰年
闰年判断规则:1 能被4整除且不能被100整除是闰年
2 能被400整除是闰年
分析:1 和 2是或者的关系用 || 1中是并且的关系用 &&
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
printf("%d是闰年",year);
else
printf("%d不是闰年", year);
return 0;
}
短路
C语言逻辑操作符总是先对左侧的表达式求值,再对右边表达式求值
如果左边表达式满足了逻辑操作符的条件,就不再对右边表达式求值了,此情况称为短路
短路求值:
a && b a == 0,整个式子已经为假,后边不再计算
a || b a为真,整个式子已经为真,后边不再计算
switch语句
基本语法形式
switch(整型表达式)
//注意:字符是以ASCII形式存储,ASCII码值是整型,则字符属于整型
{
case 常量表达式1: 语句组1; //case与后边数字必须要有空格
csae 常量表达式2: 语句组2 ;
case 常量表达式3: 语句组3 ;
//case只决定程序入口,每一个case语句执行完后,加上break才能跳出这个switch语句
}
看个例子:计算一个数除以2之后的余数
这个就是上述case只能决定入口,出口需要break
修改之后就没有问题了
default
对于switch后的整型表达式无法匹配case中的常量表达式时,需要在后面加default
在软件开发中,这个很重要,要提示用户输入正确的符合要求的数据,scanf后同理,只要有scanf,后面加一个检查对错很重要
default和case在switch语句中并没有顺序要求,一切根据需求出发
循环
while循环
基本语法形式:
while(表达式)
语句;
//和if语句形式相同,但while可实现循环效果
// if(表达式)
语句;
例如:打印1至10的数字
#include <stdio.h>
int main()
{
int i = 1;//初始化
while(i <= 10)//判断
{
printf("%d ",i);
i++;//调整
}
return 0;
}
for循环
基本语法形式:
for(表达式1; 表达式2; 表达式3)
//表达式1用于初始化变量
//表达式2用于循环结束条件的判断
//表达式3用于变量调整
例如:打印1至10的数字
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
printf("%d ", i);
}
return 0;
do while循环
基本语法形式:
do
语句;
while(表达式);
一上来先执行循环语句,所以循环体至少执行一次,再判断表达式是否为真
同样打印1到10的数字
#include <stdio.h>
int main()
{
int i = 1;
do
{ printf("%d ",i);
i++;
}
while(i <= 10);
return 0;
}
break和continue
break的作用是永久终止循环,跳出循环体,执行循环体外的语句
continue的作用是跳过本次循环continue后的代码
while中的break和continue
例如还是用上面的代码
#include <stdio.h>
int main()
{
int i = 1;//初始化
while(i <= 10)//判断
{ if(i == 4)
break;
printf("%d ",i);
i++;//调整
}
return 0;
}
//代码运行结果是123,当i等于5时,就执行break,跳出循环
对于continue
此时陷入了死循环,红色是光标在闪烁,continue跳过本次循环continue后的代码,回去继续判断,i没有操作还是等于4,由此陷入循环
for中的break和continue
同样用上面的代码
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 4)
break;
printf("%d ", i);
}
return 0;
}//代码运行结果123
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 4)
continue;
printf("%d ", i);
}
return 0;
}
因为continue后只有printf,所以只跳过4不打印
最后画个流程图做个总结