2

以下に示すように、プログラムに複数の代入ステートメントがあります。ここでquery.constraints.size()、返されるはずです13constraintsは配列であり、そのサイズを返します)

int num,size =  query.constraints.size();

これを行うsizeと、予想どおり 13 にnumなりますが、何らかの理由で 9790272 になります。

以下のように別々に行うと、すべて問題なく、両方とも予想どおり13です

int size =  query.constraints.size();

int num =  query.constraints.size();

複数の代入が奇妙な奇妙な値になるのはなぜですか?

4

5 に答える 5

11

複数の代入が奇妙な奇妙な値になるのはなぜですか?

C++ には複数代入がないため1。ここでは 2 つの変数を宣言していますが、最初の変数ではなく、2 番目の変数のみを初期化します。


1できますint a, b = a = c;が、これを行うコードは、非常に特殊な状況を除いて、ほとんどの C++ プログラマーによって悪いと見なされます。

于 2012-08-10T15:00:24.810 に答える
4

あなたは複数回割り当てているのではなく、複数回宣言しているのです。次のようなことをする必要があります。

int num, size;
size = num = query.constraints.size();
于 2012-08-10T15:00:57.680 に答える
2

複数の割り当ては次のようになります。

int num, size;
num = size = query.constraints.size();

ただし、コンマ演算子は複数の割り当てを行いません。

于 2012-08-10T15:01:22.253 に答える
2

あなたが持っているのは、実際には、部分的に初期化子を含む宣言ステートメントです。あなたのコードはこのコードと同等です:

int num;  // uninitialized, you're not allowed to read it

int size(query.constraints.size());  // initialized

一般に、型の変数をT x = expr; 宣言し、値を.でコピー初期化します。基本的なタイプの場合、これは期待どおりに機能します。クラスタイプの場合、コピーコンストラクタは正式に必要なだけですが、実際には通常は省略されます。xTexpr

于 2012-08-10T15:02:22.753 に答える
0

コンマ演算子は、あなたが思っていることをしません

于 2012-08-10T15:00:41.330 に答える