哪种条件最能容忍良好做法?
Which condition condones best to good practice?
我正在重构旧代码,因此在我这样做时尝试遵循最佳实践。
我的真实案例类似于以下示例:
#define FOO 0x0001
long bar = 0;
我应该这样测试吗:
if(bar & FOO)
或者像这样:
if(bar == FOO)
看到评论后,我正在编辑以清除内容:
bar
可以是任何有效的long
号。我正在尝试测试bar
是否等于FOO
,而不是是否设置了标志FOO
。
再一次,我试图遵循最佳实践,因此问题。
对我来说,这似乎没有显着差异,但想与专家核实。
我仅限于使用VS 2019的Windows,如果需要更多信息,请随时询问。
谢谢。
这两者传达了不同的含义。x==y
的意思是">检查x
是否完全等于y
",x&y
的意思是">检查y
中的任何位是否设置在x
"。
结果是一样的,但如果FOO
会改变呢?如果我来了,5年FOO
改为3年,x=1
仍然有效吗?
此外,在现代C++中,您应该避免使用宏。constexpr unsigned FOO = 1;
是类型安全的。
如果你真的关心使用现代 c++ 的最佳实践,一开始就不要使用宏。您可以将其替换为const
或constexpr
。
使用const
或constexpr
表达式后,表达式将变得简单。
if(something_const == something_non_const)
您可以随时参考 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines.html 以获取核心 cpp 指南。
这在很大程度上取决于您要测试的内容。如果bar
是一组标志,并且您想检查是否设置了其中一个标志 - 即FOO
- 那么请使用:
if (bar & FOO) ;
如果要检查是否仅设置了FOO
,请继续:
if (bar == FOO) ;
所以主要要点是 - 在代码中揭示您的意图。
此外,我会重新考虑使用long
作为标志集的类型。有一种类型在语义上是IMO伟大的std::bitset
表明您正在处理设置的标志。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有太多条件句的情况下,我如何避免被零除
- 基于多个条件处理地图中的所有元素
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 将按位if条件转换为普通if条件
- 条件断点在不应该触发时触发
- 为什么简单的算术减法在"if"条件下不起作用?
- 如何在for循环中包含两个索引值的测试条件
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 我提出什么条件才能再加5%的折扣
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 没有超时的C++条件变量
- 正在LLVM中检测整数比较条件
- 在条件变量中触发错误信号的频率是多少