一、 操作符的分类
操作符又叫运算符,它在C语言中起着非常大的作用,以下是对操作符的分类:
• 算术操作符: + 、- 、* 、/ 、%
• 移位操作符: >
• 位操作符: & | ^ `
• 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、>= 、&= 、|= 、^=
• 单⽬操作符: !、++、--、&、*、+、-、~ 、sizeof、(类型)
• 关系操作符: > 、>= 、< 、<= 、 == 、 !=
• 逻辑操作符: && 、||
• 条件操作符: ? : • 逗号表达式: ,
• 下标引⽤: [ ]
• 函数调⽤: ()
• 结构成员访问: . 、->
ps:前面我们已经讲过了算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单⽬操作 符。感兴趣可查看:CSDN。这里,便不再赘述。
二、原码、反码、补码
整数的2进制表⽰⽅法有三种,即原码、反码和补码
有符号整数的三种表⽰⽅法均有符号位和数值位两部分:
2进制序列中,最⾼位的1位是被当做符号 位,剩余的都是数值位。
符号位都是⽤0表⽰“正”,⽤1表⽰“负”。 正整数的原、反、补码都相同。 负整数的三种表⽰⽅法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
补码得到原码也是可以使⽤:取反,+1的操作。
三、移位操作符
移位操作符改变的是二进制序列,所以操作对象是整数,且移动位数不能为负数
下表显示了 C 语言支持的移位操作符。假设变量 A 的值为 1:
代码实现:
1. int main() 2. { 3. int a = 1; 4. printf("左移之后值为%d\n", a << 1); 5. int b = -1; 6. printf("右移之后值为%d\n",b>> 1); 7. return 0; 8. }
结果如下:
在vs中右移操作符为算术右移。
警告:对于移位运算符,不要移动负数位,这个是标准未定义的。
四、位操作符:&、|、^、~
& //按位与
| //按位或
^ //按位异或
~ //按位取反
代码展示:
1. #include <stdio.h> 2. int main() 3. { 4. int num1 = -3; 5. int num2 = 5; 6. printf("%d\n", num1 & num2); 7. printf("%d\n", num1 | num2); 8. printf("%d\n", num1 ^ num2); 9. printf("%d\n", ~0); 10. return 0; 11. }
注:他们的操作数必须是整数。
来一道例题来巩固一下:
不能创建临时变量(第三个变量),实现两个数的交换。
分析:在初次看到题目时,是不是有些许懵。且听我分析,不能创建临时变量交换两个变量,我们可以想到运用操作符来完成这个工作,即运用^(按位异或)来完成。
1^1 = 0,1^0 = 1。根据这个思路便可完成。
代码实现:
1. #include <stdio.h> 2. int main() 3. { 4. int a = 3; 5. int b = 5; 6. printf("交换前:%d %d\n", a, b); 7. a = a ^ b; 8. b = b ^ a; 9. a = a ^ b; 10. printf("交换后:%d %d\n", a, b); 11. return 0; 12. } 13. 14.
五、单⽬操作符
单⽬操作符有这些:
!、++、--、&、*、+、-、~ 、sizeof
单⽬操作符的特点是只有⼀个操作数,其中大部分我们都讲过,*、&、sizeof这三个操作符我会在随后的章节讲,各位先不要着急,。
六、逗号表达式
逗号表达式,就是⽤逗号隔开的多个表达式。
逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
代码展示:
1. int main() 2. { 3. int a = 1; 4. int b = 2; 5. int c = (a > b, a = b + 10, a, b = a + 1); 6. printf("c=%d",c); 7. return 0; 8. }
结果如下:
七、下标访问[ ]、函数调⽤( )
下标访问和函数调用两个操作符,我们在数组和函数中已经介绍过了。
这里就简单说一下:
下标引用操作符:
操作数:⼀个数组名 + ⼀个索引值。
函数调⽤操作符:
接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。
八、结构成员访问操作符
我们知道结构结构体访问一般有两种方式:直接访问(.)与间接访问(->)。
下表显示了 C 语言支持的结构体成员访问操作符。假设已定义结构体struct stu s则:
运算符 | 描述 | 实例 |
直接访问(.) | 通过结构体变量直接访问其中成员 | s.age=10 |
间接访问(->) | 通过结构体变量地址间接访问其中成员 | &s->age=11 |
代码实现:
1. struct stu 2. { 3. int age; 4. char name[14]; 5. }; 6. int main() 7. { 8. struct stu s; 9. s.age = 10; 10. (&s)->age = 11; 11. return 0; 12. }
九、 操作符的优先级与结合性
优先级:如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是 不⼀样的。
结合性:如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符 是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右 结合(从右到左执⾏),⽐如赋值运算符( = )。
下面是各种操作符的优先级与结合性:
最后:
即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的 计算路径,那这个表达式就是存在潜在⻛险的,建议不要写出特别负责的表达式。
以上就是全部内容,如果对你有帮助的话希望得到你的三连支持!