C语言—分支与循环(上)

首先c语言是一种结构化的程序设计语言,支持三种结构:

顺序结构:

选择结构:if switch

循环结构:for while do.while

1. if语句

1.1 if

if语句的语法形式如下:

 if (表达式)
   语句

表达式成立(为真),则语句执行。
表达式不成立(为假),则语句不执行。
在c语言中0为假,非0为真
例如:输入一个整数,判断是否为偶数。

#include<stdio.h>
int main()
 {
 	 int num = 0:
	 scanf("%d",&num);
     if(num % 2 == 0)//注意if语句后面不加分号,加了分号判断执行完还会执行printf
     printf("%d 是偶数\n",num);
     return 0;
}

1.2 else

一个数不是奇数就是偶数,偶数判断出来了,那么如何判断奇数呢?
这里就要用到if…esle….语句了。

	if (表达式)
	    语句1
	    else
	    语句2

举例:

#include<stdio.h>
int main()
{
	int num = 0;
	scanf("%d",&num);
	if(num % 2 == 0)
	    printf("%d是偶数\n" ,num);
	else
	    printf("%d是奇数\n",num);
	return 0;
}

1.3 分支中包含多条语句

一个if只能控制一个语句,如果想控制多条语句,那就要加上{}。if后面使用{}控制多条语句叫做程序块或者复合语句。
例如:

#include<stdio.h>
int main()
{
	int age  == 0
    scanf("%d\n",&age);
    if(age >=18)
     {
         printf("成年了\n");
         printf("可以考驾照了\n");
     }
     return 0;
} 

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

1.4 嵌套if

if…else…语句中,else可以与另一个if语句连用,构成多重判断。
比如输入整数判断是0 正数 负数。

#include<stdio.h>
int main()
{
	int a = 0;
    scanf("%d",&a);
    if(a == 0)
        printf("%d 为0",a);
    else if (a > 0)
        printf("%d 为正数",a);
    else
        printf("%d 为负数",a);    
        
	return 0;
}

在这里插入图片描述
蓝色的if相当于嵌套在else语句中,形成嵌套结构。

1.5 悬空else问题

如果有多个ifelseelse总和最接近的if匹配。

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if(a == 1)
	     if(b == 2printf("hehe");
	else 
	      printf("haha");

	return 0;     
}

上面的代码排版,让人会误以为else和第一个if匹配。实际上else是和第二个if匹配的。所以第二个if…else… 是嵌套在第一个if中的。如果第一个if不成立。那么第二个if也就不会执行。
将代码改成下面的代码就会更容易理解。

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if(a == 1)
	{     if(b == 2printf("hehe");
	      else 
	          printf("haha");
    }   
	return 0;     
}

如果真想让else和第一个if匹配,可以将代码改成这样:

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if(a == 1)
	{
	     if(b == 2)
	        printf("hehe");
    }          
    else 
    {  
	     printf("haha");
    }
	return 0;     
}

大括号会使代码的逻辑更加清晰,增强代码的可读性。

2. 关系操作符

        >          大于运算符
        <          小于运算符
        >=         大于等于运算符
        <=         小于等于运算符
        ==         等于运算符
        !=         不等于运算符

注意: (1)相等运算符==与赋值运算符=是两个不一样的运算符。
(2)多个操作符不宜连用

关系表达式中通常返回01表示真假。真为1,假为0

3. 条件操作符

条件操作符也叫三目操作符,需要接受三个操作数,形式:

1  exp1 ? exp2 ; exp3

计算逻辑:如果exp1 为真,exp2计算,计算结果是整个表达式的结果;如果exp1为假,则exp3计算,计算结果为整个表达式的结果。
比如:

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d",&a);
	if(a > 5)
	   b = 3;
    else
       b = -3;
	printf("b等于%d\n",b);

	return 0;
}
改造后
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d",a);
	b = a>5?3:-3;
	printf("%d\n",b);

	return 0;
}

4. 逻辑操作符:&&,||,!

逻辑操作符提供逻辑判断功能,用于构建更复杂的表达式,主要有以下三个运算符。
·取反运算符
·&&与运算符
·||或运算符
a 逻辑与(若二者均不为0,结果为1)全真则真,一假则假

