我对 c++ istream 赋值很好奇

Posted

技术标签:

【中文标题】我对 c++ istream 赋值很好奇【英文标题】:I'm curious about c++ istream assignment 【发布时间】:2020-09-03 23:53:23 【问题描述】:

我对此代码有一些疑问:

#include <iostream>
using namespace std;

int main() 
    int i;
    int w[10];

    cin >> i >> w[i];
    cout << i << ' ' << w[i];
    return 0;

标准输入是:

3 10

在我的电脑(Win10 64bit,gcc 版本:g++ 6.3.0)中,出现分段错误。

但其他环境(如https://ideone.com/i5Vd7o)可以执行它。

当我编辑这个部分时它工作正常:

cin >> i >> w[i];

到这里:

cin >> i;
cin >> w[i];

所以出现了两个小问题:

    istream 分配的标准是什么?分配的变量应该从当前行还是下一行读取? 如果编译器同时支持,哪一个对读者来说是“好代码”?

【问题讨论】:

&lt;&lt; 是错字吗? 是的,我犯了一个错误。谢谢! 链接到在线编译器时,通常会链接到实际代码,这样人们就可以点击运行了。 @kkorona,你试过把int i改成int i = 0吗? 第一个在 C++ 17 之前有未定义的行为。 【参考方案1】:

您在 C++17 之前遇到了未定义的行为。执行时

int i;
int w[10];

cin >> i >> w[i];

i 尚未初始化,读取其值未定义。读取iw[i] 的行尝试读取i 以找出w[i] 的位置之前 由于C++ 的@,从输入流中将值放入i 987654321@.

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

在 C++17 中,这种行为发生了变化,并且 std::cin &gt;&gt; i &gt;&gt; w[i] 现在定义良好,因为每个 &gt;&gt; 的左侧在右侧之前计算,包括其计算。这意味着在左关联 &gt;&gt; 调用链中,std::cin &gt;&gt; i 在计算w[i]` 之前完全执行

【讨论】:

以上是关于我对 c++ istream 赋值很好奇的主要内容,如果未能解决你的问题,请参考以下文章

std::istream::get

将字符串或char *转换为istream的最佳方法?

在 Windows 中将 FILE * 或 HANDLE 转换(分配)到 IStream

使用运算符将​​字符串流传递给 istream >>

C++流输入istream的成员函数及其用法

如何将 istream 传递给 c++ 中的函数?