C语言的操作符
文章目录
前言
C语言的操作符运算,运算优先级,是否控制求值顺序,三个操作符主要的模块进行解释,同时会扩展隐式类型转换,整形提升,算术转换,同时也会有几道题目进行讲解
一、算术操作符
“加减乘除 取模”
+ - * / %
- 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
- 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
- % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
二、移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。
- 左移规则:左边抛弃、右边补零
- 右移: 分为算数右移、逻辑右移
逻辑移位
左边用0填充,右边丢弃
算术移位(只有算术移位才有符号规则
)
左边用原该值的符号位填充,右边丢弃
警告⚠ :
对于移位运算符,不要移动负数位,这个是标准未定义的。
int num = 10;
num>>-1;//error
三、位操作符
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
按位与: 两个位都为1时,结果才为1
按位或: 两个位都为0时,结果才为0
按位异或: 两个位相同为0,相异为1
四、赋值操作符
普通赋值运算符 =
将右值赋值给左边的变量
复合赋值运算符
复合赋值运算符 | 例子 | 等于 |
---|---|---|
+= | a+=b | a = a + b |
-= | a-=b | a = a - b |
*= | a*=b | a = a * b |
/= | a/=b | a = a / b |
%= | a%=b | a = a % b |
>>= | a>>=b | a = a >> b |
<<= | a<<=b | a = a << b |
&= | a&=b | a = a & b |
| | a | =b |
^= | a^=b | a = a ^ b |
五、单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
– 前置、后置–
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
比特就业课 比特就业课-专注IT大学生就业的精品课程
六、条件操作符
> 大于
>= 大于等于
< 小于
<= 小于等于
!= 用于测试“不相等”
== 用于测试“相等”
警告:
在编程的过程中== 和=不小心写错,导致的错误。
七、逻辑操作符
&& 逻辑与
|| 逻辑或
八、条件操作符
exp1 ? exp2 : exp3
当exp1为true 返回exp2 否则返回exp3
九、逗号表达式
exp1, exp2, exp3, …expN
从左往右依次执行。整个表达式返回最后一个表达式的结果
十、下标引用、函数调用和结构成员
- [ ] 下标引用操作符
操作数:一个数组名 + 一个索引值 - ( ) 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。 - 访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
十一、表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。
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 操作符的属性
复杂表达式的求值有三个影响的因素。
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序。
表达式要保证没有歧义,否则结果无法预测
下面的表达式就有歧义,需要注意
//代码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语言操作符的基本用法