这些是如何被评估为真的
How are these evaluated as true?
考虑以下示例:
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
是否处于良好状态
- std::condition_variable::wait()如何评估给定的谓词
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- c++11评估顺序(未定义的行为)
- 字节真的是最小可寻址单元吗
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 如何在 std::vector 中找到<bool>哪些索引是真的?
- std::string 的对象真的可以移动吗?
- 在这种情况下,我真的复制了字节还是复制了字符?
- 如何使用"equal to"以外的评估编写开关语句
- 嵌套 if 中没有返回评估
- 懒惰的参数评估try_emplace?
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- int8_t和uint8_t真的是整数吗?它们有什么用?
- 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?
- 查找不等式为真的次数时出现问题
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- C++17:使用 std::optional 来评估枚举是否包含值
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 这些是如何被评估为真的