C:操作符介绍-学习笔记

news2024/11/17 0:54:55

目录

引言:

1、操作符的分类:

2、原码,反码,补码 

2.1 介绍

2.2 作用

3、移位操作符:>>、 <<

3.1 左移操作符 :<<

3.1.1 正整数移动

3.1.2 负整数移动

3.2 右移操作符:>>

3.3 一些总结

 4、位操作符:&、|、^、~

4.1 按位与:& 

4.2 按位或: |   

4.3 按位异或:^ 

4.4 按位取反: ~

5、逗号表达式 :,

6、下标访问[ ]、函数调用()

6.1 下标引用操作符: [ ]

6.2 函数调用操作符:()

 7、算数操作符:+、-、*、/、%

7.1 + 和 -

7.2  * 

 7.3 /

7.4 %

8、赋值操作符:=和复合赋值

8.1 连续赋值

8.2 复合赋值法

8.2.1  += 、 -=

8.2.2  *=  、  /=  、 %=

8.2.3   >>=     <<=

8.2.4  &=      |=     ^=

1、 按位与(&=)&符号名为按位与

2、按位或 ( |=)

3、按位异或:^=

 9、单目操作符:++、--、+、- 、sizeof(类型)

9.1 ++和--

9.1.1 前置++

9.1.2 后置++

9.1.3 前置--

9.1.4 后置--

9.2 +、 -

9.3 sizeof 操作符

补充 size_t 

10、逻辑操作符:!、&&、||

10.1 逻辑 取反运算符 !

10.2 逻辑 与运算符 &&

10.3 逻辑 或运算符 ||

11、操作符的属性:优先级、结合性

11.1 优先级

11.2 结合性

结语:


引言:

本篇文章将为您带来C语言操作符的全面解析,您可以将其视为操作符的百科全书。无论您对哪个操作符的使用有所遗忘,都可以在这里找到所需的知识,让您的编程之路更加顺畅。

注意:本篇文章需要使用到二进制的知识,如果有对二进制不太清楚的,可以点下面链接先看一看,相信对您会有点帮助的!!!

二、八、十、十六进制介绍及相互转换-CSDN博客


1、操作符的分类:

  • 移位操作符:>>、 <<
  • 位操作符:&、|、^、~
  • 逗号操作符:,
  • 下标引用:[ ]
  • 函数调用:()
  • 算术操作符:+、 -、 * 、/、 %
  • 赋值操作符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=
  • 单目操作符:++、--、&、*、+、-、~、sizeof(类型)
  • 关系操作符:>、>=、<、<=、==、、!=
  • 逻辑操作符:&&、||、!
  • 条件操作符:? :
  • 结构成员访问: .   

2、原码,反码,补码 

2.1 介绍

整数的2进制表示方法有三种,即是原码,反码和补码。

有符号的整数的三种表示方法均有符号位数值位两部分,2进制序列中,最高位的1位是被当作符号位,剩余的都是数值位。

符号位都是用 0 表示 “正”,用 1 表示 “负”。

举个例子:int a = -15  int b =10

符号位数值位
10000000000000000000000000001111
00000000000000000000000000001010

一个整型是4个字节,一个字节又有8个bit位,因此,当整数想放到a或b里面,就需要有32个bit位

正整数的原,反,补码都相同。负整数的三种表示方法各不相同。

原码:根据数值正负的情况,直接写出翻译成2进制序列,得到的就是原码;

反码:符号位不变,其他位置按位取反;按位取反就是0变为1,1变为0;

补码:反码+1就是补码。

 int a = -15 

0000000000000000000000000001111   原码

1111111111111111111111111111110000  反码(符号位不变,按位取反)

1111111111111111111111111111110001  补码(反码+1)

补码得到原码也是可以使用:取反+1的操作得到。

2.2 作用

对于整型来说:数据存放内存中其实存放的就是补码。

在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀ 处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

图理关系:(感觉图片怪怪的)

3、移位操作符:>>、 <<

<< 左移操作符

>> 右移操作符

