【初级】C语言——详解操作符

目录

1.操作符分类

2.算术操作符

3.移位操作符

4.位操作符

 5.赋值操作符

6. 单目操作符

6.1 单目操作符介绍

6.2sizeof 和数组

 7.关系操作符

 8.逻辑操作符

9.条件操作符

 10.逗号表达式

11.下标引用,函数调用和结构成员操作符

12.表达式求值

 12.1隐式类型转换

12.2算术转换

12.3操作符的属性


1.操作符分类

算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员

2.算术操作符

+            -              *         /         %

/ 操作符:整型的除法 1/2  -->0

                浮点型的除法 1.0/2      1/2.0--->0.5

%操作符:取模操作符两端必须是整数

3.移位操作符

移位操作符移动的是二进制位。

<< 左移操作符
>> 右移操作符
   
注:移位操作符的操作数只能是整数

 整数的二进制表示有三种
源码,

反码,

补码

正的整数的源码,反码,补码相同。

负的整数的源码,反码,补码是要计算的。

最高位0表示正数,1表示负数

 整数在内存中存储的是补码。

 左移操作符有乘二的效果。

左移右移只针对整数,不支持浮点数。

右移操作符:

(1)算术移位:右边丢弃,左边补原符号位

(2)逻辑移位:右边丢弃,左边补0

 对于移位运算符,不要移动负数位。这个是标准未定义的。

4.位操作符

& // 按位与
| // 按位或
^ // 按位异或
注:他们的操作数必须是整数。

// & - 按(2进制)位与:有0都为0,都是1按位与后才是1

// | - 按(2进制)位或:只要有1就是1,都为0按位或后才是0

// ^ - 按(2进制)位异或 - 相同为0,相异以1

按位与:

 按位或:

 按位异或:

 按位异或举例:

//不能创建临时变量(第三个变量),实现两个数的交换。

//3^3 = 0 -> a^a=0
//011
//011
//000
//0^5=5 -> 0^a = a
//000
//101
//101

//3^3^5 = 5
//3^5^3 = 5
//异或操作符支持交换律
//011
//101
//110
//011
//101

//只适用于整型,有局限性,可读性不高
//int main()
//{
//	int a = 3;
//	int b = 5;
//
//	printf("交换前:a=%d b=%d\n", a, b);
//	a = a ^ b;//a=3^5
//	b = a ^ b;//3^5^5 --> b=3
//	a = a ^ b;//3^5^3 --> a=5
//
//	printf("交换后:a=%d b=%d\n", a, b);
//
//	return 0;
//}

// 
//int main()
//{
//	int a = 3;
//	int b = 5;
//  //这种方法会有溢出的问题
//	printf("交换前:a=%d b=%d\n", a, b);
//	a = a + b;
//	b = a - b;
//	a = a - b;
//	printf("交换后:a=%d b=%d\n", a, b);
//
//	return 0;
//}

//int main()
//{
//	int a = 3;
//	int b = 5;
//	int c = 0;//空瓶
//
//	printf("交换前:a=%d b=%d\n", a, b);
//	c = a;
//	a = b;
//	b = c;
//	printf("交换后:a=%d b=%d\n", a, b);
//
//	return 0;
//}

 5.赋值操作符

复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=

6. 单目操作符

6.1 单目操作符介绍

!           逻辑反操作:真变假,假变真
-           负值
+           正值
&           取地址
sizeof       操作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--           前置、后置 --
++           前置、后置 ++
*           间接访问操作符 ( 解引用操作符 )
( 类型 )       强制类型转换

 单目操作符:只有一个操作数

 C语言中0表示假,非0表示真

 

 

 

 

按位取反符号位也会取反。 

 

 

 

6.2sizeof 和数组

sizeof是操作符,不是函数。

strlen是库函数,是用来求字符串长度。 

 7.关系操作符

>
>=
<
<=
!=   用于测试 不相等
==       用于测试 相等

 

 8.逻辑操作符

&&     逻辑与 //并且
||         逻辑或 //或者

 && 左边为假,右边不计算

||     左边为真,右边不计算

9.条件操作符

exp1 ? exp2 : exp3

 

 10.逗号表达式

逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

11.下标引用,函数调用和结构成员操作符

 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

 

12.表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。

有些表达式的操作数在求值的过程中可能需要转换为其他类型。

 12.1隐式类型转换

C 的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为 整型 提升

整型提升的意义
表达式的整型运算要在 CPU 的相应运算器件内执行, CPU 内整型运算器 (ALU) 的操作数的字节长度 一般就是int 的字节长度,同时也是 CPU 的通用寄存器的长度。
因此,即使两个 char 类型的相加,在 CPU 执行时实际上也要先转换为 CPU 内整型操作数的标准长 度。
通用 CPU general-purpose CPU )是难以直接实现两个 8 比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int 长度的整型值,都必须先转换为int unsigned int ,然后才能送入 CPU 去执行运算。

char short 发生整型提升

//无符号整形提升,高位补0

 

 12.2算术转换

long double
double
float
unsigned long int
long int
unsigned int
int

12.3操作符的属性

复杂表达式的求值有三个影响的因素。
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题
的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxxflower.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值