0

C++ の式は、オブジェクトに演算子を適用した後に得られる実際の値、または計算された値に基づく true/false を返しますか? 特に :

このコード セグメントでは:

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常に返されますが、コンテキストに変換trueまたはfalse基づいて?

私はC++ Primerでこれを読みました:

しばらくはフォームを持っています

while (condition)
     statement   

while は、(交互に) 条件をテストし、条件が false になるまで関連するステートメントを実行することによって実行されます。条件は、真または偽の結果をもたらす式です。

しかし、式は単純なオブジェクトでもかまいませんよね!? またはをどのように意味するのでしょうtruefalse? 例:

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

}

誰か説明できますか?

4

4 に答える 4

4

iforの「条件」が式自体からのwhile直接のブール値 ( trueor ) ではない場合(たとえば、 orはブール値を与える)、式はゼロに等しくない比較であるかのように見なされます。 .false==><=

そう:

int x = 25;

while(x)
 ... 

と同じです

while (x != 0)

これは、ポインター、整数、浮動小数点値など、すべての型に適用されます。

以下のコメントに従って編集します。

classorのオブジェクトは、何らかの方法でstructa に変換できる必要がありますbool: オブジェクトは次の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) ...

1 つ目ifは true になり、2 つ目ifは false になります。

利用可能ながない場合operator bool()、コンパイラはoperator int()oroperator void*を使用して型を変換し、暗黙的!= 0な比較を行ってbool値を生成します。

于 2013-06-12T15:07:13.823 に答える
2

0(およびfalse、それが存在する C++ のバージョンでは) は false を意味します。その他の値は true を意味します。

于 2013-06-12T15:04:20.567 に答える
1

これらのコードを理解するには、まず C に戻ってください:

0 のものはすべて false です。0 でないものはすべて true です。

あなたの場合、 while ループは while ( 15 ) を意味し、これは while ( true ) と同じです

無限ループ…

オブジェクトをそのようなコードに与えると、オブジェクトは少なくとも整数または論理値として振る舞い、while ループに評価可能な式を与える必要があります。

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

while 条件を myVar に格納する場所 ...

于 2013-06-12T15:22:03.993 に答える
1

i + jとの両方がsでintあるため、は型を持ちます。式の値は、2 つの合計です。声明ではijint

i + j;

この値は使用されないため、無視されます。副作用がないため、コンパイラが追加を省略する可能性があります。声明では

k = i + j;

結果が使用されます。にコピーされkます。声明では

while (i + j) {
}

値はブール コンテキストで使用されます。形式的には、「文脈的に変換bool」されます。ゼロは に変換されfalse、その他の値は に変換されtrueます。

于 2013-06-12T17:59:42.220 に答える