注意:移位操作符的操作数只能是整数

3.1 左移操作符 :<<

移位规则:左边抛弃,右边补0

注:左移移动的是2进制序列。 

3.1.1 正整数移动

#include <stdio.h>
int main()
{
	int n = 10;
	int m = n << 1;    //把n向左移动一位(右边数字是多少,就移动多少位)
	printf("%d", m);
	return 0;
}

移动的效果展示:

如上图,左移一位后结果变为00000000000000000000000000010100

此时的 m = 20,代码结果展示:

从上图我们还能知道:移动后原来的值(n)是不会改变的

比如说:int n = 10; 

              int m = n + 1;

n原来是10,+1后的表达式结果11赋给m,但n本身是不会改变的。

上面的左移操作符亦是如此。

3.1.2 负整数移动

#include <stdio.h>
int main()
{
	int n = -10;
	int m = n << 1;    //把n向左移动一位(右边数字是多少,就移动多少位)
	printf("%d", m);
	return 0;
}

正整数的原反补码相同,因此我们直接写出来的2进制序列就是正整数的补码,但是负整数不同,因此,我们需要先将原码改写成补码。

10000000000000000000000000001010      -10的原码

111111111111111111111111111111110101      -10的反码(符号位不变,其它按位取反) 

111111111111111111111111111111110110       -10的补码(+1,满2进1)

得到补码后,我们开始进行左移操作

  11111111111111111111111111110110        //移动前

111111111111111111111111111101100        //向左移动一位

舍去前面多出来的1,并在后面的空位补上0,因此最后得到的补码是

  11111111111111111111111111101100        //左移1位后的补码

  10000000000000000000000010011       //左移一位后的反码(取反)

  10000000000000000000000010100       //左移一位后的原码(+1)   

  该结果等于 -20 

3.2 右移操作符:>>

移动规则:右移运算分两种:

  1. 逻辑右移:左边用0填充,右边丢弃
  2. 算术右移:左边用原该值的符号位填充,右边丢弃  负数用1填充,正数用0填充。

关于右移运算,是根据编译器来看的,编译器使用的是哪种那你计算就是哪种,在VS上,编译器支持的是算术右移。大部分编译器采用的就是算术右移。

闲言碎语:小编觉得逻辑右移一点也没有逻辑,逻辑右移不管是正整数还是负整数都用0填充,负数都给搞成了正数。

注:后面所展示的右移操作符运算都按照算术右移的移动规则。

#include <stdio.h>
int main()
{
	int n = -10;
	int m = n >> 1;    //把n向右移动一位(右边数字是多少,就移动多少位)
	printf("%d", m);
	return 0;
}

10000000000000000000000000001010      -10的原码

111111111111111111111111111111110101      -10的反码(符号位不变,其它按位取反) 

111111111111111111111111111111110110       -10的补码(+1,满2进1)

得到补码后,我们开始进行右移操作

111111111111111111111111111111110110     右移前的补码

  11111111111111111111111111111111011   向右移动一位

由于是负整数,因此左边空缺补上1,右边0舍去,得到

111111111111111111111111111111111011      右移后的补码

10000000000000000000000000000100      右移后的反码

10000000000000000000000000000101      右移后的原码

移动后的结果是 m = -5

正整数右移和左移基本相同。就跳过了!

3.3 一些总结

  1.  左移一位有 ×2 的效果,右移一位有 ÷2 的效果
  2.  移动可以一下移动多位,但是要注意不要移动的位置超过总数,要选择适当的位数移动。
  3.  移动的位数只能是正整数,不能出现 a>>-3 这种情况
  4. 移动几位补几位,如果是负整数,左边都用1填充。

 4、位操作符:&、|、^、~

位操作符有:
1 &                 //按位与

2  |                 //按位或

3  ^                //按位异或

4  ~               //按位取反

                    这里位是指二进制位,因此使用这些操作符一定要先写成二进制位的表示i形式才能参与计算

注:他们的操作数必须是整数。

4.1 按位与:& 

