C语言的选择语句

前言:选择语句是C语言中的重要组成部分,该部分也比较基础,希望大家好好学习,多动手实践,学完本节,就已经可以实现很多功能了哦。加油各位!

一、if...else选择语句

1.if语句

首先给大家展示一下该语句的代码块模型。

if(表达式)
{
    执行语句;
}
//这就是前文博主给大家提过一嘴的单分支语句

这块代码表达的意思就是:如果表达式成立(true),就进入表达式执行内部代码段,否则(false),跳过该语句块区,继续执行后面的语句。相信大家都能理解,那快做道题试试吧。

#include <stdio.h>

void main()
{
    int a=1,b=2;
    int c=0;
    if(a>b)
    {
        c=a-b;
    }
    printf("c=%d\n",c);//请问输出结果为多少
}

读者大大们都已经明白了吧,是的,结果就是c=0。但可能还会有同学问不是有"c=a-b"吗,结果为什么不是-1。我的回答就是,表达式显然不成立,即(a>b)=false,此时7-10行的代码除了运算了一下a>b外,均被跳过,不予执行。非常的简单对不对。好了,那就让我们学习下一部分的内容吧。

2.if...else语句

同样,先上模板

if(表达式)
{
    执行语句1;
}
else
{
    执行语句2;
}
//那这就是规范且经典的双分支语句--if...else语句了

这块代码表达的意思是:如果表达式成立(true),就执行语句1,否则(false),执行语句2。光说不练假把戏,还是得看实际代码示例

#include <stdio.h>

void main()
{
    int a=1,b=2;
    int c=0;
    if(a>b)
    {
        c=a-b;
    }
    else
    {
        c=b-a;
    }
    printf("c=%d",c);//这次结果又是多少呢
}

哈哈,又被聪明的读者大大做出来了,对的,答案就是c=1。这次就不用再解释别的了吧。那好,让我们继续下一块内容。

3.if...else if...else语句

模板如约而至

if(表达式1)
{
    语句1;
}
else if(表达式2)
{
    语句2;
}
else if(表达式3)
{
    语句3;
}
......
else if(表达式n-1)
{
    语句n-1;
}
else
{
    语句n;
}
//这是多分支语句,具体多少分支视情况而定

啊啊啊,怎么这么多,看的我头都大了。大家是不是有这么个想法,博主告诉大家先不要怕,你一句一句的看,看看能不能猜出来这段代码模板想表达什么意思。显而易见嘛,如果表达式1不成立,那就看看表达式2成不成立,如果还不成立就再看表达式2,实在不行再往下看,总有一句能成立,实在成立不了,别着急,那不还有else收尾呢嘛。该有人问了,为什么要整这么多分支,那这时候博主向有这样疑问的你掏出一个分段函数问题,此时阁下是否能够轻松应对。请看题:

题目描述

有一函数如下,写一个程序,输入x,输出y

保留两位小数(顺便考考大家精度控制问题)

样例输入:
1        0        10
样例输出:
1.00        0.00        19.00

写的怎么样,是不是觉得多分支很好用。来一起看一看吧:

#include <stdio.h>
#include <math.h> //由于分段函数实质上是数学问题,大多数情况下引进数学库是非常有必要的

void main()
{
    double x,y;  //怎么样,没有习惯性的就用int定义吧,题目的要求很重要
                 //但凡提到小数,定义时最好就用double哦,因为它的精度是要高于float的。
    scanf("%lf",&x);//这里要注意的是:占位符要对应数据类型,变量名前要加取地址符&

    if(x>=10) 
        y=3*x-11;
    else if(x>=1 && x<10) 
        y=2*x-1;//注意点:不要写成1=< x <10;&&表示and(和,并且)
    else if(x<1) 
        y=x;//考虑到全集除去上面情况只剩这一种情况,此处也可写成else y=x;  

    printf("y=%lf\n",y);//千万不要忘了输出
}

怎么样,写对了吗。写到这里有人可能会说博主你忘写{ }了,No no no,博主没有写错,c语言规则中,{}是可以省略的,但是千万要注意仅限于执行语句只有一句,来看看下面的例子

int a=0;
if(false)
    a=1;
    a=a+1;
printf("%d",a);//结果是多少

//------华丽的分割线-------//

int a=0;
if(false)
{
    a=1;
    a=a+1;
}
printf("%d",a);//结果是多少

//------再华丽一次--------//

int a=0;
if(false)
{
    a=1;
}
a=a+1;
printf("%d",a);//结果是多少

