C语言操作符详解

本文详细介绍了C语言中的各种操作符,包括算术、移位、位、赋值、单目、关系、逻辑、条件和逗号操作符。特别讨论了移位操作符(<<和>>)以及位操作符(&、|、^)的工作原理,强调了它们在处理二进制数时的注意事项。还探讨了单目操作符如逻辑非(!)、取地址符(&)、按位取反(~)以及指针解引用(*)的使用。此外,文章还讲解了条件操作符(三目操作符)和逗号表达式的应用。
摘要由CSDN通过智能技术生成

1. 算术操作符

 + 			-			*			/			%
  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。

  3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

2. 移位操作符

2.1 整数二进制的表现形式

  • 有三种表现形式:原码、反码、补码
    (正整数的原码、反码、补码都是相同的)
    (负整数的原码、反码、补码是要计算的)
  • 原码:根据正负直接写出的二进制序列就是原码
    (不管正整数还是负整数都可以直接写出二进制原码)
  • 反码:原码的符号位(0为正1为负)不变,其他的按位取反,得到的就是反码
  • 补码:反码+1就是补码
    (整数在内存中存储的是补码)
    (计算机也是用补码计算的)
  • 1个整数是4个字节 = 32 bit位
正整数:10
原码:00000000000000000000000000001010
反码:00000000000000000000000000001010
补码:00000000000000000000000000001010
负整数:-10
原码:10000000000000000000000000001010
反码:11111111111111111111111111110101
补码:11111111111111111111111111110110

2.2 ‘’<<''左移操作符

<< —左移操作

  • 算术左移:
    将一个二进制数向左移动指定的位数,并在最低位补0。在算术左移中,符号位不变,因此可以保持负数的符号不变
  • 逻辑左移:
    将一个二进制数向左移动指定的位数,并在最低位补0。在逻辑左移中,符号位也会被移动,因此可能会改变负数的符号
  • 左移 << 每移一位相当于乘2
    在这里插入图片描述
    在这里插入图片描述
    警告⚠ :
    对于移位运算符,不要移动负数位,这个是标准未定义的。

2.3 ">>''右移操作符

”>>"—右移操作符

  • 算术右移:
    将一个二进制数向右移动指定的位数,并在最高位补符号位。在算术右移中,符号位不变,因此可以保持负数的符号不变
  • 逻辑右移:
    逻辑右移是指将一个二进制数向右移动指定的位数,并在最高位补0。在逻辑右移中,符号位也会被移动,因此可能会改变负数的符号
  • C语言中没有明月规定到时算术右(左)还是逻辑右(左),一般编译器上采用的是算术右(左)
  • 右移 >> 每一移位相当于正整数除2取整(负数则取整后在减一)
    在这里插入图片描述
    在这里插入图片描述
    警告⚠ :
    对于移位运算符,不要移动负数位,这个是标准未定义的。

3. 位操作符

3.1 ‘’&''按位与

& —按位与

  • 按位与:对应二进制有0则为0,俩个同时为1则为1
    在这里插入图片描述
    在这里插入图片描述
    以上俩张图只有在计算的时候,要注意操作数的正负,原码、反码、补码和正负整数之间的关系

3.2 ‘’|''按位或

| —按位或

  • 按位或:对应的二进制位有1则为1,俩个同时为0则为0
    在这里插入图片描述
    在这里插入图片描述

3.3 "^''按位异或

^ —按位异或

  • 按位异或:对应的二进制位相同为0,相异为1
  • 这里利用一个题目来促进理解:
定义俩个整型变量,并且交换俩个数的值
//这里只显示main()部分的函数内容
int main()//方法一
{
   
    int a = 1;
    int b = 2;
    int tem;
    //换值
    tem = a;
    a = b;
    b = a;
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    return 0;
}
//这里只显示main()部分的函数内容
int main()//方法二
{
   
    int a = 1;
    int b = 2;
    //换值
    a = a + b;//将a+b(3)的值赋给a(3)
    b = a - b;//用a(3)的值减b(2),得到1,再赋值给b
    a = a - b;//用a(3)的值减b(1),得到2,再赋值给a
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    return 0 ;
}