#include <stdio.h>
int main()
{
	int a = -10;
	int b = 13;
	int c = a & b;   //按位与,指的是对应的二进制位与运算
	printf("%d", c);
	return 0;
}

我们需要先得到 a 和 b 的补码

a

10000000000000000000000000001010     原码

111111111111111111111111111111110101     反码(符号位不变,其它按位取反) 

111111111111111111111111111111110110      补码(+1,满2进1)

b

00000000000000000000000000001101    补码(正整数的三种相同)

得到 a 和 b 的补码后,我们可以开始计算了

111111111111111111111111111111110110                  //  a的补码

00000000000000000000000000001101                  //  b的补码

 c = a & b

00000000000000000000000000000100                 //   与后的结果: c的补码

大家能看出是怎么计算的吗?

对应的位置有0则为0,两个同时为1结果才为1

图释:

最终结果为:c = 4

4.2 按位或: |   

#include <stdio.h>
int main()
{
	int a = -10;
	int b = 10;
	int c = a | b;  //按位或,指的是对应的二进制位或运算
	printf("%d", c);
	return 0;
}

先求a和b的补码(这里a的补码就不在重新求一遍了,我直接从上面拿下来了)

111111111111111111111111111111110110                  // a的补码

00000000000000000000000000001010                 // b的补码

 c = a | b

111111111111111111111111111111111110                  // 或后的结果:c的补码

按位与 | 的运算规律:有1则为1,全0才为0

得到的C是负数,因此取反+1后得到原码得到结果

10000000000000000000000000000010

最终结果为:c = -2

4.3 按位异或:^ 

#include <stdio.h>
int main()
{
	int a = -10;
	int b = 13;
	int c = a ^ b;  //按位异或,指的是对应的二进制位异或运算
	printf("%d", c);
	return 0;
}

a的补码求解在4.1里,这里我直接用了

111111111111111111111111111111110110                  //  a的补码

00000000000000000000000000001101                  //  b的补码

c = a ^ b

111111111111111111111111111111111011                  // 异或后的结果:c的补码

按位异或^ 的运算规律:相同为0,相异为1

对应位置如果相同的话,就是0,不同的话就是1。

c的原码 取反+1

10000000000000000000000000000100 //取反

10000000000000000000000000000101 //+1 c的原码

最终结果为: c = -5

4.4 按位取反: ~

#include <stdio.h>
int main()
{
    int a = 0;
	printf("%d", ~a);// ~a就是对a按位取反
	return 0;
}

按位取反就是原来是0改为1,原来是1改为0

a的补码:00000000000000000000000000000000

~a的补码:11111111111111111111111111111111

~a的反码:1000000000000000000000000000

~a的原码:1000000000000000000000000001

因此,打印的结果为 -1

5、逗号表达式 :,

ex1,ex2,ex3,ex…

逗号表达式,就是使用逗号隔开的表达式。

特点:

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

#include <stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式
    printf("%d",c);
	return 0;
}

表达式结果:

我们最终打印出来的结果就是最后一个表达式的结果,但是,我们不能够只算最后一个表达式,因为前面的表达式是可以影响后面的表达式的。向这道题第二个表达式a = b + 10就改变了a的值,从而影响了b = a + 1 的最终结果。

逗号表达式可以减少一些重复的代码

 a = get_val();
 count_val(a);
 while (a > 0)
 {
 //业务处理 
 //...
 a = get_val();
 count_val(a);
 }

比如上面的代码中就有一些重复的,我们可以使用逗号将表达式改写

while (a = get_val(), count_val(a), a>0)
 {
 //业务处理 
 }

这样是不是看着就好多了?

6、下标访问[ ]、函数调用()

6.1 下标引用操作符: [ ]

操作数:一个数组名 + 一个索引值(下标)

#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6 };
	printf("%d\n", arr[5]);  
	return 0;
}
  • [ ]是一个操作符  
  • 操作数 arr 和 5,缺一不可

注意:使用下标引用操作符时,一定要确保索引值在有效范围内,否则可能导致访问越界错误。

