0

C++ 中的表达式返回什么,在对象上应用运算符后获得的实际值或基于计算值的真/假?特别 :

在此代码段中:

int i = 10, j = 5, k = 0;
i + j ;
k = i + j ;
while ( i + j )
{
    // Do something worth for the universe in this time
}

写在第 2 行的表达式将返回什么,15或者true?它会在第 4 行返回相同的值吗?总是15返回,但转换为truefalse基于上下文?

我在C++ Primer中读到了这个:

一会儿有形式

while (condition)
     statement   

通过(交替)测试条件并执行相关语句直到条件为假来执行一段时间。条件是产生结果为真或假的表达式。

但是表达式也可以只是简单的对象,对吧!?他们应该如何表示 a trueor false?例如:

// Create an object `tempObject` of a class `SomeRandomClass`
while ( tempObject )
{

}

有人可以解释吗?

4

4 回答 4

4

iforwhile中的“条件”不是来自表达式本身的直接布尔值 ( trueor ) 时(例如or或将给出布尔值),表达式被视为不等于零的比较.false==><=

所以:

int x = 25;

while(x)
 ... 

是相同的

while (x != 0)

这适用于所有类型,例如指针、整数和浮点值。

根据以下评论进行编辑:

a 的对象classorstruct必须可以以bool某种方式转换为 a :对象具有operator bool()如下直接:

class X
{
  private:
    int x;
  public:
    X(int xx = 0) x(xx) {}
    void setx(int xx) { x = xx; }
    bool operator bool() const { return x != 0; }
};

现在我们可以这样做:

X a(1);

if (a) ... 
a.setx(0);
if (a) ...

第一个if是真的,第二个if是假的。

如果没有operator bool()可用的,那么编译器可以使用operator int()operator void*转换类型,然后进行隐式!= 0比较以产生一个bool值。

于 2013-06-12T15:07:13.823 回答
2

0(并且false,在存在的 C++ 版本中)表示错误;任何其他值都表示 true。

于 2013-06-12T15:04:20.567 回答
1

要理解这些代码,请先回到C:

一切都是 0 是假的。不为 0 的一切都是真的。

在您的情况下,while 循环意味着 while ( 15 ) 与 while ( true ) 相同

一个无限循环...

将对象放入这样的代码中,该对象必须至少表现为整数或布尔值,从而为 while 循环提供任何可评估的表达式,例如

public:
    operator bool() const
    {
         return myVar;
    }

您将 while 条件存储在 myVar 中的位置...

于 2013-06-12T15:22:03.993 回答
1

i + j有类型int,因为两者i都是js int。表达式的值是两者之和。在声明中

i + j;

该值未使用,因此被忽略。编译器可能会忽略添加,因为它没有副作用。在声明中

k = i + j;

结果被使用;它被复制到k. 在声明中

while (i + j) {
}

该值在布尔上下文中使用。形式上,它是“上下文转换为bool”:零转换为false,任何其他值转换为true

于 2013-06-12T17:59:42.220 回答