C语言逻辑运算规则及运算符优先级规则关系(课本上的规则矛盾)

C语言逻辑运算规则及运算符优先级规则关系(课本上的规则矛盾)

在学习C语言的时候为了加快运算的速率, 进行逻辑运算的时候遵循从左到右的规律

c 复制代码
a || b

如果a判断为1的时候不在对b进行判断, 如果b是一个表达式的时候也不会进行实际的执行

之前一直不理解C语言里面&&符号优先级比||的作用, 以为只要从左到右计算即可, 应为这一个在实际使用的时候并不会因为右侧有&&符号而优先计算右侧的式子

而其他的符号优先级不同比如1 + 2 * 3 会先执行2 * 3

问题以及推导(看不懂可以直接看总结)

在逻辑运算里面使用加法表示或, 乘法表示与, 与的优先级比加法高

在进行逻辑运算的时候有一个推论公式: A+A'B=A+B, 实际的推算方式是

  1. 由于A = AA , AA' = 0
  2. 原式 = (A + A')(A + B) = A + B

实际是公式A + BC = (A+B)(A+C)的使用
这一个公式的推导方式是
右侧 = AA + AB + AC + BC = A(1 + B + C) + BC = A + BC

这个式子如果直接使用上面的C语言从左到右的计算方法, 在计算1 || 0 && 0的时候会得到结果是0(首先计算左侧的1 || 0获取的是1 , 右侧是一个&&运算, 1 && 0 等于0), 但是实际按照公式这一个的计算结果应该是1

如果按照符号高优先级判断, 应该先计算右侧的b && c, 但是又和上面的规则冲突了, 首先运算的是右侧的表达式

代码验证

在实际的代码里面这一个获取的是正确的结果, 所以在这里不能简单的使用从左到右的计算方法

c 复制代码
int main(void){
    printf("%d\n", 1 || 0 && 0);
    return 0;
}

输出

bash 复制代码
PS E:\JHY\c\test> gcc .\main.c -O0
PS E:\JHY\c\test> .\a.exe
1

可以看到这一个的计算结果是对的

那么是不是在这里不是按照从左到右进行计算的, 我使用以下代码进行测试

c 复制代码
int main(void){
     printf("%d\n", 1 || 0 && 0);
     //查看实际的真实运算顺序
     printf("%d", (printf("A"), 1) || (printf("B"), 0) && (printf("C"), 0));
     printf("\n");
     //按照从左到右的方式计算
     printf("%d", ((printf("A"),1) || (printf("B"), 0)) && (printf("C"), 0));
     printf("\n");
     //实际的顺序的模拟
     printf("%d", (printf("A"), 1) || ((printf("B"), 0) && (printf("C"), 0)));
     return 0;
}

输出结果

bash 复制代码
PS E:\JHY\c\test> gcc .\main.c -O0
PS E:\JHY\c\test> .\a.exe
1
A1
AC0
A1

可以看到实际的计算结果确实是按照从左到右, 同时由于与运算的优先级比较高, 所以C语音会把右侧的两个式子当做一个式子进行计算, 相当于加了一个括号, 计算左侧的数据以后发现不需要计算右侧括号即可获取结果, 直接输出1, 所以这样可以在减少运算量的同时保证结果的正确

总结

&&优先级比较高, 但是高优先级的符号没有先进行计算, 而是起到加了一个括号的作用, 实际代码执行的时候是按照从左到右需要的时候才会进括号

建议在实际代码使用的时候尽量按照实际需求进行添加括号

相关推荐
iThinkAi工具集11 小时前
用WorkBuddy做视频:脚本、分镜、配音和剪辑这样衔接
经验分享
虹科网络安全12 小时前
RDI 多数据源管道:把分散的数据汇入统一 Redis 数据层
经验分享·redis·艾体宝·艾体宝it·艾体宝redis
科技苑13 小时前
C++ CAS与ABA问题详解,无锁编程的经典陷阱怎么解决?
c++·人工智能
czq_268671948714 小时前
Python打卡第46天
开发语言·python
Zwawa14 小时前
用两个按键做一个OLED菜单:先把选择和执行分开
c语言·单片机·嵌入式
Evand J16 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
BaiPeter17 小时前
ZPL文件预览
开发语言·c++
一壶浊酒伴余生18 小时前
新概念英语第一册 · 句法笔记
笔记·英语学习·英语语法·新概念英语
心仪久了会沦陷19 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
悠仁さん20 小时前
【C++】哈希表
c++·算法·散列表