C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。
大家日常所见过的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以使用if、switch实现分支(选择)结构,使用for、while、do while实现循环结构。
本篇文章将介绍if…else语句、switch语句、关系运算符与操作运算符
1、if语句
1.1、if
if语句的语法形式如下:
if (表达式)
{
语句
}
如果表达式的判断结果为真,则语句执行,判断为假,则语句不执行。
在C语言中,非0为真,0为假。
例子:输入一个整数,判断是否为奇数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1) //num % 2 余数等于 1 时,那么 num 就是奇数
printf("%d 是奇数\n", num);
return 0;
}
1.2、else
如果一个数不是奇数,那就是偶数,上面的代码只是判断了 num 是否为奇数,那么偶数该如何表示?
这个时候需要在 if 的基础上加上 else。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1) //num % 2 余数等于 1 时,那么 num 就是奇数
printf("%d 是奇数\n", num);
return 0;
}
1.3、嵌套if
在 if else 语句中,else 可以与另一个 if 语句连用,构成多重判断。
例子:输入一个整数,判断输入的数是0,还是正数或者负数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入的数字是0\n");
else if (num > 0) //这里的 if 相当于嵌套在 else 语句中,形成了嵌套结构
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
return 0;
}
1.4、悬空else与分支中包含多条语句
悬空 else,如果代码中含有多个 if 和 else,可以记住这条规则,else 总是和最接近的 if 所匹配。
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
初学的朋友都会判断以上的运行结果会是"haha",但实际上最后输出的结果是什么都没有。
把代码改成这样我们就可以理解:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
如果需要 else 和第一个 if 所匹配,我们可以这样写:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
分支中包含多条语句,if 和 else 都是默认控制一条语句的。
#include <stdio.h>
int main()
{
int age = 0;
scanf("d", &age);
if (age >= 18)
printf("成年了\n");
printf("可以谈恋爱了\n");
return 0;
}
if (age >= 18) 这个条件表达式是真还是否,“可以谈恋爱了”这句话一样会输出,因为 if 和 else 默认情况下只能控制一条语句。
如果我们想控制多条语句,就需要用 {} 把所有语句都括住。
#include <stdio.h>
int main()
{
int age = 0;
scanf("d", &age);
if (age >= 18) //在 if 后使用 {} 控制多条语句,这样也叫程序块,或者叫复合语句
{
printf("成年\n");
printf("可以谈恋爱\n");
}
else //与 if 同理
{
printf("未成年\n");
printf("不可以早恋\n");
}
return 0;
}
2、关系操作符
C语言用于比较的表达式,称为“关系表达式”,里面使用的运算符就称为“关系运算符”,主要有6个。
- 大于运算符 >
- 小于运算符 <
- 大于等于运算符 >=
- 小于等于运算符 <=
- 相等运算符 ==
- 不相等运算符 !=
举一下比较简单的例子。
a > b
a < b
a >= b
a <= b
a == b
a != b
关系表达式中通常返回0或者1表示假和真。
C语言中,0表示假,所有非0值表示真。比如,20 > 12返回1表示真,12>20返回0表示假。
关系表达式通常用于 if 或 while 结构。
注意!相等运算符 == 和赋值运算符 = 是两个完全不一样的运算符,不要混淆。有时候可能会不小心写出下面代码。**
if (x = 3) //错误的表达式
以上代码中,原本是 x == 3,但不小心写成 x = 3。此时这个式子表示变量 x 的赋值是 3,它的返回值是3,这样 if 判断总是为真。为了防止这种错误发生,有的程序员喜欢将变量写在等号右边。
if (3 == x)
如果此时不小心把表达式写成 3 = x,运行时编译器就会报错,所以把变量写在等号的右边就可以防止更多错误发生。
还有一个需要避免的错误是:多个运算符不宜连用。
i < j < k
以上例子中连续使用了两个小于运算符,这是合法的表达式也不会报错,但是达不到我们想要的效果。
它最后运行的结果是
(i < j) < k
正确的写法是需要用到逻辑运算符&&
i < j && j < k
逻辑运算符以下会介绍。
3、逻辑运算符:&&,||,!
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
! :逻辑取反运算符(改变单个表达式的真假)。
&& :与运算符,就是并且的意思(两侧表达式都为真,则为真,否则为假)。
|| :或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
3.1、逻辑取反运算符
变量 flag 如果为假,需要用 ! 它就可以为真。
if (!flag)
{
printf("do something\n");
}
相反,如果 flag 为真,那么 !flag 就会为假。
3.2、与运算符
&& 与运算符是一个双目操作符,使用的方式是 a&&b,&& 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。
比如:月份3月到5月,是春天,代码需要怎么写呢?
#include <stdio.h>
int main()
{
int month = 0;
sancf ("%d", &month);
if (month >= 3 && month <= 5)
{
printf("春季\n");
}
return 0;
}
这里的表达式意思是month既要大于等于3,也要小于等于5,必须同时满足。
3.3、或运算符
|| 或运算符也是一个双目操作符,操作的方法是 a || b, ||两边的表达式只要有一个为真,整个表达式就为真,两边的表达式都为假的时候,才为假。
比如:月份是12月或者1月或者2月是冬天,代码需要怎么写呢?
#include <stdio.h>
int main()
{
int month = 0;
sancf ("%d", &month);
if (month == 12 || month == 1 || month == 2)
{
printf("春季\n");
}
return 0;
}
3.4、短路
C语言的逻辑运算符有一个特点,它总是先对表达式的左侧先求值,再对右侧求值,如果表达式的左侧满足了逻辑运算符的条件,就不再会对右侧求值。
if (month >= 3 && month <= 5)
如果表达式左侧的 month 没有大于等于3,也就是整个表达式的结果为假,那么表达式右侧也再也不会求值。
if (month == 12 || month == 1 || month == 2)
如果表达式左侧的 month 等于 12,整个表达式的结果为真 ,那么表达式的右侧再也不会求值。
像这种仅仅知道根据表达式左侧的结果就能知道整个表达式的结果,不再对右侧进行运算成为短路求值。
4、switch语句
除了 if 语句外,还有 switch 语句实现分支结构。
switch 是一种特殊的 if…else 结构,用于判断多个结果的情况,把 else if 改成更易用易读的形式。
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day) //表达式
{
case 1:
printf("周一");
break;
case 2:
printf("周二");
break;
case 3:
printf("周三");
break;
case 4:
printf("周四");
break;
case 5:
printf("周五");
break;
case 6:
printf("周六");
break;
case 7:
printf("周日");
break;
default:
printf("输入错误");
break;
}
return 0;
}
运行时输入数字1到7就会相应地显示出周几。
- 根据表达式不同的值,执行相应的 case 分支。如果找不到对应的值则执行 default 的分支。switch ( ) 里的表达式必须是整型表达式,case 后的值必须是整型是整型表达式。
- 如果在 case 分支下不使用 break,代码就会继续执行下去,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句才会结束。并不是说每个 case 下必须要有 break,要根据实际情况使用 break。
- switch 中 case 和 default 没有顺序要求的,不过通常把 default 放在最后处理。