c++ - 我对 c++ istream 赋值很好奇

标签 c++ coding-style code-generation iostream

我对此代码有一些疑问:

#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)中,出现段错误。
enter image description here

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

当我编辑此部分时它工作正常:
cin >> i >> w[i];

对此:
cin >> i;
cin >> w[i];

所以出现了2个小问题:
  • istream分配的标准是什么?应该从当前行还是下一行读取分配的变量?
  • 如果编译器同时支持这两种代码,哪一种对读者来说是“好代码”?
  • 最佳答案

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

    int i;
    int w[10];
    
    cin >> i >> w[i];
    
    i尚未初始化,读取其值未定义。读取 i 的行和 w[i]尝试阅读 i找出 w[i] 的位置在将值放入 i 之前由于 C++ 的 order of evaluation 来自输入流.

    你的第二个陈述有效,因为这里 i从标准输入中读取,随后用于计算 w[i]在单独的声明中。

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

    关于c++ - 我对 c++ istream 赋值很好奇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61865254/

    相关文章:

    ruby - 正确的设计 : Including module in ActiveRecord or helper method

    c# - C# 中的属性 GeneratedCodeAttribute 有什么用?

    c++ - QList 指向抽象类的指针函数

    python - 多个导出是否可以展平一个长的 Python 函数?

    c++ - 命名类时使用命名空间或前缀供应商名称?

    java - 为 GWT/Spring/Hibernate/PostgreSQL 生成服务/dao 层

    code-generation - 您是否创建自己的代码生成器?

    c++ - 在头文件中使用 "using"

    c++ - 简单乘以 float 1000 * 0.01 = 9 的舍入错误

    c++ - 插入数据库失败