【C语言学习笔记】11. 运算符(3)——运算符补充注意点-上

前言

一些小示例补充一下C语言运算符中一些需要注意的点。

| 和 ||,& 和 && 的区别

我们将 || 和 && 定义为逻辑运算符,而 | 和 & 定义为位运算符。

&& 如果两个操作数都非零,则条件为真;

|| 如果两个操作数中有任意一个非零,则条件为真。

& 按位与操作,按二进制位进行"与"运算。运算规则:(有 0 则为 0)

0&0=0;
0&1=0;
1&0=0;
1&1=1;

| 按位或运算符,按二进制位进行"或"运算。运算规则:(有 1 则为 1)

0|0=0;
0|1=1;
1|0=1;
1|1=1;

那么,问题来了,在判断语句中,用 | 还是 ||,& 还是 &&?

判断语句中为布尔类型,值只有 true 和 false(如果变量值为 0 就是 false,否则为 true)

举个例子,a=1 b=2

所以 a>0 这个值为true b>1 这个值为true b>2 这个值为 false
如 if(a>0&b>1) 我们可以得出 if(true&true),条件成立(true不为0,所以true&true不为0)
如 if(a>0&&b>1) 我们可以得出 if(true&&true),条件成立(&&两边操作数都非零,所以条件成立)
如 if(b>2&a>0) 我们可以得出 if(false&true),条件不成立(false为0,false&true为0,条件不成立)
如 if(b>2&&a>0) 我们可以得出 if(false&&a>0),条件不成立(&&左侧为false,&&运算到此结束,条件不成立)

可以看出 & 和 && 在判断语句中都可以实现“和”这个功能,不过区别在于 & 两边都运算,而 && 先算 && 左侧,若左侧为 false 那么右侧就不运算了。因此从效率上来说,判断语句中推荐使用 &&(换句话就是逻辑运算就老老实实用逻辑运算符,不然它为啥叫逻辑运算符呢?)

而 | 和 || 的比较与上类似,不做赘述。

a++ 与 ++a 区别

a++ 与 ++a 区别在于一个后加,一个先加。

a++ 输出 a 的值再自加,缓存 a 自加后的结果,用于下次进行与 a 相关的计算。

++a 则相当于 a+1。

#include <stdio.h>

int main(int argc, char **argv) {
    int a=100;
    int b=50;
//    b++;
    printf("%d,%d\n",a++,++a);
    printf("%d,%d",b++,++b);
    return 0;
}

运行后输出:

101,102
51,52

若不注释 b++:

int main(int argc, char **argv) {
    int a=100;
    int b=50;
    b++;
    printf("%d,%d\n",a++,++a);
    printf("%d,%d",b++,++b);
    return 0;
}

则结果为:

101,102
52,53

运算符优先级

括号成员是老大; // 括号运算符 成员运算符. ->
全体单目排老二; // 所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&
乘除余三,加减四; // 这个"余"是指取余运算即%
移位五,关系六; // 移位运算符:<< >> ,关系:> < >= <= 等
等与不等排行七; // 即 == 和 !=
位与异或和位或; // 这几个都是位运算: 位与(&)异或(^)位或(|)
"三分天下"八九十;
逻辑与,逻辑或; // 逻辑运算符: || 和 &&
十一十二紧挨着; // 注意顺序: 优先级(||) 底于 优先级(&&)
条件只比赋值高, // 三目运算符优先级排到 13 位只比赋值运算符和 “,” 高
逗号运算最低级! //逗号运算符优先级最低

一句话系列

逻辑是将两个操作值转换成Boolean进行操作。

逻辑与:双真真(双真为真,下同);

逻辑或:单真真;

逻辑非:取反;

没有说明的情况都为假(0)。

按位是将两个操作值转换成二进制然后逐位进行操作。

按位与:双真真;

按位或:有真真(有一个真即为真,两个真的情况也属于有一个真);

按位异或:单真真(区别于有真真,两个真的情况不属于单真);

按位是二进制逐位操作,未说明的皆假。

c语言中运算符优先级的总结

初等运算符>单目运算符>算术运算符>关系运算符>逻辑运算符>条件运算符>赋值运算符

初等运算符有:()、[ ]、->、. (后两者均为结构体成员运算符);
单目运算符有:!、~、++、–、sizeof、&、
算术运算符有:
、/、+、-、<<、>>;
关系运算符有:<、<=、>、>=、==、!=、&、^、|;(此栏排列仍有优先级顺序哦);
逻辑运算符有:&&、||;
条件运算符有:?:(即三目运算符);
赋值运算符有:=、+=、-=、*=、/=、%=、>>=、<<=;等

另外,单目运算符的优先级都高于双目运算符。

原码、反码、补码

在计算机中,负数以其正值的补码形式表达

什么叫补码呢?这得从原码,反码说起。

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如 00000000 00000000 00000000 00000101 是 5 的原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为 1,得 0;原为 0,得 1。(1 变 0; 0 变 1)

比如:将 00000000 00000000 00000000 00000101 每一位取反,得 11111111 11111111 11111111 11111010

称:11111111 11111111 11111111 1111101000000000 00000000 00000000 00000101 的反码。

反码是相互的,所以也可称:

11111111 11111111 11111111 1111101000000000 00000000 00000000 00000101 互为反码。

补码:反码加1称为补码。

也就是说,要得到一个数的补码,先得到反码,然后将反码加上 1,所得数称为补码。

比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010

那么,补码为:

11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海棠赠微雨.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值