24/05/25(1125)操作符和表达式(算术操作符和移位操作符)

操作符和表达式

C语言中的运算符规则,后世的其他语言也基本遵守.

关于算术运算符:

1.整数除以整数,结果还是整数,小数部分会直接忽略(并没有四舍五入这样的操作)

#include<stdio.h>
#include<stdlib.h>

int main(){
    int a = 10;
    int b = 20;
    printf("%d\n",a / b);
    system("pause");
    return 0;
}

2.当算术运算符两侧的操作数类型不匹配的时候,就会出发"隐式类型转换",先转成相同类型,再进行计算.

#include<stdio.h>
#include<stdlib.h>

int main(){
    double a = 10.0;
    int b = 20;
    printf("%f\n",a / b);
    system("pause");
    return 0;
}

3.可以通过(类型)的方式进行"显示类型转换/强制类型转换"

显示:手动写出来的

隐式:没有写,但编译器自动完成

显示方式:

#include<stdio.h>
#include<stdlib.h>

int main(){
    double a = 10.0;
    int b = 20;
    printf("%f\n",a / (double) b);
    system("pause");
    return 0;
}

隐式类型转换通常被认为是不太好的写法.

4.隐式类型转换的规则:把表示数据范围小的类型往表示数据范围大的类型去转换.

5.强制类型转换的时候也是有可能会丢失精度的.强制丢掉小数部分.

#include<stdio.h>
#include<stdlib.h>

int main(){
    double a = 10.5;
    printf("%d\n",(int)a);
    system("pause");
    return 0;
}

如何实现四舍五入?加0.5

10.1 + 0.5

强制类型转换有两种书写方式:(double) a/ double (a)更推荐前一种.

整数 / 0 得到的结果 "运行时出错".针对这个问题作出三种回答方式:

1."运行时出错"2."运行时进程异常终止"3."运行时CPU在执行 / 0指令的时候会导致操作系统触发一个异常,然后给当前进程发送一个信号,导致进程异常终止"

面对问题一定要避免一问一答,多说一些熟悉领域举一反三.

在C语言中,%操作只能针对整数进行运算.

java中,%是可以针对浮点数进行运算的.

移位运算符:按二进制移位.

左移 <<

右移 >>

10 =>二进制=> 0000 0000 0000 0000 0000 0000 0000 1010(int有4个字节 32bit)

int num = 10;

num = num << 1;

左移是最高位不要,最低位补零.得到10100 =>十进制=> 20

左移一位,相当于 * 2.

右移是最低位不要,最高位两种情况:

1)逻辑右移,最高位直接补零.

2)算术右移,最高位补 符号位

用这个整数的最高位作为符号位,如果最高位为 0 表示正数,如果最高位为 1 表示负数.

1010 => 101 => 10 => 1 => 0

算术右移一位,相当于 /2.

有一个常见考点:

有些时候如果代码需要乘以或者除以 2 的 N 次方的时候,就可以把这样的乘除法,转换成移位操作.

为什么这么转换:对于CPU来说,计算移位操作效率高于乘除法.

对于移位运算符,移动位过大或者为负都是标准未定义.

位操作:& | ^ ~

(按位与) 对应位进行计算.如果都为1,结果为1,否则为0.

10 & 20: 000 1010 & 0001 0100 -> 0

(按位或) 对应位进行计算.如果都为0,结果为0,否则为1.

(按位异或) 对应位进行计算.如果两个数字相同,结果为0,不同为1.

涉及异或有这样一道建议背下来的题:

已知a = 10,b = 20不新增变量使得a和b互换(利用同一个数字异或两次该数字就会被消除的特性)

#include <stdio.h>
#include <stdlib.h>

int main(){
    int a = 10;
    int b = 20;

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

    printf("%d %d", a, b);
    system("pause");
    return 0;
}

(按位取反)针对当前操作数,遇到1得到0,遇到0得到1.

10 -> 0000 1010

~10 ->1111 0101

int main(){
    //%x 按照16进制打印
    printf("%x\n",~10);
    system("pause");
    return 0;
}

1111 -> 15 -> f

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值