首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【初级】C语言——详解操作符

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

作者头像
xxxflower
发布2023-04-16 17:25:26
发布2023-04-16 17:25:26
7740
举报
文章被收录于专栏:《数据结构》《数据结构》

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

按位与:

 按位或:

按位异或:

 按位异或举例:

代码语言:javascript
复制
//不能创建临时变量(第三个变量),实现两个数的交换。

//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. 是否控制求值顺序。

两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题

的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.操作符分类
  • 2.算术操作符
  • 3.移位操作符
  • 4.位操作符
  •  5.赋值操作符
  • 6. 单目操作符
    • 6.1 单目操作符介绍
    • 6.2sizeof 和数组
  •  7.关系操作符
  •  8.逻辑操作符
  • 9.条件操作符
  •  10.逗号表达式
  • 11.下标引用,函数调用和结构成员操作符
  • 12.表达式求值
    •  12.1隐式类型转换
    •  12.2算术转换
    • 12.3操作符的属性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档