我对 C++ istream 赋值很好奇
I'm curious about c++ istream assignment
我对这段代码有一些疑问:
#include <iostream>
using namespace std;
int main() {
int i;
int w[10];
cin >> i >> w[i];
cout << i << ' ' << w[i];
return 0;
}
标准输入是:
3 10
在我的PC(Win10 64bit, gcc version : g++ 6.3.0)中,出现segmentation fault。
但其他环境(如https://ideone.com/i5Vd7o)可以执行它。
当我编辑这个部分时它工作正常:
cin >> i >> w[i];
对此:
cin >> i;
cin >> w[i];
于是2个小问题就出来了:
- istream赋值的标准是什么?分配的变量应该从当前行还是下一行读取?
- 如果编译器同时支持这两个,请读者选择'nice code'哪一个?
你 运行 进入了 C++17 之前的未定义行为。执行时
int i;
int w[10];
cin >> i >> w[i];
i
尚未初始化,读取其值未定义。读取 i
和 w[i]
的行尝试读取 i
以找出 w[i]
的位置,然后 一个值被放入由于 C++ 的 order of evaluation.
,来自输入流的 i
您的第二条语句有效,因为此处 i
是从标准输入中读取的,随后用于在 单独语句 中计算 w[i]
。
在 C++17 中,这种行为发生了变化,std::cin >> i >> w[i]
现在定义明确,因为每个 >>
的左侧在右侧计算之前计算,包括它的计算。这意味着在左关联 >>
调用链中,std::cin >> i
在 before
w[i] 之前完全执行` 被计算出来。
我对这段代码有一些疑问:
#include <iostream>
using namespace std;
int main() {
int i;
int w[10];
cin >> i >> w[i];
cout << i << ' ' << w[i];
return 0;
}
标准输入是:
3 10
在我的PC(Win10 64bit, gcc version : g++ 6.3.0)中,出现segmentation fault。
但其他环境(如https://ideone.com/i5Vd7o)可以执行它。
当我编辑这个部分时它工作正常:
cin >> i >> w[i];
对此:
cin >> i;
cin >> w[i];
于是2个小问题就出来了:
- istream赋值的标准是什么?分配的变量应该从当前行还是下一行读取?
- 如果编译器同时支持这两个,请读者选择'nice code'哪一个?
你 运行 进入了 C++17 之前的未定义行为。执行时
int i;
int w[10];
cin >> i >> w[i];
i
尚未初始化,读取其值未定义。读取 i
和 w[i]
的行尝试读取 i
以找出 w[i]
的位置,然后 一个值被放入由于 C++ 的 order of evaluation.
i
您的第二条语句有效,因为此处 i
是从标准输入中读取的,随后用于在 单独语句 中计算 w[i]
。
在 C++17 中,这种行为发生了变化,std::cin >> i >> w[i]
现在定义明确,因为每个 >>
的左侧在右侧计算之前计算,包括它的计算。这意味着在左关联 >>
调用链中,std::cin >> i
在 beforew[i] 之前完全执行` 被计算出来。