std::cout and printf array


    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.

为什么?

printf()中使用错误的格式说明符会调用未定义的行为。

arrdouble数组,因此arr[i]产生double类型的值。您需要%f格式说明符来打印它。如果您使用%d来打印double,您的程序将面临UB,并且结果不能被对齐,在任何

OTOH,与cout一起使用的<<是一个重载操作符,它可以根据所提供变量的类型调整。因此,它按预期输出。

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

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

double有许多格式说明符,它们将以不同的方式格式化输出,有关完整列表,请参阅此参考资料。

另一方面,operator<<对于cout有一个直接接受double的重载(在链接的参考中#5),所以它可以工作。

最新更新