为什么下面的代码仅在a = 1时才返回true?为什么下面的代码仅在a = 1时才返回true?
main(){
int a = 10;
if (true == a)
cout<<"Why am I not getting executed";
}
为什么下面的代码仅在a = 1时才返回true?为什么下面的代码仅在a = 1时才返回true?
main(){
int a = 10;
if (true == a)
cout<<"Why am I not getting executed";
}
当布尔真正转化为一个int,它总是被转换为1。你的代码是这样,等同于:
main(){
int a = 10;
if (1 == a)
cout<<"y i am not getting executed";
}
这是C++ standard的一部分,所以它的东西,你会希望发生与每个C++标准兼容的编译器。
因为true是1.如果你想测试一个非零值,只需写if(a)。
你的布尔提升到一个整数,并成为1
我不希望被定义的代码,你不应该依赖于任何行为,你的编译器是给你的。可能真正的转换为int(1),并且a不会像您期望的那样转换为bool(true)。最好写出你的意思(a!= 0),然后依靠这个(即使它被定义)。
东西不同于0(即假)不是必需的真(即1)
由于布尔是在C/C++位和真由1表示,假由0
更新:如评论中所述,我的原始答案是错误的。所以绕过它。
C/C++不规定布尔值是有点。在C++布尔大小是实现相关的。 C没有布尔类型 - 它确实是一个整数。 – 2008-09-29 12:32:09
因为true等于1.它在pre-proccesor指令中定义,所以在编译时间之前,所有带有true的代码都会变成1。
您的print语句没有得到执行的原因是因为您的布尔值被隐式转换为数字而不是其他方式。即你的if语句是相同的:如果(1 ==一)
你可以解决这个问题,首先明确地将其转换为一个布尔值:
main(){
int a = 10;
if (((bool)a) == true)
cout<<"I am definitely getting executed";
}
在C/C++虚假表示为0。
其他一切都表示为非零。有时候是1,有时候是其他的。 所以你不应该测试平等(==)的东西是真实的。
相反,你应该测试平等的东西是错误的。由于false只有一个有效值。
在这里,我们测试的所有非假值,其中任何一个是罚款:
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";
}
,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";
}
我建议你切换到警告编译器你对此...(VC++产生这个: 警告C4806:'==':不安全的操作:没有值类型'bool'提升为'int'类型可以等于给定的常量;我没有另一个编译器。)
我同意娄佛朗哥 - 你想知道一个变量是否大于零(或不等于它),测试。
如果你不知道最后的细节,编译器隐含的所有事情都是危险的。
这是大多数人写那种代码的方式:
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";
}
伊克。如果你想测试一个非零值,写if(a!= 0)。 3个额外的角色可以说出你实际想到的内容,而不是说这些语言与你的想法等价。讨价还价。 – 2008-09-29 12:27:21
它是5个额外的字符,因为我会在运算符和它的操作数之间加上空格;) – OregonGhost 2008-09-29 12:28:48
哦,那么,在这种情况下采取了;)我曾经使用if(a)很多指针,意思是“如果有是一个“。但最终我决定,对我来说这并不是真正的帮助,而是放弃了。 – 2008-09-29 12:35:28