考虑使用 Visual Studio 2015 编译的以下代码:
#include <iostream>
#include <cassert>
void foo(bool b)
{
std::cout << b;
}
int main()
{
int a;
foo(a = 2); // Getting warning #4800
foo(!(a = 2)); // Not getting any warning
return 0;
}
foo( a = 2 )
产生警告 4800 'int': forcing value to bool 'true' or 'false'
,很好。
但是
foo( !(a = 2) )
不会产生警告。为什么?在某些时候,有一个 int 可以进行 bool 转换!
foo(a = 2)
相当于 bool b = (a = 2)
。表达式 a = 2
返回 a
,因此它相当于
a = 2;
bool b = a; //Conversion of 'int' to 'bool' -> Warning!
foo(!(a = 2))
相当于 bool b = !(a = 2)
。表达式 a = 2
返回 a
:
a = 2;
bool b = !a; //'!a' is legal => It returns a bool -> No warning!
请注意,您可以将
operator!
应用于 int
,这会否定 int
,从而返回 bool
。这就是为什么没有性能警告。