aba&&b
非0非01
非000
0非00
000

b 逻辑或(只要有一方结果)一真则真

aballb
非0非01
非001
0非01
000

演示:显示所输入的月份所处的季节

#include<stdio.h>
int main()
{
		int month;

	printf("请输入月份:");
	scanf("%d", &month);

	if (month >= 3 && month <= 5)//逻辑与运算符:“且”的判断
		printf("%d月是春季。\n", month);
	else if(month >= 6 && month <= 8 )
		printf("%d月是夏季。\n", month);
	else if(month >= 9 && month <= 11)
		printf("%d月是秋季。\n", month);
	else if (month == 1 || month == 2 || month == 12)//逻辑或运算符:“或”的判断
		printf("%d月是春季。\n", month);
	else
		printf("%d月不存在!!\n",month);
		return 0;
}

4.5 短路求值

c语言的一个逻辑特点就是先对左侧的表达式求值,再对右边的表达式求值。
如果左边的表达式满足所需要的条件,就不会对右边的表达式进行求值。这种情况被称为短路
比如前面的:

if (month >= 3  &&  month<=5)

当左边的month >=3不成立即表达式结果为0的话,不判断month<=5,整个表达式的结果也为0。
所以,对于 && 操作符来说,左边结果为0的话,右边就不再执行。
那么对于 || 操作符,左边的结果为1,右边的不在执行。

像这种仅仅知道左操作数的结果就能知道整个表达式的结果,不用对右边的操作数进行运算就叫做短路求值

5. switch语句

switch 语句相当于一种特殊的 if…else… 语句。 if…else… 语句将程序流程分为两支,而 switch语句会将程序分为多支。用于判断条件有多个结果的情况。

switch (expression){
  case value1 : statement
  case value2 : statement
  default :statement
  }

上面代码中,根据expression的值,执行相应的case分支。如果case无对应的值就执行default分支。
注意:(1)switch语句括号内的控制表达式必须是整数类型。
(2)case后的值必须为常量,不可以为变量。

5.1 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");

	return 0;
}

显示所输入的整数除以3的余数(if语句)

#include<stdio.h>
int main()
{
	int n = 0;
	printf("请输入一个整数:");
	scanf("%d",&n);
	switch (n % 3) {
	    case 0 : printf("整除,余数为0");    break;
	    case 1 : printf("余数为1");         break;
	    case 2 : printf("余数为2");         break;
	}

	return 0;
}

如果 n%3 的值为1,则程序会转向 “case 1 :”

case 1 : 这样表示程序跳转的标识称为标签
注意: 1和:之间有没有空格都可以。但是case和1之间必须有空格,不可写成case1

5.2switch语句中的break

前面的语句如果去掉break会发生什么呢?

#include<stdio.h>
int main()
{
	int n = 0;
	printf("请输入一个整数:");
	scanf("%d",&n);
	switch (n % 3) {
	    case 0 : printf("整除,余数为0");    
	    case 1 : printf("余数为1\n");         
	    case 2 : printf("余数为2\n");    
	}

	return 0;
}

在这里插入图片描述
我i们会发现7除以3的余数为1,结果发现多了个2,这是为什么呢?
因为当程序执行到break语句时,switch语句执行结束。
break“打破”“脱离”之意。执行break语句之后程序才会跳出switch语句。
break也不是每个case都有,这就需要根据实际情况来看了。
例如:

#include<stdio.h>
int main()
{
	int a = 0;

	printf("整数:");      
	scanf("%d",&a);

	switch (a) {
	  case 1:printf("A"); printf("B");  break;                     
	  case 2:printf("C");
	  case 5:printf("D");               break;
	  case 6:
	  case 7:printf("E");               break;
	  default:printf("F");              break;
	}
	return 0;
}
输入整数:1 回车
运行结果
 A
 B

输入整数:2 回车
运行结果
 C
 D

输入整数:3 回车
运行结果
 F

输入整数:5 回车
运行结果
 D

输入整数:6 回车
运行结果
 E                                   

当控制表达式的判断结果与任何一个case都不一致的时候,程序就会跳转到’‘default :’'继续执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值