在C编程语言书籍的第二版中,有人说像isdigit这样的函数可以返回任何非零值作为true.为什么像isdigit这样的函数返回一个随机的非零值作为true,而不是像1这样的标准值(就像逻辑表达式一样)?此外,在我的测试中,isdigit函数的结果始终为2048.这是完全随机的还是与某件事有关,还是这2048的值对每个人都一样?

我使用的编译器:GCC 12.1.0

推荐答案

isdigit和相关 routine (如isalpha)的常见实现是使用按字符值索引的数组,其中表的每个元素是属性的一组位标志.如果字符是数字,则设置一位;如果字符是字母,则设置一位;如果字符是空白字符,则设置一位,以此类推.

然后,<ctype.h>个功能可以在很大程度上实现为table[x] & mask,其中掩码为测试 Select 所需位.

如果字符不在测试集中,则结果为零,如果在测试集中,则结果为非零.因为非零值是被测试的标志,所以它不是一个,除非适用的标志碰巧使用了值为1的位零.例如,如果用于指示数字的位是位10,值为1024,则isdigit将始终返回零或1024.

这足以满足字符分类功能的目的.添加一个只返回一个或零的需求将需要额外的步骤,因此这将是浪费,因此该需求没有添加到规范中.

C++相关问答推荐

为什么PLT表中没有push指令?

POSIX文件描述符位置

将 struct 变量赋给自身(通过指针取消引用)是否定义了行为?

LibpCap禁用监视器模式(C、MacOS)

当我更改编译优化时,相同的C代码以不同的方式运行

为什么STM32G474RE上没有启用RCC PLL

在C++中使用函数指针的正确语法

C-使用指针返回修改后的整数数组

防止规范模式在C++中 echo 特殊字符

在C中访问数组中的特定值

如何在GDB中查看MUSL的源代码

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

我在反转双向链表时遇到问题

为什么我在C代码中得到一个不完整的类型?

合并对 struct 数组进行排序

生产者消费者计数器意外输出的C代码

C编译和运行

&stdbool.h&q;在嵌入式系统中的使用

React Native Android C++ TurboModules 静态 C 库链接问题

对 getchar 函数和 EOF 感到困惑