选择结构之if语句

一:C语言中的语句分类

  C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实 现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种 结构的组合。
  我们可以使⽤ if switch 实现分⽀结构,使⽤ for while do while 实现循环结构。

二:if语句初识

if语句的语法如下:

1 if(表达式)

2 语句

  表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
  在C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果是不是0,则语句执行。
  例如:输入⼀个整数,判断是否为奇数

三:else语句

  如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?
 这⾥就需要 if...else... 语句了,语法形式如下:
  if ( 表达式 )
语句 1
else
  例如 输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印数偶数。
注:在了解到if....else...语句后,我们要有两点要注意
1.有的时候我们不要else,也可以达到想要的效果,但是这种代码容易形成误解。
  在上述代码,a等于三时,是指输出一个语句,还是两个语句都会输出呢?(在if语句中,如果没有大括号,它只能控制一条语句)
 
其实这两个代码意思是一样的,而没有else,易让人形成误解。
2.并不是所有的if后面都要有else
  上述代码,初学者也许看不懂,没事,后续文章会有介绍,在这里是用来举例if可以单用。
实例练习: 输入一个年龄,>= 18岁就输出:成年,否则就输出:未成年

四:分支中包含多条语句

 默认在 if else 语句中默认都只控制⼀条语句,比如:

  上⾯的代码,你会发现输⼊的值不管是>=18 还是小于18,"可以交女朋友了" 都会打印在屏幕上。
  这是因为 if 语句只能控制⼀条语句,就是 printf(" 成年了 \n"); ,if语句为真,则打印成年了,
if语句为假,则不打印,对于 printf(" 可以谈恋爱了 \n"); 是独立存在的,不管if语句的条件的真
假,都会被执行。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使用  {} 将代码括起来,else 后也可以跟上⼤括号。如下:
#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
 {
 printf("成年了\n");
 printf("可以交⼥朋友了\n");
 }
 return 0;
}

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
 {printf("成年了\n");
 printf("可以交⼥朋友了\n");
 }
 else //else 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句
 {
 printf("未成年\n");
 printf("不可以早恋哦\n");
 }
 return 0;
}


五:嵌套if语句

if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。
比如:要求输⼊⼀个整数,判断输⼊的整数是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;
}

上图中else后面代码就是嵌套在前⾯的 else ⼦句中的,构成了嵌套的if语句。
再比如:
输入⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:负数。
#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
if(num>0)
 {
 if(num%2 == 0)
 printf("偶数\n");
 else
 printf("奇数\n");
 }
 else
 {
 printf("负数\n");
 }
 return 0;
}
上面的代码中if语句后面的也是嵌套在 if 语句中的,构成了嵌套的 if 语句。
以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断。
练习:
输⼊一
个⼈的年龄
1.如果年龄 < 18 岁,打印 " 少年 "
2.如果年龄在 18 岁⾄ 44 岁打印 " ⻘年 "
3.如果年龄在 45 岁⾄ 59 岁打印 " 中⽼年 "
4.如果年龄在 60 岁⾄ 89 岁打印 " ⽼年 "
5.如果 90 岁以上打印 " ⽼寿星 "
//该方法看起来更简练
#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age<18)
 printf("少年\n");
 else if(age<=44);//else后面的都是大于18的,所以不用再单独作为条件打出来
 printf("⻘年\n");
 else if(age<=59)
 printf("中⽼年\n");
else if(age<=90)
 printf("⽼年\n");
 else
 printf("⽼寿星\n");
 return 0;
}
//带上大括号逻辑更清晰,不容易出错,但是看起来冗长
//对于初学者最好都带上大括号,即使只有一个语句,也加上,这样避免逻辑出错
#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("⽼年\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;
 }

  程序运⾏的结果是啥?
  很多人是不是上来以判断 a 是 0,不等于 1 ,那就执行 else 子 句,打印 haha。
  但是当你去运行代码,输出的结果是:啥都不输出。
  这是为什么呢???
  为什么呢?
  这就是悬空 else 的问题,如果有多个 if else ,可以记住这样⼀条规则, else 总是跟最接近
if 匹配。
  上面的代码排版,让 else 和第一个 if 语句对齐,让我们以为 else 是和第⼀个if匹配的,当 if
语句不成立的时候,⾃然想到的就是执行  else 子 句,打印 haha ,但实际上 else 是和第⼆个 if
进行匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不
成立,嵌套 if else 就没机会执行了,最终啥都不打印。
  如果代码改成下面这样就更加容易理解了
#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匹配,可以这样修改代码:
#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 = 10;
    if(a > 5);
        printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

大家觉得这个代码的结果是呵呵吗?

此时这个代码在vs中是无法执行的,这是为什么呢?哪里有错误码?

而将printf的语句注释以后,代码反而正确了?

这是因为if后面加了一个分号,虽然我们平时写语句后面不能忘加分号,但是在if后面加上分号,这个分号表示一个空语句,if在没大括号的情况下,只能控制那个空语句。

所以,在if else后面,如果没有空语句的需求,千万不要加分号。


对应if语句的介绍,就到这里了,如果友友们发现什么错误,或者还有什么疑问可以在评论区里发出来,下一篇文章将if语句中经常用到的一些逻辑操作符。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖剹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值