C语言——操作符(中)单目操作符、关系、逻辑、条件操作符

简介: C语言——操作符(中)单目操作符、关系、逻辑、条件操作符

前言

前面我们学习了操作符中的算术、移位、位、赋值操作符。今天我们再来研究单目操作符、关系、逻辑、条件操作符。


dca2361598714dbcaf6ea580feb8c51c.png


单目操作符

单目操作符介绍


!         逻辑反操作
-         负值
+         正值
&         取地址
sizeof    操作数的类型长度(以字节为单位)
~         对一个数的二进制按位取反
--        前置、后置--
++        前置、后置++
*         间接访问操作符(解引用操作符)
(类型)    强制类型转换


我们来代码演示一下>

int main()
{
  int flag = 5;
  if (!flag)//对flag取反后判断是否为0
  {
    printf("hello\n");
  }
  else
  {
    printf("hehe\n");
  }
  return 0;
}


593e0c73ee7244d494f20e4b938c1ac9.png


结果打印是“hehe”可以看出!是有一个取反的操作,屏幕上输出else中的语句。

int main()
{
  int a = 10;
  printf("%d\n", -a);
  printf("%d\n", +a);//+一般省略
  printf("%p\n", &a);
  printf("%d\n", sizeof(a));
  printf("%d\n", ~a);
  a = 10;
  printf("%d\n", a--);
  a = 10;
  printf("%d\n", --a);
  a = 10;
  printf("%d\n", a++);
  a = 10;
  printf("%d\n", ++a);
  return 0;
}


8d3aea38fba24c29bf3aa2f5d1a4859b.png

我们再来深入研究一下sizeof和数组之间的关系>

void test1(int arr[])
{
  printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
  printf("%d\n", sizeof(ch));//(4)
}
int main()
{
  int arr[10] = { 0 };
  char ch[10] = { 0 };
  printf("%d\n", sizeof(arr));//(1)
  printf("%d\n", sizeof(ch));//(3)
  test1(arr);
  test2(ch);
  return 0;
}


(1)(2)分别会输出什么呢?

(3)(4)分别会输出什么呢?


9056c5500b404fa796b3449bc5bece45.png


我们可以看到同样都是sizeof(arr),sizefo(ch),为什么输出的结果都不一样呢?

这就要回顾我们之前讲过的>

当数组传参的时候,实际上只是把数组的首元素地址传递过去了。

所以即使在函数参数部分写成数组形式:int arr[]表示依然是一个指针:int * arr。

那么sizeof(arr)的结果是4.


数组知识详解


//++和--运算符
//前置++和--
int main()
{
  int a = 10;
  int x = ++a;
  //先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。
  int y = --a;
  //先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10;
  return 0;
}


//后置++和--
int main()
{
  int a = 10;
  int x = a++;
  //先对a先使用,再增加,这样x的值是10;之后a变成11;
  int y = a--;
  //先对a先使用,再自减,这样y的值是11;之后a变成10;
  return 0;
}

关系操作符

>
>=
<
<=
!=  用于测试“不相等”
==    用于测试“相等”


这些就很简单了,就不再多讲了

警告⚠:

请不要将==写成=喔!!!

逻辑操作符

逻辑操作符有哪些:

&&   逻辑与
||      逻辑或


区分逻辑与按位与

区分逻辑或按位或

1&2----->0
1&&2---->1
1|2----->3
1||2---->1


cdc1dc5d50f349549889fd363023b074.png


我们来看一道360的面试题>

int main()
{
  int i = 0, a = 0, b = 2, c = 3, d = 4;
  i = a++ && ++b && d++;
  printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
  return 0;
}

&&表达式中有假则为假,当计算出一个为假的时候后面的就不参与运算,那么i = a++ && ++b && d++;中只会执行到a++,我们来看看运行结果>



64fc2cd8845f4a7c8bb631fde02bbe8f.png


我们把题目变一下>

int main()
{
  int i = 0, a = 0, b = 2, c = 3, d = 4;
  i = a++||++b||d++;
  printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
  return 0;
}

||表达式中有真则真当计算出来为真的时候就停止运算,那么i = a++||++b||d++;中执行到++b,就不会继续执行下去,我们来看看运算结果>


dcbe5e87603d445a85339840551ba2e1.png


条件操作符

条件操作符也称三目运算符

exp1 ? exp2 : exp3


我们来举个例子练习一下>

if (a > 5)
    b = 3;
else
    b = -3;


这些代码完全可以写成条件操作符>

a>5?b=3:b=-3


再来一个例子>

int main()
{
  int a = 10;
  int b = 20;
  int m = 0;
  if (a > b)
    m = a;
  else
    m = b;
  m = (a > b ? a : b);//完全可以用这一行代码代替上面四行代码
  return 0;
}


小结

今天我们学习了单目操作符、关系、逻辑、条件操作符,相信大家看完有一定的收获。


种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波~~~,本文中也有不足之处,欢迎各位随时私信点评指正!

相关文章
|
1天前
|
存储 C语言 索引
【C语言基础】:操作符详解(二)
【C语言基础】:操作符详解(二)
|
1天前
|
存储 编译器 C语言
【C语言基础】:操作符详解(一)
【C语言基础】:操作符详解(一)
TU^
|
1天前
|
存储 C语言
C语言之操作符
C语言之操作符
TU^
6 0
|
10天前
|
C语言
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
10 1
|
10天前
|
编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
16 3
|
10天前
|
存储 编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)一
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)一
17 1
|
10天前
|
存储 C语言
C语言:详解操作符(下)
C语言:详解操作符(下)
13 3
|
10天前
|
存储 编译器 C语言
C语言:详解操作符(上)
C语言:详解操作符(上)
|
C语言
《啊哈C语言!逻辑的挑战(修订版)》| 每日读本书
“用编程轻松提升逻辑力!每个人都应该学习如何编程,因为它教会你如何思考。——史蒂夫.乔布斯” 。每日搜罗最具权威专业书籍,更多图书请关注“每日读本书”。
3174 0
|
2天前
|
算法 Unix Linux
C语言随机数的产生(rand、srand、time函数细节讲解)
C语言随机数的产生(rand、srand、time函数细节讲解)