最近、私はこのコードに出くわしました。私の「コーディング生活」のすべてで、なぜこの種の構文を見たことがないのかわかりません。
int main()
{
int b;
int a = (b=5, b + 5);
std::cout << a << std::endl;
}
aの値は10です。この初期化の方法は正確には何と呼ばれますか?それはどのように機能しますか?
最近、私はこのコードに出くわしました。私の「コーディング生活」のすべてで、なぜこの種の構文を見たことがないのかわかりません。
int main()
{
int b;
int a = (b=5, b + 5);
std::cout << a << std::endl;
}
aの値は10です。この初期化の方法は正確には何と呼ばれますか?それはどのように機能しますか?
この文:
int a = (b=5, b + 5);
コンマ演算子を使用します。C++11規格の5.18/1項によると:
[...]コンマで区切られた式のペアは、左から右に評価されます。左の式は破棄された値の式です(5節)。83左の式に関連付けられたすべての値の計算と副作用は、右の式に関連付けられたすべての値の計算と副作用の前に順序付けられます。結果のタイプと値は、右のオペランドのタイプと値です。結果は、右のオペランドと同じ値のカテゴリになり、右のオペランドがglvalueとビットフィールドの場合はビットフィールドになります。右のオペランドの値が一時(12.2)の場合、結果はその一時です。
したがって、ステートメントは次のようになります。
b = 5;
int a = b + 5;
個人的には、ここでコンマ演算子を使用する理由はわかりません。他の方法で行う正当な理由がない限り、変数を読みやすい方法で初期化するだけです。
演算子,
は引数を次々に評価し、最後の値を返します
初期化だけでなく使用することもできます
コンマ,
演算子を使用すると、式を区切ることができます。によって行われたcompountステートメント
exp1, exp2, ..., expn
に評価されexpn
ます。
つまり、最初b
にに設定され5
、次にa
に設定されb + 5
ます。
補足:,
演算子の表で優先順位が最も低いため、
int a = b = 5, b+5;
とは異なります
int a = (b = 5, b+5);
最初のものは次のように解析されるためです(int a = b = 5), b + 5
式で使用すると、コンマ演算子はそのすべてのオペランド(左から右)を評価し、最後のオペランドを返します。
初期化はコピー初期化と呼ばれます。右側の複雑な式を無視すると、次のようになります。
int a = 10;
これは、次のような直接初期化とは対照的です。
int a(10);
(コンマ式を評価する方法について個別に混乱している可能性があります。その場合はその旨を示してください。)