C语言:关系操作符、逻辑操作符

1、关系操作符

C语言用于比较的表达式,称为“关系表达式” (relational expression),里面使用的运算符就称为“关系运算符” (relational operator),主要有下面6个。

  • > 大于运算符
  • < 小于运算符
  • >= 大于等于运算符
  • <= 小于等于运算符
  • == 相等运算符
  • != 不相等运算符

下面是一些例子:

1 a == b;
2 a != b;
3 a < b;
4 a > b;
5 a <= b;
6 a >= b;

关系表达式通常返回 0 或 1,表示真假。

C语言中, 0 表示假,所有非0值表示真。比如, 20>12 返回1, 12>20 返回0.

关系表达式常用语 if while 结构。

1 if (x == 3){
2     printf("x is 3.\n");
3 }

注意:相等运算符 == 与赋值运算符 = 两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。

1 if(x = 3) ...

上面的示例中,原意是 x == 3,但不小心写成 x = 3。这个式子表示对变量x赋值3,它的返回值为3,所以if判断总是为真。

为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。

1 if(3 == x) ...

这样的话,如果把 == 误写成 =,编译器就会报错。

1 /* 报错 */
2 if(3 = x) ...

另一个需要避免的错误是:多个关系运算符不宜连用。

i < j < k

 上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但通常达不到想要的结果,即不是保证变量j的值在i和k之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。

(i < j) < k

上面式子中, i < j返回0或1,所以最终是0或1与变量k进行比较。如果想要判断变量j的值是否在i和k之间,应该使用下面的写法。

i < j && j < k

 比如:我们输入一个年龄,如果年龄在18岁~36岁之间,我们输出青年。

如果我们这样写

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d",&age);
	if (18 <= age <= 36)
	{
		printf("青年\n");
	}
	return 0;
}

运行代码:

 这是因为,我们先拿18和age中存放的15比较,表达式18 <= 15为假,18 <= age的结果是0,再拿0和36比较,0<= 36为真,所以打印了青年,所以即使当age是15的时候,也能打印青年,逻辑上是有问题,这个代码应该怎么写呢?

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d",&age);
	if (18 <= age && age <= 36)
	{
		printf("青年\n");
	}
	return 0;
}

以上就是关系操作符,我们需要掌握的,剩下的只要按照字面意思理解使用就行,没有特别注意的。


2、逻辑操作符: &&,||,!

逻辑操作符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

  • ! :逻辑取反运算符(改变单个表达式的真假)
  • && : 与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)
  •  ||   : 或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)

2.1、逻辑取反运算符

比如,我们有一个变量叫 flag, 如果flag为假,要做一个什么事情,就可以这样写代码:

1 if(!flag)
2 {
3    printf("do something\n");  
4 }    

如果flag为真,!flag就是假,如果flag为假,!flag就是真

所以上面的代码的意思就是flag为假,执行if语句中的代码。

2.2、与运算符

&& 就是与运算符,也就是并且的意思, &&是一个双目操作符,使用的方式是a&&b,&&两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。

比如:如果我们说月份是3月到5月,是春天,那使用代码怎么提现呢?

int month = 0;
scanf("%d",&month);
if(month >= 3 && month <= 5)
{
    printf("春季\n");
}

这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足。

2.3、或运算符

|| 就是或运算符,也就是或者的意思,||也是一个双目操作符,使用的方式是 a || b, || 两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

比如:我们说一年中月份是12月或者1月或者2月是冬天,那么我们怎么使用代码体现呢?

int month = 0;
scanf("%d",&month);
if(month == 12 || month == 1 || month == 2)
{
    printf("冬季\n");
}

2.4、练习:闰年的判断

输入一个年份year,判断year是否是闰年

闰年判断的规则:
1、能被4整除并且不能被100整除是闰年
2、能被400整除是闰年

参考代码:

//代码1
#include <stdio.h>
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
#include <stdio.h>
int main()
{
	int year = 0;
	scanf("%d", &year);
	if (year % 4 == 0 && year % 100 != 0 || year%400 == 0)
		printf("是闰年\n");
	return 0;
}

2.5、短路

C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”

如前面的代码:

if(month >= 3 && month <= 5 )

表达式中&&的左操作数是 month >= 3,右操作数是 month <= 5, 当左操作数 month>=3的结果为0的时候,即使不判断 month <= 5,整个表达式的结果也是0 (不是春季)。

所以,对于 && 操作符来说,左边操作数的结果为0时,将不再执行右操作数。

例如:

#include <stdio.h>

int main()
{
    int a = 0;
    int b = 1;
    if(a++ && b++)
        printf("true");
    else
        printf("a=%d,b=%d",a,b);
    return 0;        
}

运行结果:

 注意:a++表示先用再加,++a表示先加后用

在上面的代码中,在if语句中,a++由于先用后加,所以此时a++为0。由于与运算的短路特性,if语句中表达式直接为0,直接跳到else语句,不再计算b++,因此a=1,b=1。

对于||操作符,如果左操作符为真时,右操作符不再计算。

像这种仅仅根据左操作数结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值