C ++ Multi-Assign Python功能

时间:2012-04-22 19:27:59

标签: c++ syntax

我正在尝试学习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将保持不变。所以我的问题是,编译器在这个语句中究竟做了什么?我不能为我的生活弄明白。

谢谢, 布兰登

3 个答案:

答案 0 :(得分:5)

C ++不支持多分配python样式,逗号运算符不能执行您的操作:http://en.wikipedia.org/wiki/Comma_operator

如果您为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;在{{1}之前首先进行评估导致:

one, two

答案 1 :(得分:3)

首先,=运算符的优先级高于,,因此以下两行都是等效的:

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

其次,逗号运算符是一种对多个语句进行分组的方法,但只表示最后一个语句的值,所以:

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

会打印25.希望能让你了解编译器正在做什么。

答案 2 :(得分:3)

在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中使用的语法不同,但功能相同,您可能想要使用它。