为什么下面的代码仅对a = 1返回true?
为什么下面的代码仅对a = 1返回true?
main(){ int a = 10; if (true == a) cout<<"Why am I not getting executed"; }
解决方案
因为true为1. 如果要测试a的非零值,只需编写if(a)。
布尔值将提升为整数,然后变为1.
我不希望代码被定义,并且我们不应该依赖于编译器给任何行为。可能是true转换为int(1),而a并未转换为我们期望的bool(true)。最好写出你的意思(a = 0),然后再依赖它(即使事实证明它已经定义了)。
不同于0(为假)的东西不一定为真(即1)
因为布尔值在C / C ++中有点,并且true表示为1,false表示为0。
更新:如评论中所述,我原来的答案是错误的。所以绕开它。
因为true等于1. 它是在pre-procesor伪指令中定义的,所以其中所有带有true的代码在编译之前都会转换为1.
如果将Bool true转换为int,则始终将其转换为1. 因此,代码等效于:
main(){ int a = 10; if (1 == a) cout<<"y i am not getting executed"; }
这是C ++标准的一部分,因此我们希望每一个符合C ++标准的编译器都可以实现这一点。
打印语句未得到执行的原因是,布尔值被隐式转换为数字,而不是相反。 IE。if语句与此等效:if(1 == a)
我们可以通过首先将其显式转换为布尔值来解决此问题:
main(){ int a = 10; if (((bool)a) == true) cout<<"I am definitely getting executed"; }
在C / C ++中,false表示为0。
其他所有内容均表示为非零。有时是1,有时是其他任何东西。
因此,我们永远不要测试是否等于真(==)。
相反,我们应该测试是否存在错误。由于false只有1个有效值。
在这里,我们正在测试所有非假值,它们中的任何一个都可以:
main(){ int a = 10; if (a) cout<<"I am definitely getting executed"; }
第三个例子只是为了证明比较认为是假的任何整数与假(只有0)是安全的:
main(){ int a = 0; if (0 == false) cout<<"I am definitely getting executed"; }
在C和C ++中,0为false,除0外为true:
if ( 0 ) { // never run } if ( 1 ) { // always run } if ( var1 == 1 ) { // run when var1 is "1" }
当编译器计算布尔表达式时,它必须产生0或者1. 此外,还有一些方便的typedef和定义,它们使我们可以在表达式中使用" true"和" false"而不是1和0。
因此,代码实际上看起来像这样:
main(){ int a = 10; if (1 == a) cout<<"y i am not getting executed"; }
我们可能想要:
main(){ int a = 10; if (true == (bool)a) cout<<"if you want to explicitly use true/false"; }
或者实际上只是:
main(){ int a = 10; if ( a ) cout<<"usual C++ style"; }
我建议我们切换到一个向我们发出警告的编译器...(VC ++会产生以下结果:
警告C4806:'==':操作不安全:提升为'int'类型的'bool'类型的值不能等于给定的常量;我手头没有其他编译器。)
我同意Lou Franco,我们想知道变量是否大于零(或者不等于零),对此进行测试。
如果我们不了解最后一个细节,则编译器隐式完成的所有操作都是危险的。
这是大多数人编写这种代码的方式:
main(){ int a = 10; if (a) // all non-zero satisfy 'truth' cout<<"y i am not getting executed"; }
我也看到了:
main(){ int a = 10; if (!!a == true) // ! result is guaranteed to be == true or == false cout<<"y i am not getting executed"; }