【问题标题】:Why does isdigit() return 2048 if true?如果为真,为什么 isdigit() 返回 2048?
【发布时间】:2013-06-30 15:20:39
【问题描述】:

谁能解释为什么isdigit 返回2048 如果为真?我是ctype.h 图书馆的新手。

#include <stdio.h>
#include <ctype.h>
int main() {
  char c = '9';
  printf ("%d", isdigit(c));
  return 0;
}

【问题讨论】:

  • 因为 "C" 没有 "bool" 类型,但它有布尔的概念,例如 "0" 为 "false",其他均为 "true",而 2048 != 0 所以这是真的。
  • C 确实有 bool 类型。更准确地说,它有一个名为_Bool 的内置布尔类型,以及标准头&lt;stdbool.h&gt; 中的一个宏定义#define bool _Bool。但这是 1999 年 ISO C 标准添加的,isdigit() 早于它。
  • 顺便说一句:在其他系统上,可能会得到 2048 以外的非零值。
  • 顺便说一句。如果您真的希望 true/false 为 1 或 0,只需使用 !! 解决方法:printf("%d", !!isdigit(c));

标签: c++ c ctype


【解决方案1】:

因为它是允许的。 C99 标准仅对isdigitisalpha 等进行了说明:

本子条款中的函数返回非零(真)当且仅当 参数c与函数描述中的一致。

至于为什么在实践中会发生这种情况,我不确定。猜测一下,它使用与所有is* 函数共享的查找表,并屏蔽除特定位位置之外的所有位置。例如:

static const int table[256] = { ... };

// ... etc ...
int isalpha(char c) { return table[c] & 1024; }
int isdigit(char c) { return table[c] & 2048; }
// ... etc ...

【讨论】:

  • 它可能正在返回一个位字段。 2048 只设置了一位。 OP 可以检查其他 is 函数是否也返回单个位集。
  • 我不知道这是否是isdigit 的真正实现,但它似乎可以:jbox.dk/sanos/source/lib/ctype.c.html
  • @Coodey: the isdigit 的真正实现不存在。有很多实现,没有一个是“最真实的”。
【解决方案2】:

因为没有标准的文档来定义如何用指定的数字表示布尔值,而对于C语言来说,非零为真,零为假。所以这取决于实际的实现。

【讨论】:

  • 这是否添加了其他答案中尚未包含的任何内容?
猜你喜欢
  • 1970-01-01
  • 2017-05-10
  • 2016-08-16
  • 2013-11-09
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
相关资源
最近更新 更多