这些是如何被评估为真的

How are these evaluated as true?

本文关键字:评估 真的      更新时间:2023-10-16

考虑以下示例:

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

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

都被求值为真,但是为什么呢?

if (x = 1)tmp = (x = 1); if (tmp) ...本质上是一样的

operator << (const char *)的"结果"是一个ostream&,它有一个operator bool,编译器调用它使其"可比较"。operator bool将返回"如果有错误则为false,否则为true"。在c++ 11之前,它将返回一个void*,但其含义是相同的("如果有错误,则为false(= 0),否则为true"。

赋值的结果是它的左操作数,所以x = 1的值是它的左操作数x,现在的值是1。在此条件下,任何非零整数都被视为真。

因为x = 1是将x设置为1的赋值,而不是相等的比较。比较通过x == 1完成。

这是一个常见的错误。通常人们编写1 == x来捕获这些错误,因为对常量赋值会触发编译时错误。

除了其他答案中提到的x的分配结果

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

的计算结果为true,因为该语句等价于

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

检查std::cout的流状态

两个语句返回的值都不是0,因此被认为是"true"

如果你给一个变量赋值,语句的结果就是被赋的值,这样你就可以一次给多个变量赋值。例如:foo = bar = baz = 1。这是有效的,因为baz = 1产生1,然后将CC_22分配给bar,然后分配给foo。因此,x = 1的值为1,因此为真。

接下来,std::cout << "foo": ostream上的operator<<返回ostream,因此您可以执行std::cout << "foo" << "bar";之类的操作。同样,返回的值不是0,因此为真。

在此条件下,您首先将1分配给x变量,然后测试x,因此与

完全相同:
x = 1;
if( x ) // which is 1, so true

关于输出操作符<<,如果输出流的状态cout是ok,编译器将返回true。因此,如果发生错误,它将不是一个有效的流。

在第一个中,您将1的值分配给x。在一个条件中,非零值总是求值为真。

第二个,当std::cout << "Is it true?"被调用时,operator<<将返回对std::cout的引用。此时,条件简化为:

if (std::cout)
    //

现在正在评估std::cout是否处于良好状态