为什么以下代码仅对a = 1?
返回truemain(){
int a = 10;
if (true == a)
cout<<"Why am I not getting executed";
}
答案 0 :(得分:37)
当Bool true转换为int时,它总是转换为1.因此,您的代码相当于:
main(){
int a = 10;
if (1 == a)
cout<<"y i am not getting executed";
}
这是C++ standard的一部分,因此每个符合C ++标准的编译器都会发生这种情况。
答案 1 :(得分:26)
您的print语句未执行的原因是因为您的布尔值被隐式转换为数字而不是相反。即你的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";
}
答案 2 :(得分:5)
你的布尔值被提升为一个整数,并变为1。
答案 3 :(得分:3)
在C和C ++中,0为假,除零之外的任何内容都为真:
if ( 0 )
{
// never run
}
if ( 1 )
{
// always run
}
if ( var1 == 1 )
{
// run when var1 is "1"
}
当编译器计算布尔表达式时,它必须产生0或1.此外,还有一些方便的typedef和definitions,它允许你在表达式中使用“true”和“false”而不是1和0。 / p>
所以你的代码实际上是这样的:
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";
}
答案 4 :(得分:2)
因为true为1.如果要测试a为非零值,只需写入(a)。
答案 5 :(得分:1)
我建议你切换到一个警告你的编译器...(VC ++产生这个: 警告C4806:'==':不安全的操作:提升为类型'int'的'bool'类型的值不能等于给定的常量;我手边没有其他编译器。)
我同意Lou Franco - 你想知道一个变量是否大于零(或不等于它),测试它。
如果你不知道最后的细节,那么编译器隐含的一切都是危险的。
答案 6 :(得分:0)
以下是大多数人编写这种代码的方式:
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";
}
答案 7 :(得分:-1)
我不希望定义代码,也不应该依赖编译器给你的任何行为。可能正在转换为int(1),而a未按预期转换为bool(true)。最好写出你的意思(a!= 0)然后依赖于此(即使结果是定义的)。
答案 8 :(得分:-1)
与0不同的东西(即假)不一定是真的(即1)
答案 9 :(得分:-2)
因为布尔值是C / C ++中的一位,而true用1表示,false用0表示。
更新:正如评论中所述,我原来的答案是假的。所以绕过它。
答案 10 :(得分:-2)
因为true等于1.它在pre-proccesor指令中定义,因此所有带有true的代码在编译时转为1。