TL; DR

C 从另一种语言继承了!and ~运算符。双方&&并||分别由不同的人十年后添加。

长答案

从历史上看,C是从基于BCPL的早期语言B发展而来的,而BCPL是基于Algol的CPL。

Algol是C ++,Java和C#的曾祖父,它以对程序员来说很直观的方式定义了true和false:“真实值,被视为二进制数(true对应于1,false对应于0),等于内在积分值”。但是,这样做的一个缺点是逻辑和按位运算不能是同一操作:在任何现代计算机上,~0等于-1而不是1 ~1等于-2而不是0。(即使在已有60年历史的大型机上,它也~0表示- 0或INT_MIN,~0 != 1在每个制造过的CPU上,并且C语言标准已经对其要求了很多年,而它的大多数子语言甚至根本不需要支持符号和大小或补码。)

Algol通过采用不同的模式并在布尔和整数模式下对运算符进行不同的解释来解决此问题。也就是说,按位运算是对整数类型的一种,而逻辑运算是对布尔类型的一种。

BCPL有一个单独的布尔类型,但只有一个not运算符,对于按位和逻辑而言都不如此。这个C的早期先驱完成这项工作的方式是:

Rvalue为true是完全由1组成的位模式。false的Rvalue为零。

注意 true = ~ false

(您会注意到,术语rvalue在C系列语言中已经演变为完全不同的含义。今天,我们将其称为C中的“对象表示”。)

此定义将允许逻辑和按位不使用同一机器语言指令。如果C走了那条路,那么全世界的头文件都会说#define TRUE -1。

但是B编程语言是弱类型的,并且没有布尔甚至浮点类型。一切都int与其后继程序C 等效。这对于使该语言定义一个程序使用真或假以外的值作为逻辑值时所发生的事情是一个好主意。它首先将一个真实的表达式定义为“不等于零”。这在运行它的微型计算机上非常有效,该微型计算机具有CPU零标志。

当时有一种选择:相同的CPU也带有负标志,并且BCPL的真值是-1,因此B可能会将所有负数都定义为真,而将所有非负数都定义为虚假。(这种方法有一个残余:在UNIX上,由同一个人同时开发的许多系统调用将所有错误代码都定义为负整数。失败时,其许多系统调用会返回几个不同的负值之一。)值得庆幸的是:情况可能会更糟!

但是用B 定义TRUEas 1和FALSEas 0意味着该身份true = ~ false不再成立,并且它放弃了强类型,这种强类型使Algol可以消除按位和逻辑表达式之间的歧义。这就需要一个新的逻辑非运算符,设计人员选择!,可能是因为已经不等于了!=,它看起来像是通过等号的竖线。他们没有遵循相同的约定,&&或者||因为两者都不存在。

可以说,它们应该具有:&B中的运算符按设计中断。在B和C中,1 & 2 == FALSE尽管1和2都是真值,并且没有直观的方式来表达B中的逻辑运算。这是C试图通过添加&&和来部分纠正的一个错误||,但当时的主要关注是最终使短路工作,并使程序运行更快。这样的证明是^^:1 ^ 2即使两个操作数都是真实的,也不存在一个真实的值,但是它不能从短路中受益。

