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];
}
这里
printf()
打印 0000000000。
cout
打印 0123456789。
为什么?
arr[i]
是 double
,但 %d
是 int
的格式说明符。使用错误的格式说明符是未定义的行为。来自 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 基于提供的变量的类型。因此,它按预期打印输出。
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。
为什么?
arr[i]
是 double
,但 %d
是 int
的格式说明符。使用错误的格式说明符是未定义的行为。来自 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 基于提供的变量的类型。因此,它按预期打印输出。