9

Boostのドキュメントの例で、このコードに出くわしました。

std::vector<int> input;
input += 1,2,3,4,5,6,7,8,9;

かわいいね。Boostには、ほとんどの状況でコンマが演算子であるという事実を利用するoperator+=のテンプレートがあります。(賢明なことに、C ++では、ハキストが「演算子」をオーバーロードすることはできません。)

私もかわいいコードを書くのが好きなので、コンマ演算子で遊んでみました。私には奇妙に見える何かを見つけました。次のコードは何を出力すると思いますか?

#include <iostream>
int main() {
    int i;
    i = 1,2;
    std::cout << i << ' ';
    i = (1,2);
    std::cout << i << std::endl;
}

ご想像の通り。VC ++ 2012は「1、2」を出力します。どうしたの?

[編集:もっと正確にすべきだった。C ++では、intのリスト内の演算子「、」をオーバーロードすることはできません。または、さらに良いことに、何もありません。'、'演算子は、クラスと列挙型に対してオーバーロードできます。]

4

2 に答える 2

14

ケース1:

i = 1,2;

=よりも優先順位が高い,

したがって、1に割り当てられiます。

割り当てはinに評価されるためlvaluec++(inに評価さrvaluecます)にi,2評価され2ます(注を参照)

ケース2:

i = (1,2);

()よりも優先順位が高い=

expressionsまたは演算子でoperands区切られ,、最後の値に評価されるexpressionか、operandしたがって、2に割り当てられますi


ノート

comma expressionlikeは左から右に33,77,x,y,z評価されます。

このようなコンマ式の結果は、右端の式の値です。

Consider, int z=100; 
then
1,4,5; //evaluates to 5
1,100,z+100; //evaluates to 200
于 2012-10-04T17:26:22.837 に答える
5

シンプル:"="の方が優先度が高くなります。

i = 1,2;

(i = 1)、2に似ています。つまり、式の結果は2ですが、破棄されます。

i = (1,2);

(1,2)の結果は2です。

編集:これは次のようなものかもしれません

for (i=0, j=0; ...)

期待どおりに動作します。

于 2012-10-04T17:25:56.317 に答える