算术操作符:+ - / * %
1. 对于 / 操作符,操作数都是整数,商取整数;如果有浮点数,执行小数除法,商为浮点数
2. % 操作符的操作数必须是整数,返回值除商数之外的余数
3.除了%之外,其他的操作符可以作用于整数和浮点数
移位操作符: << >>
右移操作符:>>;算术移位:最高位符号位进行补位;逻辑右移:做高位补0,相当于原数/2
通常编辑器采用算数移动
左移操作符:<<; 左边丢弃,右边补0,相当于*2
右移操作符、左移操作符移动的都是一个数的补码,二进制位进行移动
注意不要左移或右移负数位,num>>-1,这个标准是未被定义的
位操作符:& | ^
相对的二进制位 ,按位与 &:全一为一; 按位或 |:有一为一; 异或 ^:相异为一,相同为0
位操作符的操作数必须是整数,操作的是二进制补码
// 交换两个变量的值,不使用临时变量
int num1 = 3, num2 = 4;
printf("before:num1=%d num2=%d", num1, num2);
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
printf("after:num1=%d num2=%d", num1,num2)
// 计算某数二进制中1的个数
int num = 0;
scanf("%d", num);
// 第一种:%2 /2 ,无法计算负数中1的个数
int count1 = 0;
while (num)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("count1 = %d\n", count1)
// 第二种:&的特性
// num:0000000110000111000000011110001 & 000000000000000000000000000000001
// 将num中的每一位&1,结果为1,该位是1;结果为0,该位为0
int count2 = 0;
for (int i = 0; i < 31; i++)
{
if ((num >> i) & 1 ==1)
count2++;
}
printf("count2 = %d\n", count2);
赋值操作符:=
复合赋值操作符:+= -= *= /= %=
单目操作符:~ ! - + & sizeof -- ++ * (类型)
sizeof:计算所占用的内存,操作数的数据类型占用的内存;其中的表达式不会进行实际运算
// ~的实际应用
int num = 11;
// 00000000000000000000000000001011 || 00000000000000000000000000000100
num = num | (1 << 2) // 00000000000000000000000000001111
// 00000000000000000000000000001111 && 11111111111111111111111111111011
num = num & (~(1 << 2));
关系操作符: >= > <= < != ==
逻辑操作符: && ||
逻辑与:&&,一假则假
逻辑或:||,一真则真
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && ++c && d++; // a++:先计算后自增,a++的表达式结果为0,是假
// &&,一假全假,后面的表达式不再参与运算,b c d不再自增
printf(" a = %d b = %d c = %d d = %d ", a, b, c, d) // 1 2 3 4
i = a++ || ++b || ++c || d++; // 同样,a++表达式的结果是a的值,a=1,是真
// ||:一真全真,后面的表达式不再参与运算,b c d不再自增
printf(" a = %d b = %d c = %d d = %d ", a, b, c, d) // 2 2 3 4
条件操作符(三目操作符):exp1 ?exp2 :exp3
逗号表达式:(exp1, exp2, exp3.........)
用逗号隔开多个表达式,从左向右依次执行,整个表达式的结果就是最后一个表达式的结果
下标引用操作符:[ 数组下标],操作数:数组名+索引值
函数调用操作符:(实参),操作数:函数名,函数进行传参的参数
结构引用操作符:用于访问结构体的成员变量
结构体变量:结构体 . 成员;结构体指针:结构体指针 -> 成员变量
隐式类型转换:CPU难以实现两个8bit数据相加运算,即先转化为int或unsigned int,后进行运算
表达式中的字符或短整型数据在参与运算之前,先被转换成普通整型,即整型提升
进行整型转换时,有符号位的数据空位补符号位,无符号位的数据补0
算数转换:操作符的两个操作数属于不同类型,参与运算前将其中某个类型转化成另一个类型
int->unsigned int->long int->unsigned int->float->double->long double
表达式求值:计算顺序由操作符的优先级和结合性决定
一个表达式不能确定唯一的操作顺序,则这个表达式就是问题表达式
操作符的优先级:1.()[ ] 2.单目操作符 3. * / % 4. + -
5.移位操作符 6. 赋值操作符 7.位操作符:& ^ |
8.逻辑操作符 9.复合赋值操作符