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;
}
posted @ 2021-12-30 13:37  灯明三千  阅读(157)  评论(0)    收藏  举报