如果我在if条件中使用赋值运算符或输出函数,为什么将其视为“ true”布尔值?
例如,我
if(cout << "a"){cout << "c";}
或
if(int x=7){cout << "c";}
甚至
if(6){cout << "c";}
输出 实际上是c以及c和c在每种情况下。但是我们被告知,在if条件内,我们必须使用一个表达式,该表达式最终求值为1或0之类的布尔值。
那我缺少什么信息?
答案 0 :(得分:2)
在每种情况下,表达式都会转换为布尔值。在您使用的三种情况下,此布尔值都是正确的(可能并不总是正确的。)
if(cout << "a"){cout << "c";}
在这种情况下,表达式:
cout << "a"
如果找到operator<<(std::ostream&, char const*)
定义,您将发现返回值为std::ostream&
。因此,这将返回对cout
对象(类型为std :: ostream)的引用。流对象具有布尔转换方法explicit bool()
,可用于将对象转换为bool。其结果取决于对象的状态(如果对象处于不良(失败)状态,则将返回false)。
因此,您在这里检查流上的最后一个操作是否有效。如果确实如此,则打印“ c”。通常在输入流上使用它来验证用户输入。
int val;
if (std::cin >> val) {
if (std::cout << "A value was correctly read\n") {
// Add response worked.
}
else
{
// Something bad happened to std::cout
}
}
在其他情况下,您使用int变量。这些可以隐式转换为bool。如果该值不为零,则为true(否则为false)。
答案 1 :(得分:1)
条件(或布尔转换)中的每个值都将为true,除非它等于0。
(6) returns => 6 != 0 => true
(x = 7) returns => 7 != 0 => true
(cout << "aa") returns => ostream object.
bool context so calls `ostream::operator bool()`
If the stream is in good state => true
Otherwise => false
在c中,您可以使用NULL
并带有以下声明:
#define NULL 0
这意味着如果一个指针等于NULL
,它将在布尔转换中返回false。
C ++中布尔表达式的示例:
int a, b, *c;
char d;
bool e;
a = 0;
b = 2;
c = nullptr;
e = a; // false
e = b - 2; // false
e = c; // false
c = &a;
e = c; // true
e = b; // true
e = a + 1; // true
e = b ^ b; // false
d = 0;
e = d; // false
d = '0';
e = d; // true
答案 2 :(得分:0)
在所显示的所有情况下,提供的表达式最终都可以转换为bool
仍然是正确的。如果查看std::cout
中的<<
operator和类似的ostream
,您会发现它们都返回对相同流的引用。此流还定义了conversion to bool
operator,在需要bool
的上下文中隐式调用了{{3}}。如果流没有错误,则此特定转换将返回true
。其次,int x=7
是一个初始化,它返回刚刚初始化的x
的值; 7
在这种情况下。如果C ++中的int
不为零,则可以将其隐式转换为true
,这就是7
和6
在第二个和第三个示例中都为true的原因。