是否应该依赖if语句捕获除0以外的任何其他整数值为真?
Should you rely on IF-statement catching any other integer value than 0 as true?
我正在用Visual c++写一个相当大的项目,我想知道是否有一种方法来清理错误检查代码,目前看起来像这样:
// A header full of error codes like this
#define NO_ERROR 0x0000
#define CASUAL_ERROR 0x0001
#define ERROR_IN_THE_MATRIX 0x0015
// An example source file
int error;
error = openGLObj->Initialize();
if (!(error == NO_ERROR)
return error;
正如您所看到的,当您几乎在每个函数调用之后都必须编写错误检查代码时,错误检查代码占用了大量屏幕空间。
所以我做了这样的实验:
// Second example source file
int error;
error = fbxParser->ParseVertexData(...);
if (error)
return error;
它似乎至少在Visual c++中工作,因为如果没有错误,我总是返回NO_ERROR (int 0),并且任何其他整数似乎将布尔值设置为true。
后者是正确的做事方式吗?或者我以后会遇到问题,不得不花几个小时(再次)转换我的if语句?
这在很大程度上是风格和个人喜好的问题。
我个人不喜欢将具有多个有意义的非零值的表达式作为条件处理。例如,我会写:
if (ptr != NULL)
而不是
如果(ptr)
,尽管它们的意思完全相同。相反,如果表达式在"逻辑上"是布尔值(无论它是否是bool
类型),我更喜欢直接将其用作条件:
if (isdigit(foo))
而不是
if (isdigit(foo) != 0)
:
bool cond;
// ...
if (cond)
// or
if (!cond)
和
if (cond == true)
if (cond == false)
所以在你的例子中,我会写:
if (error != NO_ERROR)
return error;
(注意,我使用的是!=
运算符,而不是将!
应用于==
运算符的结果)。
显式比较为读者提供了更多上下文来理解error
是什么;你是在和NO_ERROR
比较,而不是和0
、0.0
、NULL
或' '
比较。
如果error
是一个纯布尔值,我会写if (error)
。
正如我所说,这是个人喜好的问题。给定您的定义,这:
if (error)
正好等于
if (error != NO_ERROR)
,你可以相信它会像你期望的那样工作。if
语句中的条件被隐式地转换为bool
,本质上相当于将其与0
进行不等式比较。
所以你不必担心if (error)
的行为不像你期望的那样。使用现代编译器,您也不必担心编译器为这两种形式生成效率较低的代码。使用任何你觉得更容易读懂的东西。(没有可写的;请记住,代码被读取的次数比被编写的次数要多得多。
是的,当整数/浮点数不为零时,它们在布尔上下文中被解释为真。指针不为null时被解释为true。但请注意,您也可以写(error != NO_ERROR)
而不是!(error == NO_ERROR)
。
假设NO_ERROR始终为零,您所做的是好的
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 为什么当我没有变量或其他任何命名的东西时"no match for 'operator==' "错误?
- 如何在不进行任何其他修改的情况下"pretty print" C++的XML字符串?
- 将十六进制字符数组存储在字节数组中,而无需更改为 ASCII 或其他任何东西
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- GLSL 计算着色器 使用查找表设置缓冲区会导致不写入任何数据,与其他数据设置相同的缓冲区有效
- 如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案
- C const在函数声明中以及其他任何地方的anmpersand的右侧
- 如何使用"std::multimap"或任何其他容器对多个值进行排序?
- 如何在任何其他全局变量或静态变量之前创建/构造类实例
- SSO在STD :: String以外的任何其他标准库容器中使用
- 程序在C++ Tutor中执行时有效,但在其他任何地方都不起作用
- 避免重复变量类型:Return type Resolver、C++11 auto、..其他任何东西
- 强制仅在某些代码中使用的特定构造函数,而不是其他任何地方
- 除了在类和程序之前,函数是否需要在其他任何地方声明?
- Ifstream不会读取整数或其他任何东西
- 3摄像机捕获与视频输入或其他任何东西
- 模板中的构造函数不同:一个用于字符串,另一个用于其他任何东西