13

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

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

11 回答 11

38

当 Bool true 转换为 int 时,它始终转换为 1。因此,您的代码等效于:

main(){
   int a = 10;
   if (1 == a)
      cout<<"y i am not getting executed";
   }

这是C++ 标准的一部分,因此您希望每个符合 C++ 标准的编译器都会发生这种情况。

于 2008-09-29T12:08:55.383 回答
26

您的打印语句未执行的原因是您的布尔值被隐式转换为数字,而不是相反。即您的 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";
}
于 2008-09-29T12:09:08.563 回答
5

您的布尔值被提升为整数,并变为 1。

于 2008-09-29T12:06:27.930 回答
3

在 C 和 C++ 中,0 为假,除零以外的任何值都为真:

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";
}
于 2008-09-29T12:12:26.980 回答
2

因为 true 为 1。如果要测试 a 的非零值,只需编写 if(a)。

于 2008-09-29T12:06:25.187 回答
1

我建议你切换到一个警告你这个的编译器......(VC++ 产生这个:警告C4806:'==':不安全操作:提升为'int'类型的'bool'类型的值不能等于给定的常量;我手头没有另一个编译器。)

我同意 Lou Franco - 你想知道一个变量是否大于零(或不等于它),测试一下。

如果你不知道最后的细节,编译器隐式完成的所有事情都是危险的。

于 2008-09-29T12:27:59.470 回答
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";
}
于 2008-09-29T12:35:22.150 回答
-1

我不希望定义该代码,并且您不应该依赖编译器给您的任何行为。可能 true 正在转换为 int (1),并且 a 没有按照您的预期转换为 bool (true)。最好写出你的意思(a!= 0)然后依赖它(即使它被证明是定义的)。

于 2008-09-29T12:07:21.737 回答
-1

不同于 0 的东西(即假)不一定是真(即 1)

于 2008-09-29T12:07:22.517 回答
-2

因为布尔值在 C/C++ 中有点,true 用 1 表示,false 用 0 表示。

更新:正如评论中所说,我原来的答案是错误的。所以绕过它。

于 2008-09-29T12:07:25.587 回答
-2

因为 true 等于 1。它是在 pre-proccesor 指令中定义的,所以所有带有 true 的代码在编译之前都会变成 1。

于 2008-09-29T12:07:38.787 回答