我正在处理的应用程序有一个信用响应对象,其中包含布尔"已批准"领域。我试图在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"或"假"。
答案 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;