c ++使用先前读取的变量立即读取cin

时间:2015-07-29 12:17:41

标签: c++ c++11

在某些在线评判的代码中,我有以下内容:

vector<int> arr(1 << 20);

int p;
cin >> p >> arr[p];

这给我带来了一个分段错误,当我使用判断程序编译时(我无法访问他们的机器)编译器g ++ 4.9.2但不在我的本地Apple LLVM version 6.0 (clang-600.0.57)

然而写作:

int p;
cin >> p;
cin >> arr[p];

也适用于判断。这是一个已知的东西/错误吗?为什么第一个版本没有按预期工作?

1 个答案:

答案 0 :(得分:16)

由于运算符重载,您的第一个代码相当于:

operator >> (operator >> (std::cin, p), arr[p]);

函数参数operator >> (std::cin, p)arr[p]的评估未被排序。当您尝试以无序顺序读取编写p时,会出现未定义的行为。

可能发生的事情是你的实现,在这个特定的实例上,从左到右评估参数,但是法官的评估从右到左,并且索引arr未初始化的p