gpt4 book ai didi

C语言 bool 表达式返回值

转载 作者:太空狗 更新时间:2023-10-29 17:09:20 25 4
gpt4 key购买 nike

C 语言没有 bool 数据类型,而是使用整数。比较== 和 <= 等运算符返回整数值 0 表示假,1 表示真。但是,C 中的 if 语句认为其条件的任何非零值都等同于 true。为什么不同?为什么不允许关系运算符返回任何非零值来表示真?

最佳答案

我认为这是一个武断的决定,回到了 C 的祖先语言 B。

引用Users' Reference to B :

The relational operators < (less than), <= (less than or equal to), > (greater than), and >= (greater than or equal to) take integer rvalue operands. The result is one if the operands are in the given relation to one another. The result is zero otherwise.

没有给出这个特定选择的解释,ANSI C Rationale 中也没有解释。或者在 1978 年 Kernighan & Ritchie 的书“The C Programming Language”(K&R1) 第 1 版中。

(B 的祖先语言 BCPL 有 truefalse 文字,其中 true 表示所有位都设置为 1。)

语言可以有不同的定义,但它在内部仍然是一致的。例如,标准可以说关系运算符和相等运算符产生 0 的结果。如果条件为假,或者如果条件为真,则为任意非零值。结果仍可在 if 中正确使用语句,或任何其他需要条件的上下文。并且很容易想象一个 CPU,它可以更有效地将真值表示为全位一而不是 1。 -- 但语言标准不允许这样做。

几个标准库函数,例如isdigit() , 可能会返回任何任意非零值以指示真实条件,这进一步证明这是一个任意选择。 ( isdigit 自然是通过表查找实现的,它可以产生除 01 以外的值)。

让等式和关系运算符产生更多的便利 01 .例如,这使得计算有多少条件为真变得容易:

int count = 0;
count += x == y;
count += foo > bar;
count += this <= that;

我的猜测是使用 0 很方便和 1在第一个 B 编译器中,该行为被记录下来,并且一直沿用至今。更改定义会破坏依赖于先前定义的代码。

即使在某些系统上效率相对较低,也不是什么大问题。相等或关系运算符的结果通常不会存储在任何地方,因此只要行为一致,编译器就可以随心所欲地表示结果。它可能必须生成代码以将结果规范化为 01在某些情况下,但这不太可能很重要。

关于C语言 bool 表达式返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22489517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com