欢迎光临
我们一直在努力

零基础学习c语言---操作符详解

前言:

在学习操作符之前,我们需要了解一下各种进制之间的转化

(一)操作符的分类

(1)算数操作符:+,-,*,%,/

(2)移位操作符:>>,<<

(3)位操作符:&,|,^

(4)赋值操作符:=,+=,-=,*=,/=,%=,<<=,>>=,&=,,|=,^=

(5)单目操作符:!,++,–,&,*,+,-,~,sizeof

(6)关系,逻辑,条件操作符:>,>=,<,<=,==,!=

(7)逗号表达式:,

(8)下标引用:[]

(9)函数调用:()

在这里就不具体介绍算数,关系,逻辑,条件操作符了,在之前的文章中提到过,如果不了解可以到分支与循环上的文章中学习。

在学习这些操作符之前,我们需要先学习,原码,反码和补码 其实在计算机中,数据是以二进制的形式表示和存储的,而整型的二进制表示方式有三种,分别是原码,反码和补码。

(0)原码,反码和补码:

有符号整数的三种表示方法均有符号位和数值位两部分,在二进制序列中,最高位的1位被当作符号位,剩下的都是数值位,符号位都是用0表示正,用1表示负,

⚠️:正整数的原,反,补都相同,而负整数的三种表示方法各不相同

原码:直接将数值按照正负数的形式翻译成二进制就是原码

反码:原码符号位不变,其他位取反

补码:反码+1就是补码

比如正整数2的原,反,补码都为: 0000000000000000000000000000010

而负数-1的原码为:10000000000000000000000000000001

                 反码为:11111111111111111111111111111110

                 补码为:11111111111111111111111111111111

⚠️:在计算机系统中,数值一律用补码来表示和存储

(一)移位操作符:<<,>>

(1)左移操作符<<:

移位规则:左边抛弃,右边补0 学习了原,反,补码之后,我们就能更好的理解什么是左边抛弃,右边补0了,如下所示,整数10的补码是:00000000000000000000000000001010

而向左移一位之后就变成为:00000000000000000000000000010100

左移一位的代码如下所示:

#include <stdio.h>

int main()

{
int num=10;
int n=num<<1;
printf("n=%d\\n",n);n是20
printf("num=%d\\n,num);num依旧是10
return 0;
}

(2)右移操作符<<:

移位规则:

1.逻辑右移:右边抛弃,左边补0      

  整数-1的补码是:11111111111111111111111111111111   

  而逻辑右移一位之后就变成为:01111111111111111111111111111111

 2.算数右移:左边用原来该值的符号位填充,右边丢弃

整数-1的补码是:11111111111111111111111111111111 

而算数右移一位之后就变成为:11111111111111111111111111111111

右移代码如图所示:

#include <stdio.h>

int main()

{
int num=10;
int n=num>>1;
return 0;
}

⚠️:对于移位运算符,不要移动负数位 如下图所示

int num=10;
num>>-1;//错误

(二)位操作符:

如下图分别是4个位操作符

⚠️:和移位操作符一样,它们的操作数必须是整数

位操作符的使用规则如下图所示

我们可以用代码来加深一下理解,我们可以对整型2和-3分别使用这三种操作符,来观察一下结果。首先要计算,我们得求出5和-3的补码,然后在进行计算

5:00000000 00000000 00000000 00000101

-3:11111111 11111111 11111111 11111101

#include <stdio.h>

int main()

{
int a=5;
int b=-3;

//5:00000000 00000000 00000000 00000101 补码
//-3:11111111 11111111 11111111 11111101 补码
//5&(-3):00000000 00000000 00000000 00000101 补码
printf("%d\\n",a&b);

//5:00000000 00000000 00000000 00000101 补码
//-3:11111111 11111111 11111111 11111101 补码
//5|(-3):11111111 11111111 11111111 11111101 补码
printf("%d\\n",a|b);

//5:00000000 00000000 00000000 00000101 补码
//-3:11111111 11111111 11111111 11111101 补码
//5^(-3):11111111 11111111 11111111 11111000 补码
printf("%d\\n",a^b);

return 0;
}

⚠️:在计算机系统中,数值一律用补码来表示和存储,运算过程用的也是补码,但输出打印出来的是原码表示的值,所以要将上述最后得到的补码结果取反+1得到原码,才是最后打印在屏幕中的数

学习了这些位操作符之后,我们可以做个练习,要求实现两个整数的交换,之前我们肯定是创建一个临时变量来交换,如下所示

#include <stdio.h>
int main() {
int a = 5, b = 8;
int temp; // 临时变量

// 交换
temp = a;
a = b;
b = temp;

printf("a=%d, b=%d", a, b);
return 0;
}

但在学习了位操作符之后,要求不能创建临时变量来交换两个数,可以使用位操作符来交换,如下所示

#include <stdio.h>
int main()
{
int a = 5, b = 3;
printf("交换前:a=%d, b=%d\\n", a, b);

a = a ^ b;
b = a ^ b; //b=a^b^b
a = a ^ b; //a=a^a^b
//两个相同的数^,结果是0

b:00000000 00000000 00000000 00000011
b:00000000 00000000 00000000 00000011
b^b:00000000 00000000 00000000 00000000

printf("交换后:a=%d, b=%d\\n", a, b);
return 0;
}

(三)下标引用操作符:

具体操作如下所示

int arr[10];//创建数组

arr[3]=10;//使用下标引用操作符

[]的两个操作数是arr和3

(四)函数调用操作符:

接受一个或多个操作符:第一个操作数是函数名,剩余的操作数就是传递给函数的参数

void test1()
{
printf("1");
}

void test2(const char *str)
{
printf("2");
}

#include <stdio.h>

int main()

{
test1(); //这里的()作为函数调用操作符
test2("3"); //这里的()就是函数调用操作符
return 0;
}

(五)操作符的优先级和结合性:

大部分运算符是从左到右执行,少数是从右到左执行,比如赋值操作符=,下面是部分运算符的优先级顺序,从高到低排列

圆括号:()

自增,自减:++,–

单目运算符:+,-

乘除法:*,/

加减法:+,-

关系运算符:<,>

赋值运算符:=

(六)逗号表达式:

从左向右依次执行,整个表达式的结果是最后一个表达式的结果

int a=1;
int b=2;
int c=(a>b,a=b+10,a,b=a+1);
//从左向右,a>b结果是0
a=b+10,a变为12
a=12
b=a+1,b=13
最终表达式的结果就是13

赞(0)
未经允许不得转载:171主机测评 » 零基础学习c语言---操作符详解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址