我可以为任何C ++编译器假设(bool)true ==(int)1吗?


117

我可以假定(bool)true == (int)1使用任何C ++编译器吗?


3
您问题中的强制类型转换是多余的,是否应该撤销?
GManNickG

9
他不是说要当演员,而是说bool t = true; int n = 1; if (t == n) {...} ;
egrunin 10-4-27

7
@egrunin:嗯,但是true是布尔值,而1是int值。:)
GManNickG 2010年

1
对,我的意思是说明值的类型。
Petruza 2010年

2
(int) true1一个整数值,但是if (pointer)在if部分中经过pointer != 0。你可以假设为真,唯一的事情就是false == 0,和true != 0(和true计算结果为1当投地int
路易斯·科罗拉多州

Answers:


133

是。演员表是多余的。在您的表情中:

true == 1

应用积分提升,并且布尔值将提升为,int并且该提升必须产生1。

参考:4.7 [conv.integral] / 4:如果源类型为bool...,true则转换为1。


9
@Joshua:true是由语言定义的关键字。不能由库重新定义。#define不允许重新定义关键字。
jalf

21
@jalf:确实允许#define定义系统关键字。C编译的预处理阶段纯粹是文本性的,通常不了解关键字或C语法。但是,重新定义语言关键字几乎总是一个坏主意。
Dale Hagglund 2010年

2
@杰夫 他们不是?请参阅gcc.gnu.org/onlinedocs/cpp/Macros.html,以及国际混淆式C代码竞赛中的至少一项,该竞赛曾经被问到“什么时候while不花时间?”。(答案:当它带有两个参数时,因为该条目必须包含#definedprintf。)
Ken Bloom10年

3
C99,第6.10.1 / 1节说:“控制条件包含的表达式应为整数常量表达式,但以下条件除外:它不包含强制转换;标识符(包括与关键字在词法上相同的标识符)的解释如下:” 尽管未声明为直接许可,但这显然考虑了与关键字“在词法上相同”的宏的可能性。
杰里·科芬

2
哦,并且#defines允许重新定义关键字。C ++ 1x的新关键字引起太多问题,因此必须删除要求。
约书亚

18

查尔斯·贝利的答案是正确的。C ++标准的确切措辞为(§4.7/ 4):“如果源类型为bool,则将false值转换为零,将true值转换为1。”

编辑:我看到他也添加了参考-如果我不分心并且忘记了,我会很快删除它。

Edit2:那么,再次值得注意的是,尽管布尔值本身总是转换为零或一,但许多函数(尤其是C标准库中的函数)返回的值是“基本布尔”,但表示为ints通常只需要为零即可表示假,而非零则可以表示真。例如,is *函数在<ctype.h>仅需要零或非零,不一定需要零或一。

如果bool将其强制转换为,则零将转换为false,非零将转换为true(如您所愿)。


9

根据标准,使用该假设应该很安全。C ++ bool类型具有两个值- truefalse具有对应的值1和0。

要注意的是将bool表达式和变量与BOOL表达式和变量混合。后者定义为FALSE = 0TRUE != FALSE,实际上,这通常意味着要考虑任何不同于0的值TRUE

如果值不为0或1,许多现代的编译器实际上会对任何隐式尝试从BOOLto 强制转换的代码发出警告。boolBOOL


3

我发现不同的编译器会在true上返回不同的结果。我还发现,将布尔值与布尔值而不是int进行比较几乎总是更好的选择。这些int会随着时间的推移随着程序的发展而改变值,如果您将true假设为1,则可能会被代码中其他地方的不相关更改所困扰。


3
对于C ++,这是不正确的答案,对于true具有定义行为的language关键字来说,这也是不正确的答案。如果引用诸如的通用定义的宏TRUE,那是正确的。
David Thornley,2010年

1
可能是我在C编译器方面的经验-多年来,我在这些方面花费了很多时间。我的观点是直接在if语句中使用数学表达式。我们的代码看到if中的位移是否为非零,然后其他人采用了相同的非零值,并假设该值为1并炸毁了填充物。简单地转换为true / 1可以避免这种情况。
Michael Dorgan

我也看到过这种行为。诚然,我最后一次看到它是在1999年。我正在使用GCC。语言是C。不过,我确实确实看到过这种行为。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.