10

私は C++ の世界 (および C も) のまったくの初心者です。そして、その詳細をすべて知っているわけではありません。ただ、どうしても気になることがあります。それは次のような構造です: . while (a=b) {...}私が理解しているように、C および C++ の代入演算子は何かを返すため、この魔法が機能します。質問: 何を返しますか? これは文書化されていますか?C と C++ で同じように動作しますか? C と C++ の両方での代入演算子とその実装に関する低レベルの詳細 (違いがある場合) は非常に高く評価されます!

低レベルの観点からは、このテーマに関する包括的な説明と優れた資料が見つからないため、この質問が閉じられないことを願っています。

4

4 に答える 4

17

C ++の組み込み型の場合、代入式を評価すると、代入式の左側にある左辺値が生成されます。結果を使用する前に割り当てが順序付けられるため、結果が右辺値に変換されると、新しく割り当てられた値が取得されます。

int a, b=5;
int &c = (a=b);
assert(&c==&a);
b=10;
assert(10==(a=b));

Cはほとんど同じですが、まったく同じではありません。Cの代入式の結果は、代入の左側に新しく割り当てられた値と同じ右辺値になります。

int *c = &(a=b); // not legal in C because you can only take the address of lvalues.

通常、代入の結果がまったく使用される場合、それは右辺値(たとえばa=b=c)として使用されるため、C++とCのこの違いはほとんど気付かれません。

于 2013-02-04T23:39:41.063 に答える
7

代入演算子は、代入された変数の値を返すものとして (C で) 定義されています。つまり、式の値は、式が評価された後の(a=b)値です。a

C++ でのユーザー定義の演算子のオーバーロードでは、別の (同じ型の) ものとして定義できますが、ほとんどの人は、これを演算子のオーバーロードの非常に不快な使用法と見なすと思います。

この (非ブール値) 値は、型変換のためにwhile(または anifなど) で使用できます。条件付きコンテキストで値を使用すると、条件付きコンテキストで意味のあるものに暗黙的に変換されます。C++ では、これはboolであり、オーバーロードすることで (独自の型に対して) 独自の変換を定義できますoperator bool()。C では、以外0は true です。

于 2013-02-04T23:50:02.603 に答える
1

このような式を理解するには、最初に、正の整数は「真」と見なされ、0は偽と見なされることを理解する必要があります。

=割り当ては、その値として演算子の左側に評価されます。つまり、に割り当てられた後、ゼロ以外に評価される場合while(a=b) { }を意味します。それ以外の場合は、次のように見なされますwhile(1 /*true*/)abwhile(0 /*false*/)

同様に、演算子(a=b)?1:0は..aに割り当てられた後の値bです。ゼロ以外の場合、値はと見なされ、true?のステートメントが実行されるか、次のステートメント:が実行されます。

割り当ては通常、演算子の左側の値に評価されますが、=論理演算子(など)は1または0に評価されます。==&&

注:C ++では、特定の演算子がオーバーロードされているかどうかに依存します。また、オーバーロードされた演算子の戻り値のタイプにも依存します。

于 2013-02-04T23:36:32.973 に答える
0

CおよびC++の代入演算子は、代入されている変数の値、つまり左側のオペランドを返します。の例ではa = b、この式全体の値はに割り当てられた値ですa(これはbのタイプに変換された値ですa)。

したがって、代入演算子はその左オペランドの値を「返す」と言うことができます。

=C ++では、実際のユーザー定義関数で演算子をオーバーロードし、左のオペランドの値(および型)以外のものを返すことができるため、少し複雑になります。

于 2013-02-04T23:41:42.963 に答える