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

时间:2015-04-07 23:00:13

标签: objective-c c format-specifiers

我正在处理的应用程序有一个信用响应对象,其中包含布尔"已批准"领域。我试图在Objective C中注销这个值,但由于没有布尔值的格式说明符,我不得不求助于以下内容:

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

虽然不可能,但我更愿意做以下事情:

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

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

在做了一些研究之后,似乎一致consensus是C和Objective-C都没有相应的"%b"说明符,大多数开发人员最终都会自己编写(类似上面的选项#1)。

显然丹尼斯里奇&公司在写C时知道他们在做什么,我怀疑这个丢失的格式说明符是一个意外。我很想知道这个决定背后的理由,所以我可以向我的团队解释(他们也很好奇)。

修改 下面的一些答案表明它可能是一个本地化问题,即" TRUE"和"错误"太具有英语特色了。但这不是所有语言都面临的两难选择吗?即不只是C和Objective-C?除其他外,Java和Ruby能够实现" True"和"错误"布尔值。不知道为什么这些langs的作者在这个选择上并没有同样的做法。

此外,如果本地化是问题,我希望它也会影响语言的其他方面。例如,使用受保护的关键字。 C使用英语关键词,如" include"," define"," return"," void"等,这些关键词可以说更多非英语使用者难以解析而不是像" true"或"假"。

3 个答案:

答案 0 :(得分:7)

纯C(回到K& R品种)实际上没有布尔类型,这是本机printf和表兄弟没有本机的根本原因布尔格式说明符。表达式可以计算为零或非零整数值,这是在if语句中分别在C中解释为false或true的。(理解这是理解令人愉快的!!的语义的关键) bang bang operator“syntax。”

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

BOOL类型是一个ObjC构造,而-[NSString stringWithFormat:](和NSLog)根本没有额外的格式说明符,可以对它做任何特殊处理。它当然可以(除%@之外),并选择一些合理的字符串放在那里;我不知道是否曾经考虑过这样的事情,但无论如何它都与我所有其他格式说明符不同。你怎么知道适当地本地化或大写字母表示“是”或“否”(或“真”或“假”?)等?没有其他格式说明符导致库做出这样的决定;所有其他都是精确数字或插入另一个方法调用的字符串结果。这看起来很麻烦,但让你选择你真正想要的文字可能是最优雅的解决方案。

答案 1 :(得分:1)

格式化板应该显示什么? 0& 1?真实&假?是&没有? -1和1?其他语言怎么样?

没有一个好的一致正确的答案,所以他们向应用程序开发人员发出了苛刻的答案,对他们来说,这将是一个更清晰(并且仍然很简单)的选择。

答案 2 :(得分:0)

在C早期,printf()char没有数字short说明符,因为它几乎没有必要。现在有"%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中缺少的链接是缺少扫描_Bool的格式说明符。这导致了如下所述的各种解决方案,这些解决方案对输入不满意,例如&#34; T&#34;或&#34; false&#34;。

  _Bool some_bool;
  int temp;
  scanf("%d", &temp);
  some_bool = temp;