我对 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个小问题就出来了:

  1. istream赋值的标准是什么?分配的变量应该从当前行还是下一行读取?
  2. 如果编译器同时支持这两个,请读者选择'nice code'哪一个?

你 运行 进入了 C++17 之前的未定义行为。执行时

int i;
int w[10];

cin >> i >> w[i];

i 尚未初始化,读取其值未定义。读取 iw[i] 的行尝试读取 i 以找出 w[i] 的位置,然后 一个值被放入由于 C++ 的 order of evaluation.

,来自输入流的 i

您的第二条语句有效,因为此处 i 是从标准输入中读取的,随后用于在 单独语句 中计算 w[i]

在 C++17 中,这种行为发生了变化,std::cin >> i >> w[i] 现在定义明确,因为每个 >> 的左侧在右侧计算之前计算,包括它的计算。这意味着在左关联 >> 调用链中,std::cin >> ibeforew[i] 之前完全执行` 被计算出来。