在C语言中,存在顺序结构、选择结构和循环结构三种。而选择结构又分为if else和switch两类。下面就对两类选择结构进行简要说明。
目录
if else
if else的基本结构
基本结构如下:
if(表达式)
{
选择分支一的语句;
}
else
{
选择分支二的语句;
}
其中,表达式是做比较或做判断,比较两个变量的大小、比较两个变量是否相等、比较变量和常量的大小、比较变量和变量之间的大小……总之来说,只要比较出来的结果与表达式一样,则称为结果为真(也就是1),结果为真就只执行分支语句一,跳过分支语句二继续执行分支语句后面的代码。但若结果为假(也就是0),此时则只执行分支语句二,分支语句二执行完后继续执行分支语句后面的代码。
举例:
int age;
printf("输入年龄:");
scanf("%d",&age);
//非0就是真
if(age>=18)
printf("成年\n");
else
printf("未成年\n");
此时,如果输入的年龄(age)为26,那么26就会被存入age中(运用scanf语句将其保存到age中的),if语句就会将存入的age与18进行比较,也就是26与18进行比较。此时,age>=18是成立的,那么结果为真,则执行语句:printf("成年\n");
但若输入的年龄(age)为17,那么17同样会被存入age中与18进行比较,age>=18不成立,那么此时结果为假,则执行语句:printf("未成年\n");
输入的数字可改变,但都会按照表达式的结构进行比较。
if else的变形
在实际应用中,也会存在这种情况:当某个特定的信息出现时,才需要进行特殊处理后再继续正常运行。那么此时就可以不写else及else后面的分支语句(实际上并没有分支语句,因为只有在特殊情况的时候才需要去处理)。那么此时其基本结构就成了:
if(表达式)
{
分支语句一;
}
此时,只有当表达式为真时,才会执行分支语句一,其他情况程序都直接跳过分支语句一执行其后面的语句。
举例:
int i;
for(int i = 1;i <= 100;i++)
{
if(1 == i % 2)
printf("%d\n",i);
}
/*
for为循环语句的一种,会另出一篇文章讲述
1 == i % 2:
“==”表示判断是否相等,先把确定的数字写前面是为了防止
写的时候少打一个等号导致错误还很难找出。
“%”时取余运算,也就是将i除以2后得到的商舍去,获取其余数
整体的意思就是当i除以2后余数是1则为真,否则是假
*/
该段代码也就是输出1~100的奇数,依据个人习惯也可以将表达式写成i % 2 == 1,至于我为什么这么写在注释中有说明。
我们在实际处理问题的时候也会遇见这样的情况:满足条件时执行一条语句,不满足该条件但满足另一条件时则执行另一条语句两者都不满足时则执行第三条语句,这种变形的应用条件是需要遵循一定逻辑的,否则结果会出乎意料。基本结构为:
if(表达式一)
分支语句一;
else if(表达式二)
分支语句二;
else
分支语句三;
举例:
int age = 0;
printf("请输入你的年龄");
scanf("%d",&age);
if(age<18)
printf("少年\n");
else if(age<26)
printf("青年\n");
else if(age<40)
printf("中年\n");
else if(age<60)
printf("壮年\n");
else
printf("老年\n");
根据代码逻辑,就是将0~18归为少年,18~26归为青年,26~40归为中年,40~60归为壮年,60以上归为老年。但如果我们将某一表达式提前,结果就会完全不一样,读者们可以自行尝试一下,我这里直接说分析:age<18不成立,那其结果肯定是>18的,接下来就和26比较,若年龄是比26小,那就输出“青年”,否则继续向下比较。但若代码提前,就比如把第一个else if(age < 26)里面的表达式改为age<60,后面的输出结果也改成相应的结果。此时输入30,正常结果该为“中年”,但改后的输出结果为“壮年”。
上述只是一个分支的情况,但很多时候我们并不是只面临两种选择,程序也是。所以此时就存在多分支情况,又称为if else的嵌套。其基本结构如下:
if(表达式一)
{
if(表达式二)
{
分支语句一;
}
else
{
分支语句二;
}
}
else
{
if(表达式三)
{
分支语句三;
}
else
{
分支语句四;
}
}
这个与前面的类似,只是情况成了一下这种:
表达式一 | 表达式二 | 表达式三 | 执行语句 |
真 | 真 | 不比较 | 分支语句一 |
真 | 假 | 分支语句二 | |
假 | 不比较 | 真 | 分支语句三 |
假 | 假 | 分支语句四 |
当然其嵌套远不止这点,根据需要,可以增加或者减少。除此之外,在嵌套中也可以使用前面的变形过后的选择语句。
if else的其他补充
- 当if、else后面所跟随的分支语句有且只有一条时,可以不用加上花括号{}。举例:
int i;
scanf("%d",&i);
if(i == 0)
printf("哈哈");
else
printf("嘿嘿");
此时输入的若为0,则输出“哈哈”,否则输出“嘿嘿”。当然最好加上,这样可以让你更容易分辨分支语句跟随的是哪一个if或else,特别是在嵌套里面。而且后续代码内需要增添某些东西时不需要重新打花括号,更为便捷。
-
表达式内出现赋值的情况(该情况是人为错误的情况):
当表达式是比较一个常量和一个变量时,按常规写法“变量 == 常量”的写法,有可能会少打一个等号变为赋值,即“变量 = 常量”。此时若常量为0,则表达式为假;若常量为非0情况,则表达式为真(注意,该常量只要不是0,即使是负数,表达式也为真!!!)。举例:
int x = 0,y = 23,z = 0;
if(x = -3)
{
printf("哈哈");
}
if(y = 3)
{
printf("呵呵");
}
if(z = 0)
{
printf("嘿嘿");
}
此时只输出哈哈和呵呵。
- 表达式是一个变量同时与两个常量比较的情况:
我们在实际处理问题时,也会存在某变量需要大于某数字且小于某数字的情况,比如x需要大于0且小于100,按照生活中的写法则为:0<x<100,但在表达式中这么些就会出错,具体分析如下:
if(0 < x < 100)
此时则会线判断0 < x是否成立,若成立,则0 < x被1替换,1去和100进行比较,1<100成立,则这段表达式结果为真,在这种情况下,就算x的值为200,总的来说结果也是成立的;
但若0 < x不成立,则0 < x被0替换,后面的比较流程类似。
正确写法为:if(x > 0 && x < 100)
&&与运算 ||或运算 &按位与 |按位或 !非运算
switch
当存在很多分支时,再去用if else来写就会很繁杂,此时可以选择switch语句来写。
switch的基本结构
switch(整型表达式)
{
case 1:语句项;break; //case里面要整形常量表达式
……
default:语句项;break;//default是默认项,一般写在最后一行,也可以不写
}
举例:
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;
此时,输入1则输出星期一,输入2则输出星期二,依此类推。
switch的说明
case决定入口,break决定出口,而default放在最后一行是在前面都不满足时才执行。
举例:
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;
default:
printf("输入错误\n");
break;
}
此时输入[1,5]任何一个数字,输出结果都是工作日,只是经过的case不同而已。若输入不是[1,7]的数字,才执行default输出“输入错误”的字样。但若我们在每个case后让其输出对应的一个数字且break只在case5和case7后存在。此时输入2,则输出结果时:2345工作日。
选择结构的分享大致就到这,希望能够帮助到大家。同时,有什么疑问、补充、错误或建议望大家在评论区指出。感谢观看!