C语言中的操作符

目录

一:逻辑操作符

二:条件操作符

三:逻辑操作符:&&,||,!

3.1逻辑取反运算符

3.2与运算符

3.3或运算符

四:练习——闰年的判断

五:短路


一:逻辑操作符

   C 语言用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称
为“关系运算符”(relational operator),主要有下面6个。
 • > 大于运算符
 • < ⼩于运算符
 • >= ⼤于等于运算符
 • <= ⼩于等于运算符
 • == 相等运算符
 • != 不相等运算符
下面是一些例子
a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;
  关系表达式通常返回 0 或 1 ,表示真假。
  C 语言中, 0 表示假,所有非零值表示真。比如, 20 > 12 返回 1 , 12 > 20 返回 0 。
  关系表达式常用于 if 或 while 结构。
if (x == 3) {
 printf("x is 3.\n");
}

注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不小心写出下⾯的代码,它可以运行,但很容易出现意料之外的结果。
  上面示例中,原意是 x == 3 ,但是不小心写成 x = 3 。这个式子表示对变量 x 赋值 3 ,它的返
回值为 3 ,所以 if 判断总是为真。
  为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。
  这样的话把==打成=编译器就会出错。
  另⼀个需要避免的错误是:多个关系运算符不宜连用。
i < j < k
//假设i==10,j==6,k==14
//依然会输出结果
//原因是:先算i<j,不成立为假,假的结果是0,而0恒小于k,所以这个条件恒成立

  上面示例中,连续使用两个小于运算符。这是合法表达式不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执行的是下⾯的表达式。
  上面式子中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 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;
}
当我们输入10的时候,依然输出青年,如下图:

 

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

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age>=18 && age<=36)
 {
 printf("⻘年\n");
 }
 return 0;
}
  以上就是关于操作符,我们需要掌握的,剩下的只要按照字面意思理解使用就行,没有特别注意的。

二:条件操作符

条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:
         exp1 ? exp2 : exp3
  条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果
exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
  练习1:使用条件操作符表示下面代码的逻辑
#include <stdio.h>
int main()
{
 int a = 0;
 int b = 0;
 scanf("%d %d", &a, &b);
 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 %d", &a, &b);
 b = a>5 ? 3:-3;
 printf("%d\n", b);
 return 0;
}
 练习2:使用条件表达式实现找两个数中较大值
#include <stdio.h>
int main()
{
 int a = 0;
 int b = 0;
 scanf("%d %d", &a, &b);
 int m = a>b ? a : b;
 printf("%d\n", m);
 
 return 0;
}

三:逻辑操作符:&&,||,!

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
! :逻辑取反运算符(改变单个表达式的真假)
&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
  注:C语⾔中,⾮0表示真,0表示假

3.1逻辑取反运算符

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

#include <stdio.h>
int main()
{
 int flag = 0;
 if(!flag)
 {
 printf("do something\n");
 }
 return 0;
}

 如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真 所以上⾯的代码的意思就是 flag 为假,执行if语句中的代码。

3.2与运算符

   && 就是与运算符,也是并且的意思, && 是一个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。
   比如:如果我们说月份是3月到5月,是春天,那使用代码怎么体现呢?
#include<stdio.h>
{
int month = 0;
 scanf("%d", &month);
 if(month >= 3 && month <= 5)
 {
 printf("春季\n");
 }
return 0;
}

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

3.3或运算符

  || 就是或运算符,也就是或者的意思, || 也是⼀个双目操作符,使用的方式是 a || b ||
两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
比如:我们说⼀年中月份是12月或者1月或者2月是冬天,那么我们怎么使用代码体现呢?
int month = 0;
scanf("%d", &month);
if(month == 12 || month==1 || month == 2)
{
 printf("冬季\n");
}

四:练习——闰年的判断

输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
1. 能被4整除并且不能被100整除是闰年
2. 能被400整除是闰年(百年不闰)
#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
int main()
{
 int year = 0;
 scanf("%d", &year);
 if((year%4==0 && year%100!=0) || (year%400==0))
 printf("是闰年\n");
 
 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时,就无需执行右操作数。
    像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值。
  练习:阅读代码,计算代码输出的结果
#include <stdio.h>
int main()
{
 int i = 0,a=0,b=2,c =3,d=4;
 i = a++ && ++b && d++;
 //i = a++||++b||d++;
 printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
 return 0;
}

逻辑是:a++是后置的,所以是先使用a的值,再使的值加一,a的初始值是0,在C语言中表示假,在与逻辑中,一个假结果就是假,所以后面的值就不再计算。

如果把&&改成||呢?

  逻辑是:a++是后置的,所以是先使用a的值,再使的值加一,a的初始值是0,在C语言中表示假,在或逻辑中,都是假结果就是假,但之后所有的字母均大于0,所以后面的值就均计算。


  好啦!关于操作符的讲解就到这里结束了,如果还有不懂的知识点或者是本篇文章有不对的地方,欢迎在评论区里评论出来。友友们,下一篇讲解C语言另一个选择语句——switch语句!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖剹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值