C语言分支和循环(上)

前言

C语言是结构化的程序设计语言,这里的结构是指:

  1. 顺序结构:是指按照程序中语句书写的顺序从上到下一条一条依次执行。
  2. 选择结构:是根据条件判断的结果,从两种或多种路径中选择其中的一条执行。
  3. 循环结构:是将一组操作重复执行多次,只要条件成立就重复执行这组操作。

我们可以使用ifswitch实现选择结构,使用forwhiledo while实现循环结构。 

条件判断表达式

1.关系表达式

  • 关系运算符

关系运算符有 <、<=、>、>=、==、!=,分别称为小于、小于或等于、大于、大于或等于、等于、不等于。

优先级别:前4种关系运算符的优先级别都是第6级;后2种都是第7级。关系运算符的优先级别低于算术运算符,高于赋值运算符。

结合方向:均为左结合。

c>a+b等价于c>(a+b),关系运算符的优先级低于算数运算符。
  • 关系表达式及值

 用关系运算符将两个表达式连接起来所构成的表达式,称为关系表达式。关系表达式的值有两个,当关系表达式成立时,其值为1,不成立时,其值为0。

假如a=3,b=2,c=1,则关系表达式a>b的值为1

另外,当两个字符进行比较时,是将这两个字符型数据按ASCII值进行比较 。

char ch1='A',ch2='a';则表达式ch1>ch2结果为0

2.逻辑表达式

  • 逻辑运算符

逻辑运算符有&&、||、!,分别称为逻辑与、逻辑或、逻辑非。

优先级别:逻辑非是第2级,高于算数运算;逻辑与是第11级,逻辑或是第12级,二者都低于关系运算,高于赋值运算。

结合方向:!为右结合,&&与||为左结合

运算规则

逻辑运算真值表
ABA&&BA||B!A
00001
0非0011
非00010
非0非0110

 

  •  逻辑表达式

与表达式计算过程: 对于与表达式,先计算与运算符&&左端的表达式,当左端的表达式的值为0时,不再计算右端的表达式(此时说明与表达式的值一定为0);当左端的表达式为非0时,再计算右端的表达式。

int a=1,b=2;
--a&&(b=a+3);
printf("a=%d,b=%d\n",a,b);

先计算左端得a--=0,此时不再计算右端,所以a=0,b=2(不变),而不是a=0,b=3。 

或表达式计算过程: 对于或表达式,先计算或运算符||左端的表达式,当左端的表达式的值为非0时,不再计算右端的表达式(此时说明或表达式的值一定为1);当左端的表达式的值为0时,再计算右端的表达式。

int i=-1,j,k;
j=k=2;
++i||j++||++k;
printf("i=%d,j=%d,k=%d\n",i,j,k);

先计算++i的值为0(i为0),再计算j++的值为2(j为3) ,得表达式++i||j++的值为1,所以不再计算++k(k为2),所以i=0,j=3,k=2。

非表达式的计算:如果A的值非0,!A的值为0;如果A的值为0,!A的值为1。 

 

3.用C语言表达实际问题

 练习:闰年的判断
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
1. 能被4整除并且不能被100整除是闰年
2. 能被400整除是闰年

#include <stdio.h>
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;
}

年份year是闰年的C语言表达式为:

  • (year%4==0&&year%100!=0)||year%400==0
  • !(year%4)&&year%100||!(year%400) 

一、选择结构

if选择结构

1.不平衡if结构

  • 格式
if(表达式)
{
  语句
}

其中的表达式可以是任意表达式,语句可以是复合语句,整个结构是一条语句。

表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。

在C语⾔中,0为假,⾮0表示真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。 

  • 输⼊⼀个整数,判断是否为奇数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}

2.if···else语句

  • 格式
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;
}

else必须与if配对使用,不能单独使用(else与其之前最近的未配对的if配对)。

条件表达式

 在C语言中,if···else语句可以用条件表达式来表示,

条件运算符:“?:”是C语言所特有的运算,且是唯一的三目运算符。

优先级别:第13级,高于赋值运算,低于逻辑运算。

结合方向:右结合。

条件表达式的一般形式:表达式1?表达式2:表达式3

运算过程:先计算表达式1,若表达式1的值非0,则计算表达式2,不再计算表达式3,此时表达式2的值为整个条件表达式的值;若表达式1的值为0,不计算表达式2,而计算表达式3,此时表达式3的值为整个表达式的值。

if(a>b)
  max=a;
else
  max=b;
可以写成条件表达式max=(a>b)?a:b;

 

3.if···else if语句

格式

if(表达式1)
{
  语句1;
}
else if(表达式2)
{
  语句2;
}
···
else if(表达式n)
{
  语句n;
}
else
{
  语句n+1;
}

 要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。

#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输⼊的数字是0\n");
else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
return 0;
}

switch选择结构

1.switch语句

格式

switch(表达式)
{
case 常量表达式1:[语句组1][break;]
case 常量表达式2:[语句组2][break;]
···
case 常量表达式n:[语句组n][break;]
[default:语句组n+1]
}