这里附上方法二的结果显示:
在这里插入图片描述
接下来要用的就是我们刚刚学的这个"^"按位异或操作符的用法:

//这里只显示main()部分的函数内容
int main()//方法三
{
   
    int a = 1;
    int b = 2;
    //换值
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    return 0;
}

你可能看到一个这样的代码很蒙,别急先看代码运行结果:
在这里插入图片描述

//这里只拿换值部分的代码来解读
值:	3				1				2
代码:	a		=		a		^		b
二进制 :011		       001			   010
	   //根据''^''的使用规则,可以知道a ^ b == 001 ^ 010 == 011 == 3
————————————————————————————————————————————————————————————————————
值:	1				3				2
代码:	b		=		a		^		b
二进制 :001		       011			   010
       //根据''^''的使用规则,可以知道a ^ b == 011 ^ 010 == 001 == 1
————————————————————————————————————————————————————————————————————       
值:	2				3				1
代码:	a		=		a		^		b
二进制 :010		       011			   001
       //根据''^''的使用规则,可以知道a ^ b == 011 ^ 001 == 010 == 2

其实"^"按位异或在这个代码中就是一个规律:

								c = a ^ b
								a = c ^ b
								b = a ^ c

这样理解的话是不是就简单多了呢?不急接下来还有"^"按位异或的特性没说呢


代码:	b		==		a		^		a		^		b
二进制:	|			   001 			   001			   010
过程:	|				|_______________|               |
        |                        |						|
        |                       000  					|
        |                        |______________________|
        |                       			|
        |——————————————————————————————————010 
———————————————————————————————————————————————————————————————————
代码:   b		==		a		^		b		^		a
二进制:	|			   001			   010			   001
过程:	|				|_______________|               |
        |                        |						|
        |                       011  					|
        |                        |______________________|
        |                       			|
        |——————————————————————————————————010 
  • 根据这个流程图,应该就可以看出:
  1. "^"按位异或是支持交换律的
  2. 俩个相等的值按位异或的话得到的一定是0
  3. 任何数按位异或0得到都是那个数的本身值

4. 赋值操作符

+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=

以上就是c语言中所有的赋值操作符了,具体的使用也是非常的简单:

	a += b	/	a = a + b
	a -= b	/	a = a - b
	a *= b	/	a = a * b
	a /= b	/	a = a / b
	a %= b	/	a = a % b
	a >>= b	/	a = a >> b
	a <<= b	/	a = a << b
	a &= b	/	a = a & b
	a |= b	/	a = a | b
	a ^= b	/	a = a ^ b

以上就是赋值操作符的用法!

5. 单目操作符

5.1 单目操作符介绍

  • 单目操作符就是只有一个操作数的控制的操作符

5.1.1 "!''逻辑反操作符

!—逻辑反操作符

  • 逻辑反操作符:它的作用是将一个布尔值取反,即将 true 变为 false,将 false 变为 true。(如果一下子不知道是布尔值什么意思,别急你暂时就先理解成反义词的概念,本来是"大"加个 “!” 就变成"小"的意思了,后面的小结我会解释布尔值、false、true的意思)
  • 来个代码促进理解:
#include<stdio.h>
int main()
{
   
    int num = 0;
    do
    {
   
        num++;
    } while (!num);//num=0,!num就不为0,反而当num不为0时,!num就为0
    //应为在C语言中0为假,非0为真
    printf("num = %d\n", num);
    return 0;
}

代码结果为:

num = 1

  • 一个代码不够那我们就再来一个:
#include<stdio.h>
int main()
{
   
    int num = 0;
    while (num != 10)//当num不等于10的时候为真就进入循环,否则退出
    {
   
        num++;
    }
    printf("num = %d\n", num);
    return 0;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值