6.2 函数调用操作符:()

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

#include <stdio.h>
int main()
{
	printf("hehe\n");
	return 0;
}

printf是一个函数 , ()这个括号就是函数调用操作符。

int add(int a, int b)
{
}
#include <stdio.h>
int main()
{
	printf("hehe\n");//操作数有 printf,"hehe"
	add(1,2);
	return 0;
}

这里的add()表示函数调用,()就是函数调用操作符

函数调用操作符的操作数是不固定的,但都有函数名,传参值根据情况而定

()操作数是  add , 1 , 2

但是函数调用操作符至少有一个操作数,就是函数名。

 7、算数操作符:+、-、*、/、%

7.1 + 和 -

- 用来完成加法和减法。
+  和  -  都是有2个操作数的,位于操作符两端的就是它们的操作数,这种操作符也叫双目操作符。

 #include <stdio.h>
 int main()
{
  int a = 1;
  int b = 2;
  int c = a + b ;
  int b = a - b ;
  printf("%d",c);
  return θ;
}

7.2  * 

运算符 * 用来完成乘法。

1 #include <stdio.h>
2 int main()
3 {
4    int num = 5;
5    printf("%\n",num * num); //输出25
6    return 0;
7 }

 7.3 /

运算符/用来表示除法。

除号的两端如果是整数,执行的是整数除法,得到的结果也是整数。

