我正在尝试学习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
将保持不变。所以我的问题是,编译器在这个语句中究竟做了什么?我不能为我的生活弄明白。
谢谢, 布兰登
答案 0 :(得分:5)
C ++不支持多分配python样式,逗号运算符不能执行您的操作:http://en.wikipedia.org/wiki/Comma_operator
如果您为one
和two
分配相同的值,那么您可以
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, 2
。 std::tie()
创建了引用元组 - std::tuple
已超载operator=()
。
我知道它与Python中使用的语法不同,但功能相同,您可能想要使用它。