【问题标题】:std::cout and printf arraystd::cout 和 printf 数组
【发布时间】:2015-06-09 12:26:33
【问题描述】:
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。
为什么?
【问题讨论】:
标签:
c++
c
printf
cout
format-specifiers
【解决方案1】:
对printf() 中的任何特定参数使用错误的格式说明符会调用undefined behaviour。
arr 是一个double 数组,因此arr[i] 产生一个double 类型值。你需要%f 格式说明符来打印它。如果您使用%d 打印double,您的程序将面临UB,结果无法证明,in 可以是anything。
OTOH,与cout 一起使用的<< 是一个重载运算符,它可以根据所提供变量的类型调整。因此,它按预期打印输出。
【解决方案2】:
arr[i] 是double,但%d 是int 的格式说明符。使用错误的格式说明符是未定义的行为。来自 C11 标准,7.21.6.1/9:
如果转换规范无效,则行为未定义。如果有任何论据
不是相应转换规范的正确类型,行为是
未定义。
double 有许多格式说明符,它们将以不同的方式格式化输出,完整列表请参见 this reference。
另一方面,cout 的operator<< 有一个重载,它直接采用double(链接参考中的#5),这样就可以了。