一、前言
操作符(Operator)是编程语言中用于执行操作的符号,它们告诉编译器或解释器如何操作数据。在编程中,操作符用于对变量、值、对象或函数执行特定的作,C语言中提供了各种个样的操作符,下面我们会一一讲解。
二、操作符详解
1. 操作符的分类
算术操作符: | + 、- 、* 、/ 、% |
---|---|
移位操作符: | << >> |
位操作符: | & 丨 ^ |
赋值操作符: | = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、 |
单目操作符: | !、++、–、&、*、+、-、~ 、sizeof、(类型) |
关系操作符: | > 、>= 、< 、<= 、 == 、 != |
逻辑操作符: | && 、丨丨 |
条件操作符: | ? : |
逗号表达式: | , |
下标引用: | [] |
函数调用: | () |
结构成员访问: | . 、-> |
2. 算术操作符
+ : 加法
- : 减法
* : 乘法
/ : 除法
% :取余
算数运算符比较简单,这里我们用代码来演示一下用法就可以了
#include <stdio.h>
int main() {
int a = 10;
int b = 5;
printf("%d + %d = %d\n", a, b, a + b);
printf("%d - %d = %d\n", a, b, a - b);
printf("%d * %d = %d\n", a, b, a * b);
printf("%d / %d = %d\n", a, b, a / b);
printf("%d %% %d = %d\n", a, b, a % b);
return 0;
}
3. 移位操作符
(1) 原码、反码、补码
原码、补码和反码是计算机科学中用于表示整数的二进制编码方式,特别是在处理有符号整数时。这些编码方式主要用于简化计算机中的算术运算
- 有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号
位,剩余的都是数值位,符号位都是用0表示“正”,用1表示“负” - 正数、无符号整数的原码、反码、补码都相同;负数的原码、反码、补码都不同
原码: 直接将数值按照正负数的形式翻译成二进制得到的就是原码。
反码: 将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码: 反码+1就得到补码
补码得到原码也是可以使用:取反,+1的操作
计算机中存放整形数据存放的是整形数据的补码,原因:使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
int a = 10;
int b = -10;
00000000 00000000 00000000 00001010 // a的原码
01111111 11111111 11111111 11110101 // a的反码
01111111 11111111 11111111 11110110 // a的补码
10000000 00000000 00000000 00001010 // b的原码
11111111 11111111 11111111 11110101 // b的反码
11111111 11111111 11111111 11110110 // b的补码
(2) 左移操作符 <<
左移操作符是对数据原码的移动,移动规则:左边抛弃、右边补0 ,下面我们举个例子展示
#include <stdio.h>
int main() {
int a = -10;
int b = a << 1;
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
下面我们画图展示一下左移的过程
(3) 右移操作符 >>
右移操作符移动的也是整形的补码,右移分为两种,一种是 逻辑右移,另一种是 算术右移
逻辑右移
逻辑右移规则: 左边用0填充,右边丢弃,一般用于无符号整数
#include <stdio.h>
int main() {
unsigned int a = 10;
unsigned int b = a >> 1;
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
算术右移
算术右移规则: 左边用符号位填充,右边丢弃,一般用于有符号整数
#include <stdio.h>
int main() {
int a = -10;
int b = a >> 1;
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
注: 无论是左移还是右移,移动的位数必须是整数,而且是正整数
4. 位操作符
- &: 按位与
- |:按位或
- ^: 按位异或
- ~ 按位取反
按位操作符&、|、^均是两个数进行操作,而~操作符是对单个数进行操作,下面我们对这些操作符进行讲解
- & (按位与),将两个数的数的二进制位对比,全为1为1,不同为0
- | (按位或),将两个数的数的二进制位对比,有1则为一,全0才为0
- ^ (按位异或),将两个数的数的二进制位对比,不同为1,相同为0
- ~ (按位取反),对每一个二进制位取反,1变成0,0变成1
下面我们直接看代码
#include <stdio.h>
int main()
{
int num1 = -3;
int num2 = 5;
printf("%d\n", num1 & num2);
printf("%d\n", num1 | num2);
printf("%d\n", num1 ^ num2);
printf("%d\n", ~0);
return 0;
}
下面我们画图展示一下过程:
5. 赋值操作符
- = : 赋值操作符
- += : 加等于
- -= : 减等于
- *= : 乘等于
- /= : 除等于
- %= : 取模等于
- <<= : 左移等于
- >>= : 右移等于
- &=: 按位与等于
- |= : 按位或等于
- ^= : 按位异或等于
我们先说 += 这个操作符,比如:a += 10,就是a = a + 10 的意思,就是进行操作后赋值给自身,其他的操作符也是如此
6. 单目操作符
- ! : 取反
- ++ : 递增
- – : 递减
- & : 取地址
- (*) 解引用
- + : 正号
- - : 减号
- ~ : 按位取反
- sizeof : 计算字节大小
- (类型) : 强制类型转换
#include <stdio.h>
#include <stdbool.h>
int main()
{
int a = 0;
int* pa = &a;
if (!false) {
printf("false取反\n");
}
printf("%d\n", ++a);
printf("%d\n", --a);
printf("%p\n", pa);
pritnf("%d\n", *pa);
printf("%d\n", +a);
printf("%d\n", -a);
printf("%zd\n", sizeof(a));
printf("%lf\n", (double)a);
return 0;
}
这些操作符演示一遍即可
7. 关系操作符
- > : 大于
- >= : 大于等于
- < : 小于
- <= : 小于等于
- == : 等于
- != : 不等于
关系操作符用在判断上,表示的是判断关系,可以看以下代码
#include <stdio.h>
int main()
{
int a = 0;
int b = 1;
if (a == b) {
printf("a 等于 b\n");
}
if (a > b) {
printf("a 大于 b\n");
}
if (a < b) {
printf("a 小于 b\n");
}
if (a >= b) {
printf("a 大于等于 b\n");
}
if (a <= b) {
printf("a 小于等于 b\n");
}
if (a != b) {
printf("a 不等于 b\n");
}
return 0;
}
8. 逻辑操作符
- && : 与
- || :或
逻辑操作符用于多重关系的比较,可以看以下代码
#include <stdio.h>
int main()
{
int b = 1;
if (b > 0 && b < 10) {
printf("b 大于 0 且小于 10\n");
}
if (b > 0 || b < -2) {
printf("b 大于 0 或者 b 小于 -2\n");
}
return 0;
}
注: 进行 与 比较时,当 第一个条件不满足 时则不会进行第二个条件的比较;进行 或 比较时,当 第一个条件 满足 时,将不会进行第二个比较
9. 条件操作符
条件操作符又称三目操作符,它的语法如下:
result = condition ? result1 : result2;
或
condition ? 语句 : 语句;
- condition 是一个布尔表达式。
- 如果 condition 为真,result 将被赋值为 result1。
- 如果 condition 为假,result 将被赋值为 result2。
我们直接看代码
#include <stdio.h>
int main()
{
int b = 1;
int returnNum = b > 10 ? 1 : 0;
printf("%d\n", returnNum);
b > 10 ? printf("Yes\n") : printf("No\n");
return 0;
}
10. 逗号表达式
exp1, 1 exp2, exp3, …expN
注: 逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("%d\n", c);
return 0;
}
11. 下标引用
操作数:一个数组名 + 一个索引值(下标)
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
三、操作符的属性:优先级、结合性
1. 优先级
优先级指的是,如果一个表达式包含多个运算符,哪个运算符应该优先执行。各种运算符的优先级是不一样的
如下:
#include <stdio.h>
int main() {
int a = 5 - 3 * 2;
printf("%d\n", a);
return 0;
}
如图,这里先运算了3乘于2
2. 结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符( = )
5 * 6 / 2;
上面示例中, * 和/ 的优先级相同,它们都是左结合运算符,所以从左到右执行,先计算5 * 6 ,再计算/ 2
四、End
关于操作符的详解我们就说到这里,谢谢大家阅读,希望对大家有用!