请考虑以下示例:
int x;
if (x = 1)
//...
if (std::cout << "Is it true?")
//...
两者都被评为真,但为什么?
答案 0 :(得分:4)
if (x = 1)
与tmp = (x = 1); if (tmp) ...
operator << (const char *)
的“结果”是ostream&
,其中operator bool
编译器调用它以使其“可比”。如果出现错误,operator bool
将返回“false,否则为true”。在C ++ 11之前,它将返回void*
,但意思相同(如果有错误,则为“false(= 0),否则为true”。
答案 1 :(得分:3)
赋值的结果是它的左操作数,因此x = 1
的值是它的左操作数x
,其值现在为1
。并且在条件中将任何非零整数视为true。
答案 2 :(得分:1)
因为x = 1
是x
到1
的作业设置,所以不是相等的比较。比较是通过x == 1
完成的。
这是一个常见的错误。通常人们会编写1 == x
来捕获这些错误,因为赋值给常量会触发编译时错误。
答案 3 :(得分:1)
除了x
的分配结果,如其他答案所述
if (std::cout << "Is it true?")
评估为true
,因为该语句等同于
if ((std::cout << "Is it true?").good())
检查std::cout
的流状态。
答案 4 :(得分:0)
两个语句都返回0
以外的值,因此被认为是&#34; true&#34;。
如果为变量赋值,则该语句的结果为赋值,因此您可以一次分配多个变量。例如,foo = bar = baz = 1
。这是有效的,因为baz = 1
会产生1
,然后将其分配给bar
,然后分配给foo
。因此x = 1
的值为1
,因此为真。
接下来,std::cout << "foo"
:ostream上的operator<<
会返回ostream,因此您可以执行std::cout << "foo" << "bar";
之类的操作。同样,返回的值不是0
,因此是真的。
答案 5 :(得分:0)
在此条件x = 1
中,您首先将1
分配给x
变量,然后测试x,因此它与以下内容完全相同:
x = 1;
if( x ) // which is 1, so true
关于输出运算符<<
,如果输出流的状态true
正常,编译器将返回cout
。因此,如果发生某些错误,它将不会成为有效的流。
答案 6 :(得分:-1)
在第一个中,您将1
的值分配给x
。在条件中,非零值将始终评估为真。
对于第二个,当调用std::cout << "Is it true?"
时,运算符&lt;&lt;将返回对std::cout
的引用。那时,条件简单地简化为:
if (std::cout)
//
现在评估std::cout
是否处于good状态。