算术操作符
符号 | 含义 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
- 除了“%”之外,其他操作符可以作用于整数和浮点数。
- 对于“/”操作符,如果两个操作数都为整数,执行整数除法,而只要有浮点数就执行浮点数除法。
- “%”返回的是整除之后的余数。
移位操作符
符号 | 含义 |
---|---|
<< | 左移 |
>> | 右移 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
- 右移操作符
– 算术右移:右边丢弃,左边补原符号位。
– 逻辑右移:右边丢弃,左边补0。 - 左移操作符:左边丢弃,右边补0。
- 位操作符:操作数必须是整数。
练习:求一个整数存储在内存中的二进制中的1的个数。
#include <stdio.h>
int main()
{
int num =10;
int count =0;
int i =0;
scanf("%d",&num);
for(i=0;i<32;i++)
{
if(1 == ((num >> i) & 1))
count++;
}
printf("二进制中1的个数=%d\n",count);
return 0;
}
赋值操作符
复合赋值符 |
---|
+= |
-= |
*= |
/= |
%= |
>>= |
<<= |
&= |
|= |
^= |
单目操作符
符号 | 含义 |
---|---|
! | 逻辑反操作 |
- | 赋值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度 |
~ | 按位取反 |
– | 前置、后置– |
++ | 前置、后置++ |
* | 解引用操作符 |
(类型) | 强制类型转换 |
关系操作符
符号 | 含义 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不相等 |
== | 相等 |
逻辑操作符
符号 | 含义 |
---|---|
&& | 逻辑与 |
|| | 逻辑或 |
练习
条件操作符
exp1?exp2:exp3
逗号表达式
exp1,exp2,exp3,...,expm
用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
下标引用操作符[]
操作数:数组名+索引值
int arr[10];
arr[9] = 10;
函数调用操作符()
操作数:函数名+函数参数
结构成员操作符
- 结构体.成员名
- 结构体指针->成员名
表达式运算
整型提升
- 表达式中的字符和短整型操作数在使用前被转换为普通整型的过程称为整型提升。
示例
//c参与表达式运算,+c和!c都会发生整型提升
int main()
{
char c=1;
printf("%u\n",sizeof(c));//1
printf("%u\n",sizeof(+c));//4
printf("%u\n",sizeof(!c));//4
return 0;
}
算术转换
- 寻常算术转换
long double
double
float
unsigned long int
long int
unsigned int
int
- 操作符属性
– 操作符的优先级;
– 操作符的结合性;
– 是否控制求值顺序。 - 函数的调用先后顺序无法通过操作符的优先级确定。
- 表达式的书写需要通过操作符的属性确定唯一的计算路径,否则计算结果会出现问题。