C语言的分支结构和对应的运算符

C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构这三种结构顺序结构就不用介绍了,自然是顺着往下执行的结构了,我们今天先介绍分支结构!

选择结构

选择结构分为两个,一个是if,else语句,一个是switch,case语句。

if,else

if,else基本知识

表现形式

if(条件)
语句1
else//否则
语句2

其中条件为真就执行语句,为假就不执行语句。

  • 在C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行。
  • else是否则的意思,条件为假就执行else语句,整个的意思是如果条件为真,就执行语句1,否则执行语句2。

举个例子

#include<stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num%2==1)//num为奇数
{
printf("为奇数");
}
else//一个数不是奇数就是偶数了
{
printf("为偶数");
}

return 0;
}
  • if,else语句默认只控制一条语句,当然了,要是你想if语句下要执行多条语句,就要加上{}了。
    比如:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18)
printf("成年了\n");
printf("可以谈恋爱了\n");//不管age值为多少,可以谈恋爱了这条语句都会执行
return 0;
}

问题:要是我要判断一个月份是春夏秋冬的哪一个季节,if,else语句可以做到吗?
当然可以,用if,else嵌套调用即可。

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

再来讲一个知识点:
大括号 {} 的作用是:

  • 把多个语句 “打包” 成一个 “复合语句”(视为一条语句)
  • 要是大括号内只有一个语句,就可以把大括号省略
  • 因为第二个if,else语句仅执行其中一个(或if或else),就算在第二个if或者else中因为有多条语句,所以加了大括号,也被视为一条语句(整个大括号里面的不管多少条语句),所以第一个else的大括号可以省略,所以可以像下面这样写
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输⼊的数字是0\n");
else if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
return 0;
}

这么写也是最常见的,这是因为else后面没有这个条件,所以可以这么写,像if(条件)就不可以了,最好就加上大括号,以便理解。

if,else的对应问题

一个重要的点:
if,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相匹配。

switch,case

第二个分支结构就是switch,case结构

举个例子演示:

#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;
default:
printf("输入错误\n");
break;
}
return 0;
}

由这个例子了解swtich,case结构

从后面接的数据类型是哪些的方面来说

  • switch 后的括号之中的表达式必须是整型表达式
    比如:n(一个整数变量),可以是x+y(两个都是整型变量),但是不可以是浮点型和字符型的。
  • case 后的值,必须是整型常量表达式。

从形式上来说

case后面要加一个空格才能加整数。

从内容上来说

  • switch的意思就是开关嘛,那么就可以联系一下风扇的挡位,有1,2,3档,而switch关键词,比如你要选择一档,就可以这样,switch(1)(一般switch中都是一个整型变量的,可以自己输入的),当然选了1,自然就要有与之对应的内容了,case就有这样的作用
  • case的意思就是情况、案例,switch调到了1,那么就可以跳到case 1(案例1)了,执行下面的内容了
    case 1:
    printf(“星期⼀\n”);//这里的语句可以不止一个并且一般情况不用加大括号
    break;
    解释一下上面注释的内容,要先来讲一下break有终止当前case分支的作用(当然不止于这,后面还会讲的)
    衍生问题:
    case 1:
    ……
    case 2:
    ……
    当我的switch(n),其中n为1的时候他不会执行完语句之后就跳出分支吗?
    答案是不会,需要自己用break关键词来跳出switch分支,不用就会跳到这个n指定的位置,一直往下面执行。
    接着讲注释的问题
    那么知道了switch,case的执行逻辑了,就可以很清楚的知道这个当switch中的数字是1时就会跳到下面case后数字是1的地方,然后向后执行,直到遇到break,就跳出了switch分支,所以可以不加大括号(在case后面定义变量的就要假,但是一般不会在其中定义变量)。
  • default是什么?就是当用户输入的数据并不是case后数据中的,就跳到了default执行报错指令,当然default并不是只能放在最后一个,还可以放在前面(只是一般写法是将default放在最后的),最后一个的结构可以不加break,加上也可以的。
#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;
}

很明显的是case1~5就只有case下面有语句
为什么?
因为当用户输入1~5的时候执行同一条语句,就可以利用switch的规则(跳到对应的case的地方,然后往后面执行,遇到break,就提前跳出)

逻辑运算符与关系运算符和条件运算符

讲完分支结构,我们来讲一下必不可少的逻辑运算符和关系运算符

逻辑运算符分为三种

&& // 逻辑与
|| // 逻辑或
! // 逻辑非

关系运算符

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

条件运算符

r=a>b?a:b//条件运算符

讲之前有一个重要的点就是
关系表达式通常返回 0 或 1 ,表示真假。
C 语言中, 0 表示假,所有非零值表示真。比如, 20 > 12 返回 1 , 12 > 20 返回 0 。
关系表达式常用于 if 或 while 结构。(之前讲过,这里再提一下)

关系预算符要注意的点

  1. C语言中=是赋值运算符,==是相等运算符。
    以此有一个很好的写法

if(x==3)可以写成if(3==x)//要是写成=,编译器会报错

  1. 不要写成数学里的那样
    比如:

if(i<j<k)//错误写法

分析一下i<j(为真就返回1,为加返回0),再判断k与返回值的大小得出真假,这完全得不到我们想要的结果,因而有了逻辑运算符。

逻辑运算符的注意点

&&都真才为真
||有一个为真就为真
!真假反转

条件中的短路

if(假&&(表达式))//后面的表达式就不再执行,这是C语言的规则,因为就是前面为假就不用看后面了,直接判为假,&&的规则
if(真||(表达式))//同理,后面的表达式就不再执行因为就是前面为真就不用看后面了,直接判为真,||的规则

条件运算符的注意点

r=a>b?a:b//意思是a大于b吗?为真就返回a,为假就返回b,返回值被r接收。

总结

谢谢观看,下期会讲到循环结构!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值