本节大纲
一、if 语句
二、关系操作符
三、条件操作符
四、逻辑操作符:&&、||、!
三、条件操作符
条件操作符也叫三目操作符(C语言只有一个三目操作符),需要接受三个操作数的,语法形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
比如下面这段我们用可以看懂的if……else……语句所写的代码,是可以拿条件操作符改写的。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
if (a > 5)
b = 3;
else
b = -3;
printf("%d\n", b);
return 0;
}
使用条件操作符改写结果如下,这两段代码的效果是完全一样的。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
b = a > 5 ? 3 : -3;
printf("%d\n", b);
return 0;
}
从上面的示例中我们可以大致了解了条件运算符的使用规则,下面我们来做一个练习,利用条件运算符实现“找出两个整数中的较大值,并打印出来”,大家可以自行编程,下面是我的代码:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int max = 0;
printf("请输入两个整数:");
scanf("%d%d", &a, &b);
max = a > b ? a : b;
printf("这两个整数中,较大值是:%d", max);
return 0;
}
<兴趣拓展——逗号表达式>
在C语言中,逗号运算符(,)用于将多个表达式组合在一起,形成一个逗号表达式。逗号表达式的求值顺序是按照从左到右的顺序,即先计算左侧的表达式,然后计算右侧的表达式。但是,整个逗号表达式的最终结果是最右侧表达式的值。逗号表达式的一般形式如下:
expression1, expression2, ..., expressionN;
其中,expression1 到 expressionN 是按顺序计算的表达式。
逗号表达式需要通常用于循环中,特别是在需要在每次迭代中执行多个操作时。
四、逻辑操作符:&&、||、!
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
· ! :逻辑取反运算符(改变单个表达式的真假)。
· && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
· || :或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
(一)、逻辑取反运算符 !
比如,我们有一个变量叫 flag ,如果flag为假,要做一个什么事情,就可以这样写代码:
#include <stdio.h>
int main()
{
int flag = 0;
if (!flag)
//这句话等同于 if(flag == 0)
//这句话也等同于 if(!flag == 1)
{
printf("do something\n");
}
return 0;
}
如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真
所以上面的代码的意思就是 flag 为假,执行if语句中的代码。
(二)、与运算符 &&
&& 就是与运算符,是并且的意思, && 是一个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。
比如我们想表达“输入一个月份,如果是3月份到5月份,那就打印‘春季’”,实现这段代码就可以使用与运算符实现,代码如下:
#include <stdio.h>
int main()
{
int month = 0;
printf("请输入一个月份:");
scanf("%d", &month);
if (month >= 3 && month <= 5)
printf("春季");
return 0;
}
这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足,才能打印“春季”。
(三)、或运算符 ||
|| 就是或运算符,也就是或者的意思, || 也是一个双目操作符,使用的方式是 a || b , || 两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
比如我们想表达“输入一个月份,如果是12月份、1月份或者2月份,那就打印‘冬季’”,实现这段代码就可以使用或运算符实现,代码如下:
#include <stdio.h>
int main()
{
int month = 0;
printf("请输入一个月份:");
scanf("%d", &month);
if (month == 12 || month == 1 || month == 2)
printf("冬季");
return 0;
}
(四)、练习——闰年的判断
经过上面的学习,我们已经可以独立完成一些较为复杂的程序了,比如说我们接下来完成一个“判断闰年”的练习,判断闰年的规则为:能被4整除并且不能被100整除的是闰年或者能被400整除的也是闰年。
我们可以独立编写代码实现上面所说的功能,我给出两种解决方式,第一种使用if嵌套语句来实现,第二种使用与运算符与或运算符的综合使用来实现。
下面是这两种解决方式的代码:
//方法一
#include <stdio.h>
int main(){
int year = 0;
printf("请输入一个年份:");
scanf("%d", &year);
if (year % 4 == 0 && year % 100 != 0)
printf("您输入的年份是闰年");
else if (year % 400 == 0)
printf("您输入的年份是闰年");
else
printf("您输入的年份不是闰年");
return 0;
}
//方法二
#include <stdio.h>
int main(){
int year = 0;
printf("请输入一个年份:");
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0)|| (year % 400 == 0))
printf("您输入的年份是闰年");
else
printf("您输入的年份不是闰年");
return 0;
}
(五)、短路
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是固定的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
比如上面(二)中示例的代码:
if (month >= 3 && month <= 5)
表达式中 && 的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的
结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行。
对于 || 操作符,我们结合上面(三)中示例的代码:
if (month == 12 || month == 1 || month == 2)
如果month == 12,则不用再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。
所以, || 操作符的左操作数的结果不为0时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
这种短路问题往往会在大学《C语言程序设计》课程的测试中出现给一段程序让我们写程序结果的问题,比如我们看下面这段代码并计算代码输出的结果:
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("i = %d a = %d b = %d c = %d d = %d\n",i, a, b, c, d);
i = a++ || ++b || d++;
printf("i = %d a = %d b = %d c = %d d = %d\n", i, a, b, c, d);
return 0;
}
这段代码的运行结果为: