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。为什么?
答案 0 :(得分:5)
对printf()
中的任何特定参数使用错误的格式说明符会调用undefined behaviour。
arr
是double
数组,因此arr[i]
生成double
类型值。你需要%f
格式说明符来打印它。如果您使用%d
打印double
,您的程序将面临UB并且结果无法证明,可以任何。
OTOH,与<<
一起使用的cout
是一个重载运算符,它可以根据提供的变量的类型适应。因此,它按预期打印输出。
答案 1 :(得分:3)
arr[i]
是double
,但%d
是int
的格式说明符。使用错误的格式说明符是未定义的行为。从C11标准,7.21.6.1 / 9:
如果转换规范无效,则行为未定义。如果有任何论据 不是相应转换规范的正确类型,行为是 未定义。
double
有许多格式说明符会以不同的方式格式化输出,有关完整列表,请参阅this reference。
另一方面,cout
的{{3}}有一个直接占用double
的重载(链接引用中为#5),这样才能正常工作。