not是什么意思在c语言,为什么在C样式语言中逻辑NOT运算符是“!”而不是“ ~~”?...相关推荐

  1. C语言入门(四):有关逻辑的运算符和表达式

    C语言偏向于底层,它的逻辑值是0和1,可以理解为0是假,1是真. ✨目录 关系运算符和关系表达式 关系表达式 逻辑运算符和逻辑表达式 逻辑运算符 逻辑表达式 条件运算符和条件表达式 条件运算符 条件表 ...

  2. c语言中逻辑非运算符的作用,C语言中逻辑运算符非!与或||的优先级怎么说?...

    逻辑非的优先级最高,逻辑与次之,逻辑或最低,即:!(非)→&&(与)→||(或)记忆口诀:not(非)and(与)or(或)运算规则1)&&:当且仅当两个运算量的值都为 ...

  3. vs配置编译c语言,为 VSCode 配置 C 语言编译环境

    1. 前提条件 安装 VSCode 以及 MinGW 安装好 VSCode 中的 C/C++ 扩展 [图片上传失败...(image-e93c7c-1606314000230)] PS: 我建议使用 ...

  4. c语言 字母 八进制表示'/1011',C语言C语言第一课:C语言概述为什么学习C语言怎样学习C语言.DOC...

    [摘要]C语言 第一课: C语言概述 为什么学习C语言 怎样学习C语言 参考资料 ----------------------------------------------------------- ...

  5. R语言ggplot2可视化移除数据中的NA值再可视化实战:消除图形中非常突出的NA柱状图、使用subset函数、使用drop_na函数

    R语言ggplot2可视化移除数据中的NA值再可视化实战:消除图形中非常突出的NA柱状图.使用subset函数.使用drop_na函数 目录

  6. R语言使用edit函数在Rsudio中生成数据编辑器(在windows中生成编辑器)、在编辑器中输出需要的数据生成最终的dataframe

    R语言使用edit函数在Rsudio中生成数据编辑器(在windows中生成编辑器).在编辑器中输出需要的数据生成最终的dataframe 目录

  7. R语言ggplot2可视化:计算dataframe中每个数据列缺失值的个数、使用堆叠的条形图(Stacked Barplot)可视化每个数据列的缺失值的情况(自定义堆叠条形图的形式)

    R语言ggplot2可视化:计算dataframe中每个数据列缺失值的个数.使用堆叠的条形图(Stacked Barplot)可视化每个数据列的缺失值的情况(自定义堆叠条形图的形式) 目录

  8. R语言ggplot2可视化:为图像中的均值竖线、中位数竖线、 geom_vline添加图例(legend)

    R语言ggplot2可视化:为图像中的均值竖线.中位数竖线. geom_vline添加图例(legend) 目录

  9. R语言ggplot2可视化在可视化图像中添加上限线条、下限线条、添加上下限图例实战

    R语言ggplot2可视化在可视化图像中添加上限线条.下限线条.添加上下限图例实战 目录

  10. R语言ggplot2可视化抑制可视化网格中的竖线输出、抑制可视化网格中的横线线输出、抑制背景网格输出实战

    R语言ggplot2可视化抑制可视化网格中的竖线输出.抑制可视化网格中的横线线输出.抑制背景网格输出实战 目录

最新文章

  1. 机房收费系统----可行性分析报告
  2. NetCore NW714 v2.0路由器TTL救砖
  3. flyme7 android彩蛋,魅族 15 系列开启预约,Flyme7 或是发布会彩蛋
  4. 周鸿祎IOT发布会思考
  5. 微信小程序,格式化千分位并保留两位小数
  6. box2d之刚体,定制器笔记
  7. linux 移出权限,如何在 Ubuntu 上为用户授予和移除 sudo 权限
  8. 解决智慧树考试酷无法复制粘粘的问题
  9. 【离散数学】高级计数技术
  10. 【Code】浅谈Pascal转C++
  11. 青岛理工大学QUT期末考试《电子商务概论》思维导图
  12. ubuntu linux拼音输入法,Ubuntu 中文拼音输入法小结
  13. 信用卡欺诈检测:2021 年顶级机器学习解决方案
  14. 2020年12月31日flash禁用后网页如何播放rtmp视频流
  15. iOS和iPad OS 14 Beta 4发行说明
  16. [转摘]如何让你的计算机无线网卡和有线网卡同时使用
  17. 撸了一次 Js 代码
  18. 作为管理人员如何处理下属工作的偏差
  19. atom写css,Atom编写Markdown
  20. 作为通信的学子,怎么在深度学习领域里面发论文

热门文章

  1. 准备学Java的同学看过来,初学者入门必备!
  2. vim个性化设置---给脚本文件加注释头信息
  3. 淘富成真,硬件智能—— 硬件创新一站赋能平台
  4. 【性能优化】增量检查点
  5. 数据仓库专题(14)-数据仓库建设指导原则:一切以就绪数据为主
  6. 试试Navicat和Axere RP Pro吧
  7. 在屏幕中间分别显示绿色、绿低红色、白底蓝色的字符串'welcome to masm!'
  8. [ASP.NET]UserControl對UserControl參數傳遞
  9. 使用组策略配置QoS
  10. CPU占用率高的可能性与解决办法