其中用一对方括号括起来的部分表示是可选的。

  • 该结构是多分支结构,其中的switch case default break都是系统提供的关键字。
  • switch后面的表达式必须是整型或字符型 ,每个case中的常量表达式必须是相应的整数或字符,且两个常量值不能相同。
  • default可以写在其它任何位置,也可以没有。
  • break语句跳出switch结构。

执行过程:先计算表达式的值,然后依次与每一个case中的常量表达式的值进行比较。若有相等的,则从该case开始依次往下执行;若没有相等的,则从default开始往下执行。 

2.break语句

使程序流程跳出switch选择结构或跳出循环体结束循环。

在switch语句的case语句组的结尾通常应加break语句,跳出switch选择结构,否则将进入下一个case,执行下一个case的语句组,可能造成程序执行的结果与预想的不一致。

二、循环结构

while循环与do···while循环结构

1.while语句

格式

while(表达式)
{
循环体
}

当循环条件成立时,执行循环体。

执行过程

①计算while后面的表达式,如果其值非0,则转向②,否则转向③。

②执行循环体,循环体执行完毕,转向①。

③退出该循环体结构,去执行该结构的后续语句。

  • while语句是先计算表达式的值,然后根据表达式的值决定是否执行循环体中的语句。因此,如果表达式的值一开始就为0,那么循环体一次也不执行。
  • 当循环体为一个语句时,花括号可以省略不写;当循环体由多个语句组成时,必须用花括号括起来,形成复合语句。
  • 在循环体或表达式中应有修改表达式值的操作,以避免出现“无限循环”。 
#include <stdio.h>
int main()
{
while(1)
printf("hehe\n"); //while后边的条件满⾜,死循环的打印hehe
return 0;

练习
输⼊⼀个正的整数,逆序打印这个整数的每⼀位
例如:
输⼊:1234,输出:4 3 2 1
输⼊:521,输出:1 2 5  

#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n)
{
printf("%d ", n%10);
n /= 10;
}
return 0;
}

 题⽬解析
1. 要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4
2. 要想去掉n的最低位,找出倒数第⼆位,则使⽤ n=n/10 操作就可以去掉最低位的,如:
n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第⼆位3。
3. 循环1和2两个步骤,在n变成0之前,就能到所有的位。

2.do···while语句

格式

do
{
循环体
}while(表达式);

执行过程

①执行循环体。

②计算while后面的表达式,如果其值非0,则转向①,否则转向③。

③退出该循环体,去执行该结构的后续语句。

可用于解决任何涉及需要重复操作且至少要操作一次的实际问题。

在屏幕上打印1~10的值 

#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
}while(i<=10);
return 0;
}

for循环结构

1.for语句

一般格式

for(表达式1;表达式2;表达式3)
{
循环体;
}

执行过程

①计算表达式1。

②计算表达式2,若其值非0,则转向③,否则转向⑤。

③执行循环体。

④计算表达式3,转向②。

⑤ 退出该循环结构,去执行该结构的后续语句。

  • 表达式1的作用是为变量置初始值;表达式2的作用是进行条件判断;表达式3的作用是修改表达式2的值。因此,它们分别被称为初始化表达式、条件表达式和修正表达式。
  • for语句中3个表达式均可省略,但表达式间的分号作为分隔符不能省,for(;;)等价于while(1)构成无限循环。
  • 与for语句等价的while语句如下。
表达式1;
while(表达式2)
{
循环体
表达式3;
}

2.continue语句

提前结束本次循环,再根据循环条件的值决定是否进行下次循环。

  • continue语句只能用于循环结构。
  • 在while和do···while循环中,continue语句使流程跳过循环体中余下的语句,直接进行条件判断表达式的计算,根据计算结果决定是否继续执行循环体。
  • 在for循环中,遇到continue后,跳出循环体中余下的语句,直接对for语句中的表达式3求值,然后进行表达式2的计算,根据计算结果决定是否继续执行循环体。
  • continue语句和break语句的区别是:1.continue语句只结束本次循环,即不执行循环体中该语句的后续语句,而不终止整个循环;2.break语句是终止整个循环,跳出循环体,去执行该循环结构的后继语句,不再作循环条件的判断;3.continue语句只能用于循环结构,而break语句不仅能用于循环结构,还能用于switch结构。

3.循环嵌套

前⾯学习了三种循环 while , do while , for ,这三种循环往往会嵌套在⼀起才能更好的解决
问题,就是我们所说的:循环嵌套,这⾥我们就看⼀个例⼦。

练习
找出100~200之间的素数,并打印在屏幕上。
注:素数⼜称质数,只能被1和本⾝整除的数字。

#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;
}

题⽬解析:
1. 要从100~200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。
2. 假设要判断i是否为素数,需要拿2~i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤循环解决。
3. 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。 

goto语句

1.goto语句

C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数
内跳转到设置好的标号处。

例如:

#include <stdio.h>
int main()
{
printf("hehe\n");
goto next:
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}

goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出,使⽤ goto 就⾮常的⽅便了。 

for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:

本来 for 循环想提前退出得使⽤ break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套
就得使⽤3个 break 才能跳出循环,所以在这种情况下我们使⽤ goto 语句就会更加的快捷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值