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()
中使用错误的格式说明符会调用未定义的行为。
arr
是double
数组,因此arr[i]
产生double
类型的值。您需要%f
格式说明符来打印它。如果您使用%d
来打印double
,您的程序将面临UB,并且结果不能被对齐,在任何。
OTOH,与cout
一起使用的<<
是一个重载操作符,它可以根据所提供变量的类型调整。因此,它按预期输出。
arr[i]
是double
,但%d
是int
的格式说明符。使用错误的格式说明符是未定义的行为。来自C11标准,7.21.6.1/9:
如果转换规范无效,则该行为未定义。如果有任何参数不是相应转换规范的正确类型,行为是定义。
double
有许多格式说明符,它们将以不同的方式格式化输出,有关完整列表,请参阅此参考资料。
另一方面,operator<<
对于cout
有一个直接接受double
的重载(在链接的参考中#5),所以它可以工作。