操作符详解~~

算术操作符:+ - / * %

        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.复合赋值操作符    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值