[英]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()
任何特定参数使用错误的格式说明符都会调用未定义的行为 。
arr
是一个double
arr
数组,因此arr[i]
会产生一个double
arr[i]
类型值。 您需要%f
格式说明符才能打印出来。 如果您使用%d
打印double
,你的程序面临UB,结果是没有道理的,在可以是任何东西 。
OTOH,所述<<
使用cout
是能够适应基于所提供的变量的类型的重载操作。 因此,它将按预期打印输出。
arr[i]
是double
,但是%d
是int
的格式说明符。 使用错误的格式说明符是未定义的行为。 根据C11标准7.21.6.1/9:
如果转换规范无效,则行为未定义。 如果任何参数都不是相应转换规范的正确类型,则行为未定义。
有很多用于double
的格式说明符,它们将以不同的方式格式化输出,有关完整列表,请参见此参考 。
另一方面, cout
operator<<
具有一个重载,该重载将直接double
(链接引用中的#5),因此可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.