if(10)
这个条件为真,但if(10 == true)
却是假的。有人可以告诉我为什么第一个条件会将数字转换为布尔值,但第二个条件却没有呢?
if (10)
等价于if (10 != 0)
,而if (10 == true)
相当于if (10 == 1)
(因为true
被提升为类型为int
的值1
)。
通俗易懂地说:两件事情恰好满足某种属性并不意味着它们自动相同。
例如,甜甜圈和飞盘都是圆形的,但这并不意味着一个甜甜圈等于一个飞盘。整数和布尔值都可以在布尔上下文中进行评估,但这并不意味着每个被评估为真的整数都等于每个真布尔值。
if(10 != 0)
中,如果表达式10!=0
与0不相等,则执行语句体),但在C语言中将其写出来对于理解很有帮助。 - Paul Hankinif( 10 )
执行时会直接执行。而在C++中则变成了 if( true )
。然而,若为 if( 10 != 0 )
,在C语言中会变成 if( 1 )
(不是 if( 10 )
),在C++中则为 if( true )
。编译器需要将 10 != 0
优化为 1
或 true
。编译器解析和评估的是二进制表达式 10 != 0
。 - lllllllllll10 == 1
的语义略有不同:在C++中,该表达式具有bool
类型,而在C中,它具有int
类型并且取值为0
或1
。(直到最近,C才没有布尔类型。) - Kerrek SBif( ... )
{
// if statement
}
if( 10 ) -> if( bool( 10 ) ) -> if( true )
if(10 == true){ //something useful }
时,根据C++标准,背后应该有以下逻辑。if( 10 == true ) -> if( 10 == int( true ) ) -> if( 10 == 1 ) -> if( false )
你可以写类似这样的内容
if( 10 != false )
或者
if( !!10 == true )
if( ( bool ) 10 == true ) // alternatively, if( bool ( 10 ) == true )
if( 10 ) // evaluates directly since 10 is non-zero value
if( 10 == true ) -> if( 10 == 1 ) -> if( 0 )
true
是表示 1 的 1 位二进制的语法糖(bool(1)
或 0b1
)。 - lllllllllll关键字
是解析的语法结构。此外,布尔值不是单个位,它们至少为1字节,因为所有类型都具有sizeof(T) >= 1
,包括bool
。 - GManNickGtrue
和false
是否是分别代表1
和0
的8位表示的语法糖? - lllllllllll因为它们是完全不同的东西。
在 C 语言中,任何非 false 的值都会自动被视为 true,并且 C 有一个非常严格的 false
定义。
你可以将 if(10)
理解为 if(10 != false)
同样地,if (10 == true)
可以理解为 if((10 == true) != false)
10
明显不是 true
,因为 10
是一个数字而 true
是一个布尔值。
当你在 if 语句中时,编译器必须评估条件直到它达到 true 或 false。如果它没有达到 true 或 false,它必须将其转换为 true 或 false。通常情况下,0
会被评估为 false,而其他所有值都会被评估为 true。
所以 if(-1)
是 true,if(234)
也是 true,以此类推。
表达式 10 == true
已经评估为 false,因此不需要进一步的转换。if(10)
既不是 true 也不是 false,所以编译器必须使用我们上面的规则进行转换,它变成了 true。
1 == true
是正确的,即使 1
是一个数字是一个 int
常量,而 true
是一个 bool
常量。 - Antti Haapala -- Слава Україніtrue
和false
是宏,会扩展为1
和0
,就像另一个整数常量一样。 - Antti Haapala -- Слава Україні
if(!!10 == true)
- BLUEPIXYif(10)
而不能使用if( 1== true)
。在失败的 'if' 语句中,值 1 被与用于表示“true”的值进行比较。无论如何,10 不是 1(也不是 2 或 !0),因此比较的结果是 false。 - user3629249true
是一个布尔值,如果提升为整数,则会精确地转换为1。我相信这与C99一致,考虑到包含了stdbool.h
。 - rici