前言:选择语句是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,执行完毕,其余的代码块就不会被执行了。
代码用途等下再说,先说注意事项:
- 如果语句块后面没有break,那么程序就会继续执行下面的内容,直到遇到下一个break或后面没 有内容时而退出。比方说,判断表达式和表达式3的结果相同,程序就会执行语句块3的内容,如果 果有上面的break,switch…case 语句到此结束,直接跳出 switch 大括号中的所有内容。但是如果 果这个没有break,那么程序执行完语句块3后还会接着执行语句块4,直到遇到 break 或 switch 大括号后面没有内容而退出。
- 在 switch…case 语句中,default 和 case 的位置没有关系,编译器都会先找 case,等 case 不满足条件之后才会找 default(在C#语言就不适用该规则,不要搞混了)。因为一些常规和标准的写法 default 都会在最后面,但是在面试笔试中为了考察大家对于 switch…case 语句的掌握程度,会将 default 写在开头或中间,所以这个时候大家就要特别注意了。
- 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); //可以先选几个值在纸上写写再运行代码看看结果,这样才能提高
}
千里之行,始于足下。
本节知识可应用场景包括但不限于此。希望大家努力。