1

私はC++を学ぼうとしています。実験中、私は次のコードを入力しました。それが機能することを期待していませんでしたが、機能することを期待していました。

int one = 1, two = 2;
one, two = two, one;

cout << "one = " << one << "\n";
cout << "two = " << two << "\n";

コンパイラが文句を言わなかったという事実に勇気づけられました。これは、Pythonについて私が気に入っている主な機能のひとつであり、これまでに学んだほとんどすべてのプログラミング言語が一致しないためです。つまり、割り当てる前に複数の式を評価する機能です。一時変数を使用せずに結果。ただし、実行したときに、このコードは効果がないように見えることがわかりました。

少し遊んだ後、変数twoが実際に設定されていることに気付きました。したがって、このコードを実行すると、次のようになります。

one, two = 3, 4;

two3に等しくなりoneますが、変更されません。そして私の質問は、コンパイラがこのステートメントで正確に何をしているのかということです。私は私の人生のためにそれを理解することはできません。

ありがとう、ブランドン

4

3 に答える 3

5

複数割り当てのPythonスタイルはC++ではサポートされていません。コンマ演算子は意図したとおりに機能しません:http://en.wikipedia.org/wiki/Comma_o​​perator

one両方に同じ値を割り当てていれば、次のtwoことができます。

one = two = 3;

しかし、あなたの場合はそうではないので、それらは別々の行になければなりません:

one = 3;
two = 4;

値を交換したい場合は、一時的な3番目の変数を使用する必要があります。

int temp = one;
one = two;
two = temp;

次のことを考慮した場合:

one, two = 3, 4;

単純なケースは3 ,4;ここにあります4は破棄されるので、3つだけが残ります。

one, two = 3;

=これで、演算子よりも優先順位の高い代入演算子ができた,ので、で何が起こったかに関係なく、one, two最初two = 3;に評価されてから次のようにone, twoなります。

two = 3;
于 2012-04-22T19:33:03.477 に答える
4

まず、=演算子の優先順位が高い,ため、以下の両方の行は同等です。

(one), (two = 3), (4);
one, two = 3, 4;

次に、コンマ演算子は複数のステートメントをグループ化する方法ですが、最後のステートメントの値のみを表すため、次のようになります。

int a, b;
a = (b = 5, b*b);
cout << a << '\n';

25を出力します。コンパイラが何をしていたかについてあなたに啓蒙したことを願っています。

于 2012-04-22T19:39:24.647 に答える
4

C++11には。がありstd::tieます。

例:

#include <tuple>
#include <iostream>

int main()
{
    int a, b;
    std::tie(a, b) = std::make_tuple(1, 2);
    std::cout << a << ", " << b;
}

出力:1, 2std::tie()参照のタプルを作成します-そしてのstd::tupleオーバーロードがありoperator=()ます。

Pythonで使用されている構文と同じではないことは知っていますが、機能的には同じであるため、使用することをお勧めします。

于 2012-04-22T19:46:45.753 に答える