目录
导语及思维导图:
在C语言里面,有许许多多的操作符,功能丰富。下面将为大家讲解一部分操作符的功能及用法,让我们拭目以待吧。
思维导图:
1、算数操作符
+ - * / %
对于操作符,其实我们可以理解为运算符
int main()
{
int a = 5;
int b = 3;
int sum = a + b; //加
int diff = a - b; //减
int mul = a * b; //乘
int divide = a / b; //除
int remainder = a % b; //取模(两端只能是整数)
printf("sum = %d\n", sum);
printf("diff = %d\n", diff);
printf("mul = %d\n", mul);
printf("divide = %d\n", divide);
printf("remainder = %d\n", remainder);
return 0;
}
运行结果:
这里我们讲一下 /(除法) 操作符
对于除法操作符:
①两边的操作符都是整数,那执行的是整数除法;
②如果要计算小数,那么除号两端至少有一个是浮点数
int main()
{
int divide1 = 5 / 3;
double divide2 = 5.0 / 3;
printf("divide1 = %d\n", divide1);
printf("divide2 = %lf\n", divide2);
return 0;
}
运行结果:
2、移位操作符
<<左移操作符
>>右移操作符
注:移位操作符只能操作整数
移位操作符,移的其实是二进制位
int main()
{
int a = 15;
printf("%d\n", a >> 2);//右移2位
printf("%d\n", a << 2);//左移2位
return 0;
}
运行结果:
在我们了解移位之前,我们先要了解二进制在计算机中是如何存储的
二进制表示形式:
原码
反码
补码
正数的原码、反码、补码都是相同的,我们以15为例:
负数的原码、反码、补码要经过计算,以-15为例:
在计算机中,是以二进制的反码形式存储的
所以参与移位的时候,移动的都是补码。
有了这个知识储备,那我们来看是如何位移的(负数为例)
int main()
{
int a = -15;
printf("%d\n", a >> 2);//右移2位
printf("%d\n", a << 2);//左移2位
return 0;
}
警告⚠ : 对于移位运算符,不要移动负数位,这个是标准未定义的
3、位操作符
位操作符:
& 按位与
| 按位或
^ 按位异或
注:他们操作的数必须为整数(也是针对二进制的)
3.1 &
& 按位与 ,全真为真,有假则假
int main()
{
//& 全真为真,有假则假
int a = 5;
//00000000000000000000000000000101
int b = -2;
//原码:10000000000000000000000000000010
//补码:11111111111111111111111111111110
int c = a & b;
//00000000000000000000000000000101
// &
//11111111111111111111111111111110
//00000000000000000000000000000100
printf("c = %d", c);
return 0;
}
输出:
c = 4
3.2 |
| 按位或,有真为真,全假为假
int main()
{
// | 有真则真,全假则假
int a = 5;
//00000000000000000000000000000101
int b = -2;
//原码:10000000000000000000000000000010
//补码:11111111111111111111111111111110
int c = a | b;
//00000000000000000000000000000101
// |
//11111111111111111111111111111110
//补码:11111111111111111111111111111111
//原码:10000000000000000000000000000001
printf("c = %d", c);
return 0;
}
输出:
c = -1
3.3 ^
^ 按位异或,相同为0,相异为1
int main()
{
// ^ 相同为0,相异为1
int a = 5;
//00000000000000000000000000000101
int b = -2;
//原码:10000000000000000000000000000010
//补码:11111111111111111111111111111110
int c = a ^ b;
//00000000000000000000000000000101
// ^
//11111111111111111111111111111110
//补码:11111111111111111111111111111011
//原码:10000000000000000000000000000101
printf("c = %d", c);
return 0;
}
输出:
c = -5
举例:
有一道面试编程题:
如果通过不创建临时变量,交换两个数的值
int main()
{
int a = 12;
int b = 21;
printf("a = %d b = %d\n", a, b);
a = a ^ b;
b = a ^ b; // b = (a ^ b) ^ b = a
a = a ^ b; // a = a ^ (a ^ b) = b
printf("a = %d b = %d\n", a, b);
return 0;
}
异或操作符:
①a ^ a = 0;
②0 ^ a = 0;
③异或是支持交换律的。
4、赋值操作符
赋值操作符就是字面意思,给变量赋值
复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
int main()
{
int a;//未初始化
int b;
a = 10;// = 赋值
b = 6;
int c = 0;
c += b; // c = c + b;
return 0;
}
5、单目操作符
5.1单目操作符介绍
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转
! 逻辑反操作
C语言里面,0为假,非0为真
反操作符就是 将真变为假,将假变为真
- +正负操作符
很好理解,数学里面的正负
& 取地址操作符
这个我们之前在将指针的文章见到过,就是将变量的地址取出来,可以通过地址去访问该变量
sizeof 操作数的类型长度
sizeof也是老朋友了,sizeof要记得是一个操作符
int main()
{
int a = 0;
char c = 'a';
int arr[5] = { 1,2,3,4,5 };
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof a); // 括号可以省略,证明sizeof不是函数
printf("%zd\n", sizeof(c));
printf("%zd\n", sizeof(arr)); //数组大小为5,整型 5 * 4 = 20
printf("%zd\n", sizeof(arr[0])); //该表为0的一个元素
return 0;
}
输出:
4
4
1
20
4
sizeof补充
~ 对一个二进制(补码)数按位取反
int main()
{
int a = 0;
printf("%d",~a);
return 0;
}
输出:
-1
前置、后置 ++ --
这个初学者容易混淆,但其实很好理解
++(--)在前面,那么就先计算,再给值(先吃饭,再给钱);
++(--)在后面,那么就先先给值,再计算(先给钱,再吃饭)
int main()
{
int a1 = 0;
int a2 = 0;
int b = 0;
int c = 0;
b = a1++; //先把值赋给b ,然后a再自增
c = ++a2; //a先自增,然后再把值赋给b
printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}
输出:
b = 0
c = 1
* 解引用操作符
这个在指针也见过,对取地址的解引用
可理解为:找到了门牌号,但没有钥匙,无法进入房间, * 就相当于钥匙
int main()
{
int a = 3;
int* pa = &a;
printf("%p\n", pa);
printf("%d\n", *pa);//对pa解引用,访问a的值
return 0;
}
(类型) 强制类型转换
这是一个强扭的瓜,不是很建议使用
int main()
{
int a = (int)3.14;
printf("%d\n", a);
return 0;
}
输出:
3
结语:
本篇文字讲了一部分的操作符功能及用法,本篇文章,需弄清楚,sizeof是一个操作符、前置(后置)++(--)的用法。如果本篇文字对大家有帮助,不妨点个赞支持下,下期会完善操作符的讲解。
好了,下机,再见!