详解操作符(上)

简介: 详解操作符(上)

1 操作符分类

操作符包括:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员。

2 算术操作符

加 减 乘 除 取模(取余)

(1)除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。

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

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

3 移位操作符

<< 左移操作符 >>右移操作符

移位操作符的操作只能是整数  

左移和右移的都是补码,但是打印出来的都是原码对应的十进制。(补码减一,除符号位 其它按位取反)

知识点:

原码反码补码

整数有3种二进制的表示形式(任何整数都可以表示出原码 反码 补码)

整数在内存中储存的是补码

正整数:原码 反码 补码 相同

负整数: 原码 反码 补码不同,要进行计算

移位操作符,正数不用管 ,负数记得补码变原码。

3.1 左移操作符

移位规则: 左边抛弃、右边补零(指对应二进制的左移和右移)

知识点: a的值还是3,并没有发生变化,只是一种运算。      a<<1只是展现a左移一位的效果,a的值 在没有赋值的情况下 并没有发生变化。

3.2 右移操作符

移位规则:

首先右移运算分两种:(到底是逻辑右移还是算数右移,取决于编译器。我们常见的编译器都是算术右移)

1.逻辑移位:左边用0填补,右边丢弃

2.算术移位:左边用原该值的符号位 填补,右边丢弃。

(注意,负数,回归原码是10000000000000000000000000000001,这个数是-1,不是2^32+1)

警告:

可以左移正数,可以右移正数,但是不可以左移负数 ,右移负数。例如:a<<-3.这是标准为定义的。

4 位操作符

注意:(正负数都可以,补码进行操作,打印的是原码)

对应的操作也是二进制位的操作(补码操作)(int 32位)

上图都是正数操作,以便方便叙述,所以前面的0在这里省略。

4.1 不创建临时变量,进行两个数交换

代码1展示:(有局限性,不能解决全部情况,因为int是有范围限制的,万一a和b这两个数非常大,a+b超过int的范围,那么就会出现错误)

1. #include <stdio.h>
2. int main()
3. {
4.  int a = 2;
5.  int b = 3;
6.  printf("%d %d\n", a, b);
7.  a = a + b;
8.  b = a - b;
9.  a = a - b;
10.   printf("%d %d", a, b);
11.   return 0;
12. }

代码2展示:

两个相同的数异或,是0;0和任何数异或,还是任何数。a^b^b = a

1. #include <stdio.h>
2. int main()
3. {
4.  int a = 2;
5.  int b = 3;
6.  printf("%d %d\n", a, b);
7.  a = a ^ b;
8.  b = a ^ b;//a^b^b = a
9.  a = a ^ b;//a^b^(原来的a) = 原来的b
10.   printf("%d %d", a, b);
11.   return 0;
12. }

5 赋值操作符

=   赋值操作符

a = b = x+1;    分析:x+1的值赋给b,的值赋给a,但是不提倡用(不清晰爽朗 不易与调试)

知识点:

左值:是可以放在等号左边,一般是一块空间

右值:是可以放在等号右边的,一般是一个值(a = 10)或者是一块空间的内容(a = 10 b = a)

复合赋值符:

别的都类似于上图所示

相关文章
|
存储 索引
【操作符】
【操作符】
43 0
|
7月前
|
存储 编译器
操作符详解1(一)
本文介绍了编程中的操作符分类和位操作,包括算术操作符(如 +, -, *, /, %)、移位操作符(<<, >>)、位操作符(&, |, ^)、赋值操作符、单目操作符、关系操作符、逻辑操作符和条件操作符。还讨论了原码、反码和补码的概念,以及左移(<<)和右移(>>)操作符的工作原理,包括逻辑右移和算术右移的区别。最后提到了位操作符按位与(&)、按位或(|)、按位异或(^)和按位取反(~)的运算规则。
61 1
|
6月前
|
编译器 Linux C语言
操作符详解(2)
操作符详解(2)
53 0
|
6月前
|
编译器 C语言
操作符详解(1)
操作符详解(1)
41 0
|
7月前
|
编译器 C语言 C++
操作符详解2(二)
本文介绍了编程中的操作符转换和表达式解析规则。当操作数类型不同时,会进行寻常算术转换,按照long double、double、float等类型顺序进行向上转换。表达式求值时,虽然操作符有优先级,但不能决定操作数的求值顺序,例如`a*b + c*d + e+f`中乘法先于加法,但具体计算顺序不确定,可能导致不同结果。同样,如`c++ + c--`这样的表达式也是有歧义的,因为++和--的左右结合性不能确定操作数的获取顺序。文章强调,复杂的表达式可能因编译器差异产生不同结果,应避免使用可能导致非唯一计算路径的表达式以减少潜在风险。
51 0
|
7月前
|
存储 程序员 C语言
操作符详解1(二)
该内容是一个关于C语言操作符和结构体的教程摘要。首先提到了加法操作符`+`的使用,并给出了一种不使用临时变量交换两个数的方法。接着讨论了如何计算整数的二进制表示中1的个数,通过位操作符实现。然后介绍了逗号表达式和函数调用操作符`()`,以及结构体成员访问操作符`.`和`-&gt;`,用于访问和修改结构体内的成员变量。文章以讲解结构体的声明、初始化和通过指针访问结构体成员为重点,展示了如何直接和间接地操作结构体数据。
56 0
|
7月前
|
存储 C语言
操作符详解2(一)
C语言操作符具有优先级和结合性,决定表达式求值顺序。优先级高的运算符先执行,相同优先级时看结合性,左结合从左到右,右结合从右到左。例如,3+4*5中乘法优先级高于加法,5*6/2中乘法和除法优先级相同,但都是左结合,所以先计算5*6。圆括号具有最高优先级,可改变其他运算符优先级。表达式求值时,整型运算以缺省整型精度进行,小整型值会被提升为int或unsigned int。正数提升时高位补0,负数提升时高位补1,无符号整型提升始终补0。
65 0
|
7月前
|
编译器 索引
操作符详解3
操作符详解3
48 0
|
存储
操作符详解上(非常详细)
操作符详解上(非常详细)
80 1
|
存储 编译器
操作符详解(1)
操作符详解(1)
45 0