聪明的人已经看出来了,第一段和第三段是一样的,而不是第二段,这就是{}的省略原则,未加{}时,实际效果等同于仅括住:if之后,第一个分号之前的内容。好了,自己慢慢琢磨。

“博主,我没有按你的方法写,但是运行结果也是对的,怎么回事?”,“怎么写的?”,他给我了这么一段代码,我放出来让大家看一下:

#include <stdio.h>

int main()
{
    double x,y;  
    scanf("%lf",&x);
    if(x>=10) 
    {
        y=3*x-11;
    }
    else if(x<10)
    {
        if(>=1)
        {
            y=2*x-1;
        }
        else
        {
            y=x;
        }
    }
    
    printf("y=%lf\n",y);
    return 0;
}

这位同学是非常善于思考的,没有被我刚列的多分支给禁锢住思维,而且,给出的代码没有任何问题。这就是多分支语句嵌套现象。

*.if...else语句的嵌套现象

上面,一位同学用嵌套解决了实际问题,大家有兴趣可以去看看别的文章了解一下,非常的简单。

*.悬空else现象

由于C语言的多分支语句中,既支持{}的省略,又能够嵌套,那么这时候可能就会出现else与if如何匹配的问题,其实就一个原则“else 与其上方相邻最近的if或else if匹配”。更多知识请移步大神文章看详系解释。(强调一下哦,博主总让大家去看别的文章,不是博主懒,是想要告诉大家一个道理:要想学习计算机,学编程,那就要学会如何利用更多的资源去丰富自己,只有在对比与思考中才能总结出自己的东西)。


二、*三目运算符蕴含的选择语句

运算符:【? :】

形式:(判断表达式)? (语句1):(语句2);

运算规则:

//(判断表达式)? (语句1):(语句2);

//等价于:
if(判断表达式)
{
    语句1;
}
else
{
    语句2;
}    

通常我们会使用这个来定义自定义函数或定义宏函数,这里我们实现两个数取最大值的功能

#include <stdio.h>
#define MAX(a,b) a>b? a:b//宏函数的定义

//自定义函数
int max(int x,int y)
{
    return a>b? a:b;
}
//

void main()
{
    printf("%d\n",MAX(25,36));//输出36
    printf("%d\n",max(22,13));//输出22
}

 有些东西看不懂没关系,就是提前跟大家说一下三目运算符的用途,以后大家会理解这段代码的意思的,不用着急。


三、switch开关语句

当分支较多的时候,switch语句就显得简洁方便。还是老规矩,代码模型:

switch(判断表达式)
{
    case 表达式1: 语句块1;
    break;

    case 表达式2: 语句块2;
    break;
    ...
    case 表达式n-1: 语句块n-1;
    break;

    default: 语句块n;
    break;
}

 代码的意思是,判断表达式如果与下列表达式中相同时,执行其后的语句。遇到break,执行完毕,其余的代码块就不会被执行了。

代码用途等下再说,先说注意事项

  1. 如果语句块后面没有break,那么程序就会继续执行下面的内容,直到遇到下一个break或后面没 有内容时而退出。比方说,判断表达式和表达式3的结果相同,程序就会执行语句块3的内容,如果 果有上面的break,switch…case 语句到此结束,直接跳出 switch 大括号中的所有内容。但是如果 果这个没有break,那么程序执行完语句块3后还会接着执行语句块4,直到遇到 break 或 switch 大括号后面没有内容而退出。
  2. 在 switch…case 语句中,default 和 case 的位置没有关系,编译器都会先找 case,等 case 不满足条件之后才会找 default(在C#语言就不适用该规则,不要搞混了)。因为一些常规和标准的写法 default 都会在最后面,但是在面试笔试中为了考察大家对于 switch…case 语句的掌握程度,会将 default 写在开头或中间,所以这个时候大家就要特别注意了。
  3. switch语句与if...else if...else语句的区别:后者的判断条件更灵活,可任意搭配条件;前者范围相对较小,表达式一般不能为浮点数,多为整数或字符。

用途示例: 

#include <stdio.h>

void main()
{ 
    int a=15,b=21,m=0;
    switch(a%3)
    { 
        case 0:m++;
        break;

        case 1:m++;
        switch(b%2)
        { 
            default:m++;

            case 0:m++;
            break; 
        }
        default: 
        break; 
    }
    printf("%d\n",m); //可以先选几个值在纸上写写再运行代码看看结果,这样才能提高
}

千里之行,始于足下。

 本节知识可应用场景包括但不限于此。希望大家努力。

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值