在《C编程语言》一书的第二版中,据说像isdigit这样的函数可能会为true返回任何非零值。为什么像isdigit这样的函数会为true返回一个随机的非零值,而不是像1这样标准化的值(就像逻辑表达式一样)?此外,在我的测试中,isdigit函数的结果总是2048为真。这是完全随机的还是与某件事有关,或者这个2048值对每个人来说都一样?
我使用的编译器:GCC 12.1.0
isdigit
和相关例程(如isalpha
)的常见实现是使用按字符值索引的数组,其中表的每个元素都是属性的一组位标志。如果字符是数字,则设置一个位;如果字符是字母,则设置另一个位,如果字符是空白字符,则设置该位,依此类推
然后,<ctype.h>
功能可以在很大程度上被实现为table[x] & mask
,其中掩码选择用于测试的期望比特。
如果字符不在测试集中,则结果为零,如果字符在测试集中则结果为非零。因为非零值是测试标志,所以除非适用标志碰巧使用值为1的位0,否则它不是1。例如,如果用于指示数字的位是值为1024的位10,则isdigit
将始终返回零或1024。
这足以达到字符分类功能的目的。添加一个他们只返回一个或零的需求将需要额外的步骤,因此这将是浪费,因此该需求没有添加到规范中。