为什么下面的代码只有当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";
}
当一个布尔值为真时转换为整数,它总是被转换为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只有一个有效值。
在这里,我们测试所有非false值,任何一个都可以:
main(){
int a = 10;
if (a)
cout<<"I am definitely getting executed";
}
这是第三个例子,证明将任何被视为false的整数与false(即0)进行比较是安全的:
main(){
int a = 0;
if (0 == false)
cout<<"I am definitely getting executed";
}
您的布尔值被提升为整数,并变成了1。
if ( 0 )
{
// never run
}
if ( 1 )
{
// always run
}
if ( var1 == 1 )
{
// run when var1 is "1"
}
当编译器计算布尔表达式时,它必须生成0或1。此外,有几个方便的typedef和define,允许您在表达式中使用“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。如果你想测试一个非零值,只需写if(a)。
我建议您切换到一个可以警告您此类问题的编译器... (VC++ 出现以下警告: warning C4806: '==' : unsafe operation: no value of type 'bool' promoted to type 'int' can equal the given constant; 我手头没有其他编译器.)
我同意 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";
}
不同于0(即假)的东西并不一定是真的(即1)
因为在C/C++中布尔类型是一个位,true代表1,false代表0。
更新:如评论所说我的原始答案是错误的,请忽略它。