4.操作符
操作符的基本知识
一、操作符的分类
1.双目操作符
例如:a+b
因为符合需要两个操作数,故称为双目
2.单目操作符
就是只有一个操作数
二、C中的操作符分类
1.算术操作符
\ + - * / %
2.移位操作符
\>> <<
3.位操作符
& ^ |
4.赋值操作符
= += -= *= /= &= ^= |= >>= <<=
5.单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符) (类型) 强制类型转换
6.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
7.逻辑操作符
&& 逻辑与
|| 逻辑或
8.条件操作符
exp1 ? exp2 : exp3
9.逗号表达式
exp1, exp2......
10.下标引用、函数调用和结构成员
[] () . ->
三、操作符详解部分
一、左移
1.如果左移,最后一位永远都是补0
int main()
{
int a = 2;
int b = a << 1; //这里的左移操作符实际是将a的二进制往左移动了来拿两位
//原本的二进制为 000000000000000000000000000000000010
//左移后的 00000000000000000000000000000000010 //将第一位的0删除了
printf("%d\n", b); //打印的结果为4
return 0;
}
二、C中的真假
int main()
{
int b = 10; //在C中0表示为假 非0则为真
printf("%d\n", !b); //如果b为假 那么!b就是1
return 0;
}
一般的应用场景
用if语句中
if (b) {
//如果a为真就做什么
}
if (!b) {
//如果b为假 就执行什么
}
三、sizeof操作符
作用
sizeof不是函数,而是单目运算符,C/C++语言编译器在预编译阶段的时候就已经处理完了sizeof的问题,也就是说sizeof类似于宏定义,
sizeof 一般形式为:sizeof(object),也可以sizeof var_char,不过大部分programer习惯用sizeof(),其运算符的含义是:求出对象在计算机内存中所占用的字节数。
证明一下:
int main()
{
int a = 19;
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a); // 两者可以打印出相同的效果,这说明sizeof是单目运算符 不是函数
//a外的括号可以省略,但是int外的括号不能省
}
举例
nclude "stdio.h"
int main() {
int a = 01000; /*8进制*/
printf("%d\n",sizeof(a));
}
1, 虽然提示上面的错误,但能输出结果:4 ,说明int 是4个bytes,共32位;
2, 提示已经很明确,说你将一个64位 (8bytes)的无符号整型作为printf的第二个参数传入;
3, 查资料占位符%d在格式化输入输出中代表int(4bytes),%ld代表long int(>=4bytes), %lld代表long long int (8bytes);
4,问题出在sizeof上,它返回的是一个64位 (8bytes)的无符号整型,所以占位符应该是%lld
正确代码:
#include "stdio.h"
int main() {
int a = 01000; /*8进制*/
printf("%lld\n",sizeof(a));
}
sizeof在数组上的应用
int main()
{
int arr[10] = {1,1,3,4};
int len_arr = sizeof(arr);
printf("%d\n",len_arr); //计算数组的总大小 单位是byte
int len_arr1 = sizeof(arr[0]);
int num_arr = len_arr / len_arr1;
printf("%d\n", num_arr); //求出数组元素的个数
return 0;
}
四、~ 按位(二进制)取法
1.整数在内存中存在的方式是以补码形式存在的
一个整数在二进制中的存在形式有三种
①原码
②反码 //就是原码取反
③补码 //反码+1
二、对于一个整数而言,其原码、反码、补码都是同一个数
三、对于负数来说,存在形式也是补码
举例
int main()
{
int a = 0;
printf("%d\n", ~a);
return 0;
}
对于-1来说
原码:10000000000000000000000000000001 //符号位不变 符号位为1就是负数
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111
这里得到的结果为-1,分析一波
首先0的二进制为:00000000000000000000000000000000
0的反码为:11111111111111111111111111111111
补码就是减1:11111111111111111111111111111110
不是说负数在内存中是补码吗?0的补码不等于-1的补码啊,这是因为%d是以反码的形式存在,故结果为-1
//%d 打印的是反码 故打印出的结果为-1
五、++运算符
一、前置++
int main()
{
int a = 10;
int b = ++a; //规则就是先++,再使用
printf("%d\n", b); //11
printf("%d\n", a); //11
return 0;
}
二、后置++
int main()
{
int a = 10;
int b = a++; //规则就是先使用,再++
printf("%d\n", b); //10
printf("%d\n", a); //11
return 0;
}
六、条件操作符
exp1 ? exp2 : exp3
int main()
{
int a = 1;
int b = 3;
int max = 0;
if (a > b)
{
max = a;
}
else
{
max = b;
}
max=a>b ? a:b; //这个即相当于等于整个if语句中的表达
printf("%d\n", max);
}
七、逗号操作符
int main()
{
int a = 1;
int b = 3;
int c = 0;
c = (b = a + 1, a = b + 2, c = a + b);
//b=2 a=4 c=6
//逗号操作符的本质就是从左向右依次执行 最终的结果等于最后一个操作数
printf("%d\n", c);
return 0;
}

浙公网安备 33010602011771号