为什么下面的代码只在 a = 1 时返回 true?
main(){
int a = 10;
if (true == a)
cout<<"Why am I not getting executed";
}
为什么下面的代码只在 a = 1 时返回 true?
main(){
int a = 10;
if (true == a)
cout<<"Why am I not getting executed";
}
当 Bool true 转换为 int 时,它始终转换为 1。因此,您的代码等效于:
main(){
int a = 10;
if (1 == a)
cout<<"y i am not getting executed";
}
这是C++ 标准的一部分,因此您希望每个符合 C++ 标准的编译器都会发生这种情况。
您的打印语句未执行的原因是您的布尔值被隐式转换为数字,而不是相反。即您的 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";
}
您的布尔值被提升为整数,并变为 1。
在 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";
}
因为 true 为 1。如果要测试 a 的非零值,只需编写 if(a)。
我建议你切换到一个警告你这个的编译器......(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";
}
我不希望定义该代码,并且您不应该依赖编译器给您的任何行为。可能 true 正在转换为 int (1),并且 a 没有按照您的预期转换为 bool (true)。最好写出你的意思(a!= 0)然后依赖它(即使它被证明是定义的)。
不同于 0 的东西(即假)不一定是真(即 1)
因为布尔值在 C/C++ 中有点,true 用 1 表示,false 用 0 表示。
更新:正如评论中所说,我原来的答案是错误的。所以绕过它。
因为 true 等于 1。它是在 pre-proccesor 指令中定义的,所以所有带有 true 的代码在编译之前都会变成 1。