为什么下面的代码只返回a = 1?

时间:2008-09-29 12:03:51

标签: c++ conditional

为什么以下代码仅对a = 1?

返回true
main(){
int a = 10;
if (true == a)
     cout<<"Why am I not getting executed";
}

11 个答案:

答案 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。