这些如何评估为真?

时间:2014-03-15 10:05:47

标签: c++

请考虑以下示例:

int x;
if (x = 1)
    //...


if (std::cout << "Is it true?")
    //...

两者都被评为真,但为什么?

7 个答案:

答案 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 = 1x1的作业设置,所以不是相等的比较。比较是通过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状态。