C语言操作符2

简介: C语言操作符2

       在这篇文章中,主要讲解关系操作符、条件操作符、逻辑操作符,及其短路。


一. 关系操作符

       C语言用于比较的表达式,称为关系表达式,里面运用的运算符就称“关系运算符”,主要有下面6个:

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

关系表达式通常返回0或者1,表示真假 。关系表达式常用于if或while结构。(if:https://blog.csdn.net/wait___wait/article/details/134805824?spm=1001.2014.3001.5502

(while:https://blog.csdn.net/wait___wait/article/details/135158422?spm=1001.2014.3001.5502

C语言中,0表示假,非0表示真。如:

20 > 12//返回1

12 > 20//返回0

printf("%d", 2 == 2);//打印1

       注意1:相等运算符==与赋值运算符是两个不一样的运算符,不能混淆。

有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。(赋值运算符:https://blog.csdn.net/wait___wait/article/details/135242898?spm=1001.2014.3001.5502

if (x = 3)...

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

为了防止这种错误,可以将变量写在等号的右边。 这样的话,如果把==误写成=,编译器会报错,因为左操作符不能为常量

if (3==x)...

       注意2:多个关系运算符不宜连用

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 && age <= 36)
  {
    printf("青年\n");
  }
  return 0;
}
//输入34
//打印青年

而如果我们这样写

//输入一个年龄,如果年龄在18岁-36岁之间,就输出青年
#include<stdio.h>
int main()
{
  int age = 0;
  scanf("%d", &age);
  if (18 <= age <= 36)
  {
    printf("青年\n");
  }
  return 0;
}

这是因为,我们先拿18和age中存放的10比较,表达式18 <= 10为假,18 <= 10 的结果是0,再拿0和36 比较, 0 < 36 为真,所以打印了青年 。所以即使age是10的时候,也能打印青年。

二. 条件操作符(也叫三目操作符)

       与单目操作符和双面操作符类似,(单目操作符和双目操作符:https://blog.csdn.net/wait___wait/article/details/135242898?spm=1001.2014.3001.5502三目操作符,需要接受三个操作数,形式如下:

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", &a);
  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)//if(flag == 0)
  {
    printf("do something\n");
  }
  return 0;
}

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

3.2与运算符(双目操作符)

       &&就是与运算符,使用方式是  a && b ,&&两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则这个表达式为假。(全真即真,有假即假)

比如:我们说月份3到5月是春天

#include<stdio.h>
int main()
{
  int month = 0;
  scanf("%d", &month);
  if (month >= 3 && month <= 5)//这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足
  {
    printf("春季\n");
  }
}

3.3或运算符(双目操作符)

        ||运算符是或者的意思,使用方式是 a || b  。||两边的表达式只要有一个是真,整个表达式就是真,两边表达式都为假的时候,才为假。(全假则假,有真即真)

比如:我们说一年中,月份是12月或者1月或者2月是冬天

#include<stdio.h>
int main()
{
    int month = 0;
    scanf("%d", &month);
    if(month == 12 || month ==1 || month ==2)
    printf("冬季\n");
    return 0;
}

练习:闰年的判断

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

闰年的判断规则:

  1. 能被4整除并且不能被100整除的是闰年
  2. 能被400整除的是闰年
#include<stdio.h>
int main()
{
  int year = 0;
  scanf("%d", &year);
  if ((year / 4 == 0 && year / 100 != 0) || (year / 400) == 0)
  {
    printf("%d是闰年\n", year);
  }
  else
    printf("%d不是闰年\n", year);
  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时,就无需执行右操作数。(遇到真停)

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

(前置++和后置++:https://blog.csdn.net/wait___wait/article/details/135242898?spm=1001.2014.3001.5502

练习:阅读代码,计算代码输出的结果

#include<stdio.h>
int main()
{
  int i = 0, a = 0, b = 2,c =3, d = 4;
  i = a++ && ++b && d++;//该表达式是逻辑表达式,&&操作符会短路:遇到假停。
  //a++先使用再加1,返回0后a=1,返回值0为假,后边的操作数不再执行,
  printf("a=%d b=%d c=%d d=%d i=%d", a, b,c, d, i);
  return 0;
}

运行结果:


#include<stdio.h>
int main()
{
  int i = 0, a = 0, b = 2,c =3, d = 4;
  i = a++ || ++b || d++;// ||操作符会短路:遇到真停。
  //a++先使用再加1,返回0后a=1,程序继续执行
  // ++b先加1后使用,b+1=3后返回1,返回值为真,后边的操作数不再执行,
  printf("a=%d b=%d c=%d d=%d i=%d", a, b,c, d, i);
  return 0;
}


欢迎斧正!!!

期待你的


目录
相关文章
|
2天前
|
C语言
C语言逻辑操作符的短路问题
C语言逻辑操作符的短路问题
|
3天前
|
编译器 C语言
【C语言】:中移位操作符,位操作符详运算规则详解
【C语言】:中移位操作符,位操作符详运算规则详解
6 1
|
6天前
|
存储 编译器 C语言
C语言---操作符详解(1)
C语言---操作符详解
|
13天前
|
存储 C语言 索引
【C语言基础】:操作符详解(二)
【C语言基础】:操作符详解(二)
|
21天前
|
编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
24 3
|
22天前
|
存储 C语言
C语言:详解操作符(下)
C语言:详解操作符(下)
19 3
|
21天前
|
C语言
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
13 1
|
21天前
|
存储 编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)一
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)一
20 1
|
3天前
|
算法 C语言
【C语言】:巧用移位操作符,位操作符解决问题
【C语言】:巧用移位操作符,位操作符解决问题
6 0
|
3天前
|
编译器 C语言
【C语言】:sizeof操作符的使用和各种常见数据类型的大小
【C语言】:sizeof操作符的使用和各种常见数据类型的大小
7 0