Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C和Objective-C都没有布尔值的格式说明符?_Objective C_C_Format Specifiers - Fatal编程技术网

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

为什么C和Objective-C都没有布尔值的格式说明符?,objective-c,c,format-specifiers,Objective C,C,Format Specifiers,我正在使用的应用程序有一个带有布尔“approved”字段的credit response对象。我试图在Objective C中注销此值,但由于布尔值没有格式说明符,因此我不得不求助于以下方法: NSLog("%s", [response approved] ? @"TRUE" : @"FALSE"); NSLog("%b", [response approved]); 虽然这是不可能的,但我更愿意做以下事情: NSLog("%s", [response approved] ? @"TRUE

我正在使用的应用程序有一个带有布尔“approved”字段的credit response对象。我试图在Objective C中注销此值,但由于布尔值没有格式说明符,因此我不得不求助于以下方法:

NSLog("%s", [response approved] ? @"TRUE" : @"FALSE");
NSLog("%b", [response approved]);
虽然这是不可能的,但我更愿意做以下事情:

NSLog("%s", [response approved] ? @"TRUE" : @"FALSE");
NSLog("%b", [response approved]);
…其中“%b”是布尔值的格式说明符

在做了一些研究之后,似乎一致认为C和Objective-C都没有与“%b”说明符等效的说明符,并且大多数开发人员最终都使用了自己的说明符(类似于上面的选项1)

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

编辑: 下面的一些答案表明这可能是一个本地化问题,即“真”和“假”过于英语化。但这不是所有语言都面临的困境吗?i、 e.不仅仅是C和Objective-C?Java和Ruby等能够实现“真”和“假”布尔值。我不知道为什么这些语言的作者们没有同样地在这个选择上下赌注

此外,如果本地化是个问题,我希望它也会影响语言的其他方面。以受保护的关键字为例。C使用诸如“include”、“define”、“return”、“void”等英语关键词,对于非英语使用者来说,这些关键词比诸如“true”或“false”等关键词更难解析

纯C(回到K&R变体)实际上没有布尔类型,这就是原生
printf
和堂兄弟没有原生布尔格式说明符的根本原因。表达式可以计算为零或非零整数值,这是C语言中
if
语句分别解释为false或true的值。(理解这一点是理解令人愉快的
!!
bang-bang运算符语法语义的关键。)

(不过,除非您使用的是最纯的C,否则您不太可能需要它;派生语言和通用平台已经有了通用的布尔类型或typedef。)

BOOL
类型是一个ObjC构造,并且
-[nsstringwithformat:
(和
NSLog
)根本没有额外的格式说明符来处理它。它当然可以(除了
%@
),并选择一些合理的字符串放入其中;我不知道是否考虑过这样的事情,但无论如何,我觉得它与所有其他格式说明符在性质上是不同的。您如何知道适当地本地化或大写“是”或“否”(或“真”或“假”)等字符串表示形式?没有其他格式说明符会导致库做出这样的决策;所有其他方法都是精确的数字或插入另一个方法调用的字符串结果。这似乎很繁重,但让你选择你真正想要的文本可能是最优雅的解决方案。

纯C(回到K&R变体)实际上没有布尔类型,这就是原生
printf
和堂兄弟没有原生布尔格式说明符的根本原因。表达式可以计算为零或非零整数值,这是C语言中
if
语句分别解释为false或true的值。(理解这一点是理解令人愉快的
!!
bang-bang运算符语法语义的关键。)

(不过,除非您使用的是最纯的C,否则您不太可能需要它;派生语言和通用平台已经有了通用的布尔类型或typedef。)


BOOL
类型是一个ObjC构造,并且
-[nsstringwithformat:
(和
NSLog
)根本没有额外的格式说明符来处理它。它当然可以(除了
%@
),并选择一些合理的字符串放入其中;我不知道是否考虑过这样的事情,但无论如何,我觉得它与所有其他格式说明符在性质上是不同的。您如何知道适当地本地化或大写“是”或“否”(或“真”或“假”)等字符串表示形式?没有其他格式说明符会导致库做出这样的决策;所有其他方法都是精确的数字或插入另一个方法调用的字符串结果。这似乎很繁重,但让你选择你真正想要的文本可能是最优雅的解决方案。

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


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

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


没有一致正确的答案,所以他们把它推给了应用程序开发人员,对他们来说,这将是一个更清晰(而且仍然简单)的选择。

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

今天,在C语言中,
\u Bool
类型可能打印有
“%d”


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

今天,在C语言中,
\u Bool
类型可能打印有
“%d”


这不是所有语言都面临的困境吗?i、 不仅仅是C和Ob