1 #include <stdio.h>
2 int main()
3 {
4 float x=6/ 4;
5 int y=6/4;
6 printf("%f\n",x);// 输出 1.00000
7 printf("%d\n”,y);// 输出1
8 return 0;
9 }

上面示例中,尽管变量 × 的类型是float (浮点数),但是6 / 4 得到的结果是 1.θ,而不是 1.5。原因就在于C语言里面的整数除法是整除,只会返回整数部分,丢弃小数部分。


如果希望得到浮点数的结果,两个运算数必须至少有一个浮点数,这时C语言就会进行浮点数除法。

7.4 %

运算符%表示求模(余)运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数。

1 #include <stdio.h>
2 int main()
3 {
4   int x =6 % 4; //2
5   return 0;
6 }

负数求模的规则是,结果的正负号由第一个运算数的正负号决定。


1 #include (stdio.h)
2 int main()
3 {
4  printf("%d\n",11 % -5);  //1
5  printf(“%d\n", -11 % -5); //-1 
6  printf("%d\n", -11 % 5);  //-1
7  return 0;
8 }

上面示例中,第一个运算数的正负号(11或-11)决定了结果的正负号。
 

8、赋值操作符:=和复合赋值

在变量创建的时候给一个初始值叫初始化,在变量创建好后,再给一个值,这叫赋值

1 int a = 100; //初始化
2 a = 100; //赋值,这里使用的就是赋值操作符

赋值操作符 = 是一个随时可以给变量赋值的操作符。

8.1 连续赋值

赋值操作符也可以连续赋值,如:

1 int a = 3;
2 int b = 5;
3 int c = 0;
4 c = b = a+3;//连续赋值,从右向左一次赋值的。

虽然C语言支持这种连续赋值,但是写出的代码不容易理解,建议还是才开来写,这样方便观察代码的执行细节。

1 int a = 3;
2 int b = 5;
3 int c = 0;
4 b= a+3;
5 c = b;

这样写,在调试的时候,每一次赋值的细节都是可以很方便的观察的。

8.2 复合赋值法

在写代码的时候,我们经常可能会对一个数进行自增,自减的操作

代码演示:

1 int a = 10;
2 a = a+3;
3 a = a-2;

这样写代码C语言给提供了更加方便的写法:

1 int a = 10;
2 a+=3;
3 a-=2;

C语言中提供了复合赋值符,方便我们编写代码,这些赋值符有:

1 +=      -+
2 *=      /=     %=
3 >>=     <<=
4 &=      |=     ^=

8.2.1  += 、 -=

1 int a = 10;
2 a+=20; => a = a+20 //此时得出的结果是a等于30
3
4 a-=10; => a = a-10 //此时得出的结果是a等于0

8.2.2  *=  、  /=  、 %=

1 int a =10;
2 a*=3 => a = a * 3  //a的结果是30
3 a/=2 => a = a / 2  //a的结果是5
4 a%=3 => a = a % 3  //a的结果是1(求余数)

8.2.3   >>=     <<=

右移赋值 :a >>= b 表示将变量a的二进制表示向右移动b位,并用0填充空缺的位置,如果a是一个正数,这相当于除以2的b次方。对于负数,结果会有所不同,取决于具体的实现。举个例子,假设我们有一个八位二进制数a = 0b10101010(十进制为140),如果我们执行a = a >> 2,这相当于清除最右边的两位并左移0进去,结果就是 0b10100000(十进制为64)。这个操作可以用于处理位标志、压缩数据等场景。

左移赋值: a<<=b它的作用是将一个数的二进制形式向左移动指定的位数,并将左边多出来的位数用0补齐,然后将结果赋值给这个数。举个例子,如果x的二进制为0000 1000,执行x <<= 3后,x的二进制变为0100 0000,也就是十进制数值变为64。

8.2.4  &=      |=     ^=

1、 按位与(&=)&符号名为按位与

二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每个位,只有两个运算对象中相应的位都为1时,结果才为1(从真/假方面看,只有当两个位都为真时,结果才为真)。

1 (010010) & (100010) //表达式
2 (000010)            //结果值

&= 用法

1 val &= 0234;
2 val = val & 0234;
3  //以上两种等同
2、按位或 ( |=)

二元运算符|,通过逐位比较两个运算对象,生成一个新值。对于每个位,如果两个运算对象中相应的位为1,结果就为1(从真/假方面看,如果两个运算对象中相应的一个位为真或两个位都为真,那么结果为真)。

1 (1001001) | (0100101)  //表达式
2 (1101101)              //结果式
3  
4  val &= 05234;
5  val = val & 05234;
6  //效果等同
3、按位异或:^=

二元运算符^逐位比较两个运算对象。如果两个运算对象中相应的位一个为1(只有一个1),结果为1(从真/假方面看,如果两个运算对象中相应的一个位为真且不是两个同为1,那么结果为真)。任何数与0异或都为本身。

1 (10010011) ^(00111101)    //表达式
2 (10101110)                //结果值
3 //效果相同
4 val ^= 05234;
5 val = val ^ 05234;

 9、单目操作符:++、--、+、- 、sizeof(类型)

前面介绍的操作符都是双目操作符,有2个操作数的。C语言中还有一些操作符只有一个操作数,被称为单目操作符。++、--、+(正)、-(负)就是单目操作符的。

9.1 ++和--

++是一种自增的操作符,又分为前置++和后置++,--是一种自减的操作符,也分为前置--和后置--.

9.1.1 前置++

1 int a = 10;
2 int b=++a;//++的操作数是a,是放在a的前面的,就是前置++
3 printf(“a=%d b=%d\n", a,b);

计算口诀:先+1,后使用;

9.1.2 后置++

1 int a = 10;
2 int b=a++;//++的操作数是a,是放在a的后面的,就是后置++
3 printf(“a=%d b=%d\n", a,b);

计算口诀:先使用,后+1;

9.1.3 前置--

计算口诀:先-1,后使用;

9.1.4 后置--

计算口诀:先使用,后-1;

和++相同,就不再举例说明了。

关于++、-- 我们只需要掌握以上使用方法就可以了。

9.2 +、 -

比较简单,就直接代码演示了

9.3 sizeof 操作符

sizeof 是一个关键字,也是操作符,专门是用来计算sizeof的操作符数的类型长度的,单位是字节。(后面会介绍什么是字节)
sizeof 操作符的操作数可以是类型,也可是变量或者表达式。

1 sizeof (类型)
2 sizeof 表达式

sizeof的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。
sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。
sizeof 的计算结果是size_t类型的。

sizeof 运算符的返回值,C语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定,sizeof到底返回什么类型。不同的系统中,返回值的类型有可能是unsigned int,也有可能是unsigned long,甚至是 unsigned long long,对应的 printf() 占位符分别是 u%、%1u%11u。这样不利于程序的可移植性。
C 语言提供了一个解决方法,创造了一个类型别名 size_t,用来统一表示 sizeof 的返回值类型。对应当前系统的 sizeof 的返回值类型,可能是 unsigned int,也可能是 unsigned long long

补充 size_t 

size_t --- 是一种类型,是专门为sizeof 设计的就是sizeof返回值的类型
size_t 其实是一种无符号的整型
unsigned ...

sizeof 的返回值的类型可能是:
unsigned int                 %u
unsigned long              %lu
unsigned long long      %llu

由于种类太多,导致在写代码的时候不太方便,便统一使用size_t代替,占位符为%zd

比如:

1 #include <stdio.h>
2
3 int main ()
4 {
5   int a=10;
6   printf("%zd\n,sizeof(a));
7   printf("%zd\n,sizeof(a));//a是变量的名字,可以省略掉sizeof后边的()
8   printf("%zd\n,sizeof(int));
9   printf("%zd\n,sizeof(3=3.5));
10  return 0;
11 }

10、逻辑操作符:!、&&、||

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

•!:逻辑取反运算符(改变单个表达式的真假)。

• &&:逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。

•||:逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。

| 注:C语言中,非0表示真,0表示假

10.1 逻辑 取反运算符 !

a!a
非0(真)0(假)
0(假)1(真)

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

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

 如果 flag 为真,!flag就是假,如果 flag 为假,!flag就是真

因此上面代码的意思就是:flag为假,!flag为真 ,执行if语句中的代码

10.2 逻辑 与运算符 &&

逻辑与运算符
aba&&b
非零非零1
非零00
0非零0
000

&& 就是 与运算符,也是 并且 的意思,&& 是一个双目操作符,使用的方式是 a&&b && 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。

四字口诀:一假全假(只要有一个是假的,这个表达式就是假的。)

例如:如果我们说月份3月到五月,是春天,那使用代码该怎么表示呢?

 int month = 0;
 scanf("%d",&month);
 if(month >= 3 && month <= 5);//表达式
 {
    printf("春季\n");
 }

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

只要其中有一个不成立,都不能得到想要结果,假如month大于等于2,则结果不成立;或者month小于等于6,结果也不成立。一假全假

10.3 逻辑 或运算符 ||

逻辑或运算符
aba||b
非0(真)非01
非00(假)1
0非01
000

|| 就是或运算符,也就是或者的意思,|| 也是一个双目操作符,使用的方式是 allb 两边的表达式
只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

四字口诀:一真全真(只要有一个是真的,表达式就是真的)

例如:我们说一年中月份是12月或者1月或者2月是冬天,那么我们还怎么使用代码体现呢?

 int month = 0;
 scanf("%d",&month);
 if(month == 12 || month == 1 || month == 2));//表达式
 {
    printf("冬季\n");
 }

这里表达式的意思是在12月、 1月 、2 月中,只要有一个 是真(即是冬季) 表达式都成立。

11、操作符的属性:优先级、结合性

C语言的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。

11.1 优先级

优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执行。各种运算符的优先级是 不⼀样的。

3 + 4 * 5

上面例子中,表达式3 + 4 * 5里既有加法运算符,又有乘法运算符,由于乘法的优先级高于加法,所以会先计算4 * 5,而不是先计算3 + 4。

相邻的两个运算符,优先级高的先计算。

11.2 结合性

如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符 是左结合,还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执行),少数运算符是右 结合(从右到左执行),比如赋值运算符( = )。

5 * 6 / 2

上面例子中,表达式 * 和 / 的优先级是相同的,它们都是左结合运算符,所以从左到右执行,先计算5 * 6,再计算 / 2

运算符的优先级顺序很多,下面是部分运算符的优先级顺序(按照优先级从高到低排列)

  • 圆括号( () )
  • 自增运算符(++),自减运算符(--)
  • 单目操作符(+ 和 -)
  • 乘法(*),除法(/)
  • 加法(+),减法(-)
  • 关系操作符(<、>等)
  • 赋值操作符(=)

上面这些记住就可以了,其它的使用时查表就行。 

C 运算符优先级 - cppreference.com


结语:

本篇文章到这里就结束了,基本上C语言相关的操作符都梳理了一遍,关于结构成员访问操作符会在后面小编学习后补上。希望大家能够在这里面找到你所要的知识!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1960697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity GameObject学习笔记

GameObject成员变量 GameObject静态方法 //准备用来克隆的对象//1.直接是场景上的某个对象//2.可以是一个预制体对象public GameObject Myobj; #region 知识点二 GameObject中的静态方法创建自带几何体只要得到了一个GameObject对象 我就可以得到它身上挂载的任何脚本信息GameO…

YotoR(You Only Transform One Representation)

本文介绍了一种名为YotoR&#xff08;You Only Transform One Representation&#xff09;的新型深度学习目标检测模型。该模型将Swin Transformers与YoloR架构相结合。在自然语言处理领域引起革命的Transformer技术&#xff0c;如今同样对计算机视觉产生了深远影响&#xff0c…

7.29 模拟赛总结 平面图欧拉定理

复盘 7:40 开题 开题失败&#xff0c;由于前一天有 cf&#xff0c;模拟赛移到下午了 13:45 开题 看 T1&#xff0c;题意很抽象&#xff0c;理清后发现&#xff1a;这直接 dj 不就行了&#xff1f;不会错吧不会错吧&#xff0c;看着 n 1000 n1000 n1000 的数据范围还是不确…

java实现权重轮询算法

package com.example.demo.demos.web.nginx;import java.util.ArrayList; import java.util.List;public class WeightedRoundRobin {private static List<Server> servers new ArrayList<>(); // 存储服务器的列表private static int currentIndex -1; // 当前服…

APP测试基本流程以及APP测试要点梳理,成功入职就靠它了

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【MATLAB源码-第161期】基于matlab的OQPSK系统仿真,输出误码率曲线图,眼图以及各节点信号图像对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交四相移相键控&#xff08;OQPSK&#xff0c;Orthogonal Quadrature Phase Shift Keying&#xff09;是一种数字调制技术&#xff0c;它在传统的QPSK&#xff08;Quadrature Phase Shift Keying&#xff0c;四相移相键控&…

Linux--序列化与反序列化

序列化 序列化是指将数据结构或对象状态转换成可以存储或传输的格式的过程。在序列化过程中&#xff0c;对象的状态信息被转换为可以保持或传输的格式&#xff08;如二进制、XML、JSON等&#xff09;。序列化后的数据可以被写入到文件、数据库、内存缓冲区中&#xff0c;或者通…

jupyter notebook报错: No module named ‘pandas‘

打开jupyter notebook&#xff0c;新建Python3&#xff0c;编写代码import pandas as pd jupyter notebook: No module named pandas 解决办法 :打开Anaconda prompt&#xff0c;输入pip install pandas,安装时可能因为网速原因失败&#xff0c;用同样的命令再试一次&#xf…

数据透视表(二)

文章目录 导入外部数据源创建数据透视表Query 工具下的数据透视表创建如何统计业绩成交情况创建组利用函数构建辅助列创建组手动创建多样分组创建组区间统计创建组按年月日统计数据透视表的多种统计方法计算字段 导入外部数据源创建数据透视表 点击数据选项卡下数据-获取外部数…

04.FreeRTOS任务创建

04. FreeRTOS任务创建与任务删除 1. FreeRTOS创建和删除任务相关API函数 函数描述xTaskCreate()动态方式创建任务xTaskCreateStatic()静态方式创建任务xTaskCreateRestricted()动态方式创建使用 MPU 限制的任务xTaskCreateRestrictedStatic()静态方式创建使用 MPU 限制的任务…

js_拳皇(下)

文章目录 架构设计视频演示碰撞检测碰撞检测函数 构想血条和计时器全屏后续工作 架构设计 一图胜千言 #mermaid-svg-erOUDyAO5t0XgYyU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-erOUDyAO5t0XgYyU .error-icon{…

塞尔维亚皇家科学与艺术学院向迪科维奇将军颁发奖章

2015 年 6 月 28 日&#xff0c;在托波拉文化中心礼堂&#xff0c;由塞尔维亚皇家科学家与艺术学院&#xff08;SKANU&#xff09;组织举行了一场颁奖仪式&#xff0c;向过去一年里为科学院做出无私贡献的杰出个人和集体表示感谢。 经塞尔维亚皇家科学与艺术学院一致决定&#…

RWKV 社区近期有哪些学术研究进展?

2024 年 5 月 7 日&#xff0c;我们呼吁大家使用 RWKV-6 替代 Mamba 进行科研。截至 7 月 29 日&#xff0c;来自全球各地的科研团队已经陆续发表了 7 篇基于 RWKV 架构、在各个领域进行深入研究的论文。 新的 RWKV 学术研究主要聚焦于具身智能、图像处理、模型架构三个方面。…

[Windows] 简单易用的图片去水印工具,Inpaint 9.1 单文件版

很多软件都有这个功能&#xff0c;但这个算法非常自然&#xff0c;软件小巧。 而且极为简单&#xff0c;涂鸦笔一抹&#xff0c;点绿色的《处理图像》 &#xff0c;一秒完成。 我从它6.0的版本一直用过来。现在这个是9.1 发现论坛里的 都是几年前的&#xff0c;全部都失效了。 …

【策略工厂模式】记录策略工厂模式简单实现

策略工厂模式 1. 需求背景2. 代码实现2.1 定义基类接口2.2 排序策略接口定义2.3 定义抽象类&#xff0c;实现策略接口2.4 具体的排序策略实现类2.5 实现策略工厂类2.6 控制类 3. 启动测试4. 总结 1. 需求背景 现在需要你创建一个策略工厂类&#xff0c;来根据策略实现各种排序…

达梦数据库的系统视图v$buffer_lru_first

达梦数据库的系统视图v$buffer_lru_first 达梦数据库系统视图V$BUFFER_LRU_FIRST的主要作用是显示所有缓冲区LRU链首页信息。这个视图帮助数据库管理员监控和管理缓冲池中LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;链的性能&#xff0c;通过查看…

专业级享受:2024年视频剪辑工具深度评测与推荐

说到视屏剪辑很多人都会想要到剪映吧&#xff0c;那剪映怎么剪辑视屏呢&#xff1f;剪映之外还有没有其他好用到视屏剪辑软件呢&#xff1f;这次就分享一些我自己用过到工具吧。 1.福昕视频编辑 链接直达>>https://www.pdf365.cn/foxit-clip/ 这个视频剪辑软件大大的…

【Stable Diffusion】(基础篇六)—— embedding

embedding 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 除了大模型和VAE之外…

普明服务小程序正式招募合伙人,共绘家政保洁行业新蓝图

随着家政保洁行业的快速发展和消费者对高品质服务需求的日益增长&#xff0c;普明服务小程序凭借其专业、高效、便捷的服务体验&#xff0c;迅速在市场上崭露头角。为了进一步拓展业务&#xff0c;提升品牌影响力&#xff0c;普明服务小程序现正式面向社会招募合伙人&#xff0…

你还在为PDF转Word烦恼?试试这四款免费工具吧!

悄咪咪问一句&#xff0c;大家在平时上班时最头疼的事情有哪些&#xff1f;我想会有很多朋友也有pdf如何在线转换word文档的免费方式&#xff0c;毕竟这些办公文档是非常常见的问题了&#xff0c;所以今天就专门准备这么一篇文章来分享我个人喜欢的四款好用工具&#xff1a; 第…