如果变量的值为零,C++应避免将其传递给std::cout
C++ Avoid passing variable to std::cout if its value is zero
假设我有一个变量double x
,作为一些计算的结果,它可以有任何值,包括零,我需要将它传递给std::cout
。如果x
的值为零,我如何避免打印它?
例如,如果是x
,则打印1+<value_of_x>
,否则仅打印1
:
std::cout << (x ? "1+" : "1") << x << 'n';
除了x
,还有什么方法可以做到同样的吗?类似以下无稽之谈:
std::cout << (x ? ("1+" << x) : "1") << 'n';
我可能应该补充一点,我在C++方面并不先进。
你可以说
std::cout << (x ? "1+" + std::to_string(x) : "1") << 'n';
但是
if (x)
std::cout << "1+" << x << 'n';
else
std::cout << "1" << 'n';
也许可读性更强
(我认为这在很大程度上是个人偏好的问题。(
如果x
为0,则不打印:
if (x != 0)
std::cout << x << 'n';
任何进一步的变化都应该是不言自明的。
使用if
语句是一种简单易读的方法:
if (x)
std::cout << "1+" << x;
else
std::cout << "1";
std::cout << 'n';
甚至:
std::cout << "1";
if (x) std::cout << "+" << x;
std::cout << 'n';
但是,如果你真的想以内联方式打印出值,你可以定义一个自定义的operator<<
来格式化你想要的值:
struct to_coefficient_str
{
double m_value;
to_coefficient_str(double value) : m_value(value) {}
void print(std::ostream &out) const
{
out << "1";
if (m_value)
out << "+" << m_value;
}
};
std::ostream& operator<<(std::ostream &out, const to_coefficient_str &ce)
{
ce.print(out);
return out;
}
然后你可以这样使用它:
std::cout << to_coefficient_str(x) << 'n';
相关文章:
- std::cout.imbue()多重调用
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- std::cout输出int时出现编译错误
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 为什么我需要做'using namespace std'而不是"使用 std::cout"?
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- std::cout 来自多个线程
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- 使用 std::addressof(std::cout) 而不是 &std::cout 是否有任何风险?
- 是否可以为 std::cout 创建别名?
- std::cout 在打印变量与函数表达式时的行为不同
- 带有 std::cout 的多线程控制台文本动画
- 为什么在语句"std::cout << std::endl;"中使用时需要命名空间限定,给定依赖于参数的查找?
- "std::cout << std::endl;"如何编译?
- std::cout/std::cerr seg faults