我对 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 分配的标准是什么?分配的变量应该从当前行还是下一行读取?
如果编译器同时支持,哪一个对读者来说是“好代码”?
【问题讨论】:
<<
是错字吗?
是的,我犯了一个错误。谢谢!
链接到在线编译器时,通常会链接到实际代码,这样人们就可以点击运行了。
@kkorona,你试过把int i
改成int i = 0
吗?
第一个在 C++ 17 之前有未定义的行为。
【参考方案1】:
您在 C++17 之前遇到了未定义的行为。执行时
int i;
int w[10];
cin >> i >> w[i];
i
尚未初始化,读取其值未定义。读取i
和w[i]
的行尝试读取i
以找出w[i]
的位置之前 由于C++ 的@,从输入流中将值放入i
987654321@.
您的第二条语句有效,因为这里的i
是从标准输入读取的,随后用于在单独的语句中计算w[i]
。
在 C++17 中,这种行为发生了变化,并且 std::cin >> i >> w[i]
现在定义良好,因为每个 >>
的左侧在右侧之前计算,包括其计算。这意味着在左关联 >>
调用链中,std::cin >> i
在计算w[i]` 之前完全执行。
【讨论】:
以上是关于我对 c++ istream 赋值很好奇的主要内容,如果未能解决你的问题,请参考以下文章