【问题标题】:std::cout and printf arraystd::cout 和 printf 数组
【发布时间】:2015-06-09 12:26:33
【问题描述】:
    int arrSize = 10;
    double* arr = new double [arrSize];
    for(int i = 0; i < arrSize; i++){
        arr[i] = i;
    }
    for(int i = 0; i < arrSize; i++){       
        printf("%d", arr[i]);
        //std::cout<<arr[i];
    }

这里

  • printf() 打印 0000000000。
  • cout 打印 0123456789。

为什么?

【问题讨论】:

    标签: c++ c printf cout format-specifiers


    【解决方案1】:

    printf() 中的任何特定参数使用错误的格式说明符会调用undefined behaviour

    arr 是一个double 数组,因此arr[i] 产生一个double 类型值。你需要%f 格式说明符来打印它。如果您使用%d 打印double,您的程序将面临UB,结果无法证明,in 可以是anything

    OTOH,与cout 一起使用的&lt;&lt; 是一个重载运算符,它可以根据所提供变量的类型调整。因此,它按预期打印输出。

    【讨论】:

      【解决方案2】:

      arr[i]double,但%dint 的格式说明符。使用错误的格式说明符是未定义的行为。来自 C11 标准,7.21.6.1/9:

      如果转换规范无效,则行为未定义。如果有任何论据 不是相应转换规范的正确类型,行为是 未定义。

      double 有许多格式说明符,它们将以不同的方式格式化输出,完整列表请参见 this reference

      另一方面,coutoperator&lt;&lt; 有一个重载,它直接采用double(链接参考中的#5),这样就可以了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        • 2012-08-16
        • 2011-06-26
        • 2016-12-29
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多