std::cout 和 printf 数组

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];
    }

这里

为什么?

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

If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

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

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

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

arr 是一个 double 数组,因此 arr[i] 产生一个 double 类型的值。你需要 %f 格式说明符来打印它。如果你用%d打印一个double,你的程序面临UB,结果不能自圆其说,in can be anything.

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