1.前言
C语言是一个结构化的程序设计语言,这里所说的结构就是指顺序结构、选择结构、循环结构。C语言有能力实现这三种结构。
我们不妨再仔细想,在生活中的所遇到的事情都可以拆分为这三种结构或者这三种结构的组合。
举个例子:找男女朋友。
第一步,双方得各自拥有对方的联系方式吧(不然只能是单相思喽🥲);
第二步:通过联系方式(vx)对对方有更深层次的了解。此时,双方就会面临着一个问题,聊得欢,就会成为男女朋友,聊的不愉快,就找下一位💦。
通过分析上面的例子,不难发现,分步骤,体现了顺序结构的特点。面临是否成为真正的意义上的男女朋友的问题上,体现了选择结构。成为不了彼此终生的伴侣时,就果断找下一个,如此循环,直到找到为止,体现了循环结构。
看到这里,读者们也可以联想自己在生活中,分析一下是否可以拆分成这三种结构或是三种结构的组合。🤩
2. if语句
2.1 if
if (条件表达式)
语句
这段代码的意思是:如果 if 后面括号里的条件表达式的值为真时,则这执行下面的语句;表达式的值为假时,则不执行下面的语句。
这里解决一些刚学习C语言读者的困惑(如果有较好的C语言基础,可自行跳过这段内容)
上面提到的条件表达式的值为真或为假是什么意思?
在数学中,1>2这个不等式是不成立的,故为假。而1<2这个不等式是成立的,故为正。为此,我们就可以得出结论:只要条件表达式符合我们的自然规律或常识的,就为真。反之,为假。
为了让读者更进一步感知if语句,直接上例子。
例子:输入一个整数,判断是否为奇数
#include<stdio.h>
int main()
{
int num = 0; //待被判断的整数num
scanf("%d", &num);
if(num % 2 != 0) //判断奇数的精髓
printf("%d是奇数\n",num);
return 0;
}
图解(在学习前期,画图是必要的):
2.2 else
讲完 if 之后,再讲讲它的好兄弟 else。
在那个判断奇数的例子中,我们只展示了当它是奇数的情况时,就会打印“这个数是奇数”。那如果我们想在这个基础之上(不是奇数),输出“这个数是偶数”。该如何做?
这里就要用到 if…else… 语句了,语法如下:
if(条件表达式)
语句1
else
语句2
上面的这段代码意思是:如果 if 的条件表达式的值为真时,就会执行语句1,语句2就不执行了。反之,如果 if 的条件表达式的值为假时,就会执行语句2,不会执行语句1。(就是二选一)
在例子中感悟和学习 if…else… 语句的道理和语法
例子1:输入一个整数,判断是否为奇数,如果为奇数打印是奇数,否则打印偶数。
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 != 0)
printf("%d 是奇数\n",num);
else
printf("%d 是偶数\n",num);
return 0;
}
图解:
为了巩固,再来一道例子
例子2:输入一个年龄,>=18岁就输出:你可以大大方方地谈恋爱了,否则就输出:还不可以谈恋爱哦~
#include<stdio.h>
int main()
{
int age = 0; //存放年龄的变量age
scanf("%d", &age);
//进行判断
if(age >= 18)
printf("你可以大大方方地谈恋爱了\n");
else
printf("还不可以谈恋爱哦\n");
return 0;
}
读者如果有条件,可以在自己的编译器上,动手编写上面的代码。
2.3 分支中包含多条语句
如果我们在 if 和 else 语句中,只需要它们执行一条语句时,是不用加花括号的。例如我们之前打过的代码,
#include<stdio.h>
int main()
{
int age = 0; //存放年龄的变量age
scanf("%d", &age);
//进行判断
if(age >= 18)
printf("你可以大大方方地谈恋爱了\n");
else
printf("还不可以谈恋爱哦\n");
return 0;
}
仔细看, if 或者 else里面只有一条语句,我是没有写花括号的。这种写法C编译器是支持的。(但我的建议是不论什么情况下,都写上花括号,养成好的编程习惯!!!)
那如果,我既要在 if 或者 else里面有多条语句,我又不加花括号,会出现什么情况?
那为什么会出现这种错误呢?
这是因为 if 语句只能控制一条语句,就是 printf(“你可以大大方方地谈恋爱了\n”); ,if为真就打印你可以大大方方地谈恋爱了,if 语句为假时,则不打印。对于 printf(“最好能成为彼此的终生伴侣\n”); 是独立存在的,不管 if 语句是否为真,都会执行这条语句。这是违背我们的意思,并且是不符合语法规则的,为此,我们要有 “{}” 使得 if 或 else语句能够同时控制多条语句。
改进后:
2.4 嵌套if
嵌套if,顾名思义,就是 if…else… 里面还有 if…else…。(就类似于俄罗斯套娃的原理)
在 if else 语句中,else可以与另一个 if 语句连用,构成多重的判断。
如果看不懂上面的那句话,下面的这个例子,一定会让你懂得。
例子:要求输入一个整数,判断输入的整数时0,还是正数或者负数。请看代码:
通过上面的例子,可以知道,当我们要用到多重判断时,就该考虑由else if 配合 if 和 else 构成的多重选择的结构。
else if可以看作是else语句里嵌套这if…else…语句
if 里面也可以嵌套if…else…语句
例子:输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:⾮正数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num>0) //if里面嵌套了if...else...语句
{
if(num%2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
{
printf("⾮正数\n");
}
return 0;
}
有了嵌套if语句,我们就可以实现更多复杂逻辑的判断了。
2.5 悬空else
#include<stdio.>
int main()
{
double score = 0.0;
scanf("%lf", &score);
if(score > 60.0)
if(score > 90.0)
printf("你不仅及格了,而且考的很好哦\n");
else
printf("很遗憾,这次没及格,下次继续加油\n");
return 0;
}
else的机制:else总会跟离它最近的if匹配。这里很多读者可能会认为,
此else与图示的if匹配,从而导致了代码运行时逻辑出现了错误,没有达到我们想要的结果。
如果把代码改成一下的样子,就更加正确且容易理解:
#include<stdio.>
int main()
{
double score = 0.0;
scanf("%lf", &score);
if(score > 60.0)
{
if(score > 90.0)
printf("你不仅及格了,而且考的很好哦\n");
}
else
printf("此次及格了,下次继续加油\n");
return 0;
}
或者,我们希望else与第二个if进行匹配
#include<stdio.>
int main()
{
double score = 0.0;
scanf("%lf", &score);
if(score > 60.0)
{
if(score > 90.0)
printf("你不仅及格了,而且考的很好哦\n");
else
printf("此次及格了,下次继续加油\n");
}
return 0;
}
3. 关系操作符
在之前,我们讨论 if 语句时,说到 if 后面有个条件表达式,而构成条件表达式的成员之一就是“关系操作符”。
关系操作符主要有下面的六个:
- “>” 大于运算符
- “< ” 小于运算符
- “>=” 大于等于运算符
- “<=” 小于等于运算符
- “==” 相等运算符
- “!=” 不相等运算符
例子:
a == b; //初学者一定要记住,“=”这叫做赋值运算符,“==”这个才是相等运算符。
a != b;
a > b;
a >= b;
a <= b;
a < b;
关系表达式通常返回 0(假) 或 1(真) ,表示真和假。
另外,我们在使用关系运算符时,要避免一个错误:多个关系运算符不宜连用。
为什么呢?
请看例子:
什么!不是说好的输出不了"认真学习"吗,为什么会出现这种情况?
我们在上面讲过,关系表达式通常返回0或1。而a<c<b在编译器的眼中是这样的:(a<c)<b
所以到这里我们就懂了,先算a<c,再算(a<c)<b。又因为a<c为真,所以整个表达式的值为1,
故1<b肯定成立,所以条件表达式的为真,故执行if里面的语句。