C语言的分支与循环语句---if语句与操作符
目录
前言
在生活中,我们对某一件事进行判断,通过判断我们可以做出不同的选择,不同的选择就会有不同的结果。但程序员不会总执行同样的处理,而是通过条件判断的结果选择性地执行某种处理的情况事非常多见的,而这就是我们将要介绍的分支语句。
人生就是日复一日地不断重复,就有相同的事情,也有相似的事情,却无论如何也无法回到最初。要想在生活的每一刻都能有新的发现,恐怕只是一个美好的愿望。因此我们还会介绍循环语句。
一、C语言的结构
C语言是结构化的程序语言设计,在这结构是指顺序、选择、循环结构。
如果仔细想想我们的日常生活也可以拆分成这几种结构。
C语言中if、switch语句实现顺序、选择,即分支。for、while、do while语句实现循环。
二、分支语句
1.if语句
if语句的代码如下(示例):
if (表达式)//进行判断真或假。为真则执行语句。
(语句);
如果表达式的输出的值为非0,则会执行下面的语句;否则不执行。(注意if后面只有一个语句,若要用多个语句需要{}括起来形成复合语句)
在C语⾔中,0为假,⾮0表⽰真。
1.1 if语句的示例
判断一个数是否为奇数。
代码清单1-1
#include <stdio.h> int main() { int num = 0;//最好初始化变量 scanf("%d",&num);//输入num的值 “&”符号表示取地址 if(num % 2 == 1)//判断表达式是否成立,如果成立则为真(值为非0)。 printf("%d是奇数",num); return 0; }
输入1时。按回车结果是
其流程如下图在·
1.2 if......else......
如果不是奇数那上面的代码清单1-1中如何表示出它是偶数呢?这时我们就需要if......else......语句了。
if (表达式) //进行判断,若表达式为真(成立),则执行语句1
(语句1);
else //若表达式为假(不成立),则执行语句2
(语句2);
将代码清单1-1进行更改:
#include <stdio.h>
int main()
{
int num = 0;//最好初始化变量
scanf("%d",&num);//输入num的值 “&”符号表示取地址
if(num % 2 == 1) //判断表达式是否成立,如果成立则为真(值为非0)。
printf("%d是奇数",num);
else //若表达式不成立则为假,执行else后面的语句
printf("%d是偶数",num);
return 0;
}
其输出的结果是:
1.3 分支中包含多条语句
上面所提到的if语句只能执行一个语句,若需要多条语句执行,则需要使用{}将语句括起来使用变成复合语句
若不使用{}代码输出结果将会如下:
#include <stdio.h>
int main()
{
int num = 0;//最好初始化变量
scanf("%d", &num);//输入num的值 “&”符号表示取地址
if (num % 2 == 1) //判断表达式是否成立,如果成立则为真(值为非0)。
printf("%d是奇数", num);
printf("%d是偶数", num);
return 0;
}
其输出结果是
无论是偶数是奇数都会输出这说明if后面只能执行一个。
执行完之后红色圈内的会继续执行。
如果使用{}我们就可以做到执行多个语句。
像这样代码清单1-2
#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语句的多分支。
1.4嵌套if
在if......else......语句中else可以与另一个if语句连用,构成多重判断。
比如:输入一个整数,判断输入的整数是0,还是正数或者负数。如代码清单1-3:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
{
printf("是0\n");
}
else if (num > 0) //else后执行一个if语句
{
printf("%d是正数\n", num);
}
else
{
printf("%d是负数\n", num);
}
return 0;
}
运行的结果是:.
1.5else的匹配问题
else 总是跟最接近的 if 匹配。
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("hehe\n");
return 0;
}
其运行的结果是什么都没有。故说明else不是与第一个if匹配,而是与最近的if匹配。
我们可以将代码改成如下图:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
if(a == 1)
{
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
这样会更明确。当第一个if后面的表达式不成立时,后面的函数不会执行。
若我们需要else与第一个if语句匹配那我们则可以如下修改:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
if(a == 1)
{
if(b == 2)
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
2.操作符
2.1关系操作符
下面是“关系运算符”
- > 大于
- < 小于
- = 等于
- >= 大于等于
- <= 小于等于
- == 相等
- != 不相等
下面是“关系表达式”
- a > b;
- a < b;
- a >= b;
- a <= b;
- a == b;
- a != b;
表达式正确则通常返回的值是1(真),若不正确则返回的值是0(假).
注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写 出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。
1 if (x = 3) ...
所以我们最好把常量放在关系运算符的左边。如下图
if (3 == x)...
这样会提醒我们报错。如下:
//报错
if (3 = x)...
注意: 多个关系运算符不宜连⽤
a < b < c
上面的实际是
(a < b ) < c
i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进⾏⽐较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使⽤下⾯的写法
a < b && b < c
这时出现了&&,这个是另外一种操作符,叫逻辑操作符。下面我们进行介绍。
2.2逻辑操作符
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
2.2.1逻辑反运算符:!
如其名,就是反过来,把真变成假,把假变成真,== 表示等于, != 就表示不等于。
如下图:
2.2.2与运算符: &&
&& 就是与运算符,也是并且的意思。它是一个双目操作符。a&&b。a与b都是真时 表达式才为真。如图
2.2.3或运算符: ||
|| 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符。a||b。a与b有一个是真则表达式为真。
如图
2.2.4练习:闰年的判断
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
1. 能被4整除并且不能被100整除是闰年
2. 能被400整除是闰年
代码1:
#include <stdio.h>
//代码1
int main()
{
int year = 0;
scanf("%d", &year);
if(year%4==0 && year%100!=0)
printf("是闰年\n");
else if(year%400==0)
printf("是闰年\n");
return 0;
}
代码2:
//代码2
int main()
{
int year = 0;
scanf("%d", &year);
if((year%4==0 && year%100!=0) || (year%400==0))
printf("是闰年\n");
return 0;
}
2.3短路
逻辑运算符,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。
左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。