C++ 流和运算符 >> 优先级
C++ stream and operator>> precedence
我有以下代码片段:
std::stringstream stream("ABC 123 CBA 321");
std::unordered_map<std::string, int> map;
std::string key;
我正在尝试像这样读取数据:
stream>>key>>map[key];
可以改写为:
operator>>(stream, key).operator>>(map[key]);
考虑到 >>
和 .
运算符都具有从左到右的关联性,您能否解释为什么 map[key]
在从流中读取 key
之前求值?
正在打印地图:
for(auto& it : map)
{
std::cout<<it.first<<" "<<it.second<<std::endl;
}
结果:
123
ABC 321
是的,123
前有个space
关联性在这里无关紧要。结合性决定哪些操作数绑定到哪些运算符。它不决定计算操作数子表达式的顺序。所以当你说:
a >> b >> c;
关联性规定操作数分组为 (a >> b) >> c
,但不规定表达式 a、b 和 c 的求值顺序。在 C++17 之前,标准未指定该顺序:这意味着可以按任何顺序计算 a、b 和 c。从C++17开始,顺序定义为a,b,c。
换句话说,符合 C++17 的编译器将打印:
CBA 321
ABC 123
或者反过来,因为容器是 std::unordered_map
,但不像您显示的输出那样是乱码。
我有以下代码片段:
std::stringstream stream("ABC 123 CBA 321");
std::unordered_map<std::string, int> map;
std::string key;
我正在尝试像这样读取数据:
stream>>key>>map[key];
可以改写为:
operator>>(stream, key).operator>>(map[key]);
考虑到 >>
和 .
运算符都具有从左到右的关联性,您能否解释为什么 map[key]
在从流中读取 key
之前求值?
正在打印地图:
for(auto& it : map)
{
std::cout<<it.first<<" "<<it.second<<std::endl;
}
结果:
123
ABC 321
是的,123
前有个space
关联性在这里无关紧要。结合性决定哪些操作数绑定到哪些运算符。它不决定计算操作数子表达式的顺序。所以当你说:
a >> b >> c;
关联性规定操作数分组为 (a >> b) >> c
,但不规定表达式 a、b 和 c 的求值顺序。在 C++17 之前,标准未指定该顺序:这意味着可以按任何顺序计算 a、b 和 c。从C++17开始,顺序定义为a,b,c。
换句话说,符合 C++17 的编译器将打印:
CBA 321
ABC 123
或者反过来,因为容器是 std::unordered_map
,但不像您显示的输出那样是乱码。