【C语言】操作符与优先级详解

C语言的操作符



前言

C语言的操作符运算,运算优先级,是否控制求值顺序,三个操作符主要的模块进行解释,同时会扩展隐式类型转换,整形提升,算术转换,同时也会有几道题目进行讲解


一、算术操作符

“加减乘除 取模” + - * / %

  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
  3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

二、移位操作符

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

  1. 左移规则:左边抛弃、右边补零
  2. 右移: 分为算数右移、逻辑右移
    逻辑移位
    左边用0填充,右边丢弃
    算术移位(只有算术移位才有符号规则)
    左边用原该值的符号位填充,右边丢弃

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

int num = 10;
num>>-1;//error

三、位操作符

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

按位与: 两个位都为1时,结果才为1
按位或: 两个位都为0时,结果才为0
按位异或: 两个位相同为0,相异为1

四、赋值操作符

普通赋值运算符 =
将右值赋值给左边的变量

复合赋值运算符

复合赋值运算符例子等于
+=a+=ba = a + b
-=a-=ba = a - b
*=a*=ba = a * b
/=a/=ba = a / b
%=a%=ba = a % b
>>=a>>=ba = a >> b
<<=a<<=ba = a << b
&=a&=ba = a & b
|a=b
^=a^=ba = a ^ b

五、单目操作符

! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
– 前置、后置–
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
比特就业课 比特就业课-专注IT大学生就业的精品课程

六、条件操作符

> 大于
>= 大于等于
< 小于
<= 小于等于
!= 用于测试“不相等”
== 用于测试“相等”
警告:
在编程的过程中== 和=不小心写错,导致的错误。

七、逻辑操作符

&& 逻辑与
|| 逻辑或

八、条件操作符

exp1 ? exp2 : exp3

当exp1为true 返回exp2 否则返回exp3

九、逗号表达式

exp1, exp2, exp3, …expN
从左往右依次执行。整个表达式返回最后一个表达式的结果

十、下标引用、函数调用和结构成员

  1. [ ] 下标引用操作符
    操作数:一个数组名 + 一个索引值
  2. ( ) 函数调用操作符
    接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
  3. 访问一个结构的成员
    . 结构体.成员名
    -> 结构体指针->成员名

十一、表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。

11.1 隐式类型转换

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

整型提升的意义:

CPU整形运算器(ALU)的操作数字节长度为int的字节长度,同时也是CPU的 通用寄存器的长度
只有小于int的才会整形提升

如何进行整体提升呢?

整形提升是按照变量的数据类型的符号位来提升的
负数: 最高补符号位 为1
正数 最高补符号位 为0

算术运算操作的也是整形 算术操作符的操作都会整形提升在运算

12.2 算术转换

如果运算左右两个的类型不一致,就会发生转换 低转高

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

警告:
但是算术转换要合理,要不然会有一些潜在的问题。

float f = 3.14;
int num = f;//隐式转换,会有精度丢失

12.2 操作符的属性

复杂表达式的求值有三个影响的因素。

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序。

在这里插入图片描述
在这里插入图片描述
表达式要保证没有歧义,否则结果无法预测
下面的表达式就有歧义,需要注意

//代码3-非法表达式
int main()
{
 int i = 10;
 i = i-- - --i * ( i = -3 ) * i++ + ++i;
 printf("i = %d\n", i);
 return 0;
}

在这里插入图片描述

12.3 操作符的优先级

1.聚组运算符[] ()
2.单目运算符 . -> - ~ ++ – * & ! (类型) sizeof
3.算术运算符 + - * /
4. 移位运算符 << >>
5. 比较运算符 > >= < <= == !=
6. 位运算符 & ^ |
7. 逻辑运算符 && ||
8. 三目运算符(条件运算符) ?:
9. 赋值运算符 = *= /= %= += -= <<= >>= &= ^= |=
10.逗号运算符
记忆方法: 先聚组 再单目 算术在前 接一下位 比一比位 逻辑 赋值紧跟其后 逗号垫底


总结

覆盖了C语言操作符的基本用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值