【发布时间】:2017-06-17 02:15:07
【问题描述】:
这是一段非常简单的代码:
#include <cstdio>
#include <unordered_map>
int main() {
std::unordered_map<int, int> m;
m[1] = m.find(1) == m.end() ? 0 : 1;
printf("%d\n", m[1]);
return 0;
}
如果地图不包含1,则赋值m[1]=0;否则m[1]=1。我用不同的gcc 编译器here 尝试了这个。
gcc5.2 总是输出 1,gcc7.1 总是输出 0。
为什么会如此不同?它不应该总是0吗?我无法理解这种行为。编写这样的逻辑最安全的方法是什么?
【问题讨论】:
-
未定义行为的好例子?? “写这种逻辑最安全的方法是什么?”不要这样做。
-
所以大家在编程之前都应该阅读完整的C++标准。
-
@LaoMao 不,你应该编写不可否认的可以理解的程序。
-
建议:将标题更改为更通用的名称,例如:“分配排序顺序是否为未定义行为?”
-
在 C++ 中,所有函数和运算符的默认规则是“参数评估没有顺序”。它发生在函数调用/运算符本身之前。 C++17 添加了一些 限制。不要在阅读时修改值。
标签: c++ c++14 unordered-map c++17