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;

two将等于 3,但one将保持不变。所以我的问题是,编译器在这个语句中到底在做什么?我这辈子都想不通。

谢谢,布兰登

4

3 回答 3

5

C++ 不支持多赋值 python 样式,逗号运算符不符合您的意图:http ://en.wikipedia.org/wiki/Comma_o​​perator

如果您为两者分配相同的值onetwo那么您可以这样做

one = two = 3;

但在你的情况下,你不是,所以它们必须在不同的行上:

one = 3;
two = 4;

如果要交换值,则必须使用临时的第三个变量:

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

在 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 回答
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 回答