在C ++中的if条件中使用赋值运算符

时间:2018-08-14 17:43:45

标签: c++ syntax

如果我在if条件中使用赋值运算符或输出函数,为什么将其视为“ true”布尔值?

例如,我

if(cout << "a"){cout << "c";}

if(int x=7){cout << "c";}

甚至

if(6){cout << "c";}

输出 实际上是c以及c和c在每种情况下。但是我们被告知,在if条件内,我们必须使用一个表达式,该表达式最终求值为1或0之类的布尔值。

那我缺少什么信息?

3 个答案:

答案 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,这就是76在第二个和第三个示例中都为true的原因。