【发布时间】:2015-10-03 08:53:32
【问题描述】:
变量:
static const float s_period[] = { 100, 50, 25, 12, 5, 7, 3, 2, 1 };
static const unsigned s_timersCount = sizeof( s_period ) / sizeof( s_period[0] );
float min = 10000000;
float max = 0;
double sum = 0.0;
C++ 版本:
for( unsigned i = 0; i < s_timersCount; ++i ) {
...
std::cout
<< "id: " << std::setw(2) << (i+1)
<< ", expected: " << std::setw(3) << s_period[i]
<< ", min: " << std::setw(3) << min
<< ", max: " << std::setw(3) << max
<< ", avg: " << std::fixed << std::setw(10) << std::setprecision(6) << avg
<< std::endl;
std::cout.unsetf( std::ios_base::floatfield );
}
C 版:
for( unsigned i = 0; i < s_timersCount; ++i ) {
...
printf( "id: %2d, expected: %3.0f, min: %3.0f, max: %3.0f, avg: %10.6f\n",
( i + 1 ), s_period[i], min, max, avg );
}
for 循环在此示例中很重要,因为我们必须为下一个循环重置 ios_base::floatfield。
C++ 版本比 C 等价版本更冗长,您能提出一个更紧凑的 C++ 版本吗?
【问题讨论】:
-
冗长并不总是一件坏事。 C++ 版本更容易阅读。
-
如果
fprintf()是你真正想要的,为什么不用C++呢? -
请记住,C++ 版本也会在每次写入时刷新。
cerr已设置unitbuf。 Boost.Format 允许在 C++ 流中使用类似 printf 的语法。 -
C 版本也更容易出错,例如为 unsigned int 指定
%d。 C++ 自动选择合适的重载。