std :: cout和printf数组

时间:2015-06-09 12:26:33

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

    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。

为什么?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

  

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

double有许多格式说明符会以不同的方式格式化输出,有关完整列表,请参阅this reference

另一方面,cout的{​​{3}}有一个直接占用double的重载(链接引用中为#5),这样才能正常工作。