为什么 C 和 Objective-C 都没有布尔值的格式说明符?

Why does neither C nor Objective-C have a format specifier for Boolean values?

我正在开发的应用程序有一个带有布尔 "approved" 字段的信用响应对象。我试图在 Objective C 中注销此值,但由于没有布尔值的格式说明符,我不得不求助于以下内容:

NSLog("%s", [response approved] ? @"TRUE" : @"FALSE");

虽然不可能,但我更愿意执行以下操作:

NSLog("%b", [response approved]);

...其中“%b”是布尔值的格式说明符。

经过一些研究,似乎一致 consensus 是 C 和 Objective-C 都没有相当于 "%b" 说明符,大多数开发者最终推出了他们自己的(一些东西就像上面的选项#1)。

显然 Dennis Ritchie & Co. 在编写 C 语言时就知道他们在做什么,我怀疑这个缺少的格式说明符是一个意外。我很想知道这个决定背后的理由,所以我可以向我的团队(他们也很好奇)解释。

编辑: 下面的一些答案表明这可能是一个本地化问题,即 "TRUE" 和 "FALSE" 过于英语化。但这不是所有语言都面临的困境吗?即不只是 C 和 Objective-C? Java 和 Ruby 等能够实现 "True" 和 "False" 布尔值。不确定为什么这些 langs 的作者没有同样地选择这个选择。

此外,如果本地化是问题所在,我希望它也会影响该语言的其他方面。以受保护的关键字为例。 C 使用英文关键字,如 "include"、"define"、"return"、"void" 等,对于非英语母语者来说,这些关键字可以说比 "true" 或 "false"。

Pure C(回到 K&R 品种)实际上没有布尔值 type,这是原生 printf 和 cousins 没有的根本原因有一个本机布尔格式说明符。表达式可以计算为零或非零整数值,这就是 if 语句在 C 中分别解释为假或真的内容。(理解这一点是理解令人愉快的 !! "bang bang operator"语法。)

(C99 did add a _Bool type,但除非您使用的是最纯的 C,否则您不太可能需要它;派生语言和通用平台已经具有通用的布尔类型或类型定义。)

BOOL 类型是一个 ObjC 构造,而 -[NSString stringWithFormat:](和 NSLog)根本没有额外的格式说明符来做任何特殊的事情。它当然可以(除了 %@),并选择一些合理的字符串放入其中;我不知道是否曾经考虑过这样的事情,但无论如何它让我印象深刻,因为它与所有其他格式说明符在种类上有所不同。您如何知道适当地本地化或大写 "yes" 或 "no"(或 "true" 或 "false"?)等的字符串表示形式?没有其他格式说明符会导致库做出这样的决定;所有其他的都是精确的数字或​​插入另一个方法调用的字符串结果。这看起来很繁琐,但让你选择你真正想要的文本可能是最优雅的解决方案。

格式化程序应该显示什么? 0 & 1?真假?是与否? -1 和 1?其他语言呢?

没有始终如一的正确答案,因此他们将其推给了应用程序开发人员,对他们来说,这将是一个更清晰(而且仍然简单)的选择。

在早期的 C 语言中,charshort 都没有数字 printf() 说明符,因为几乎不需要它。现在有 "%hhd""%hd"。任何小于 int/unsigned 的类型都被提升了。

今天,在 C 中,_Bool 类型可能会打印 "%d"

#include <stdio.h>
int main(void) {
  _Bool some_bool = 2;
  printf("%d\n", some_bool); // prints 1 (or 0 when false)
  return 0;
}

C 中缺少的 link 是它缺少用于 扫描 _Bool 的格式说明符。这导致了如下各种解决方案,这些解决方案对 "T" 或 "false".

这样的输入不满意
  _Bool some_bool;
  int temp;
  scanf("%d", &temp);
  some_bool = temp;