是否应该依赖if语句捕获除0以外的任何其他整数值为真?

Should you rely on IF-statement catching any other integer value than 0 as true?

本文关键字:其他 任何 整数 依赖 if 语句 是否      更新时间:2023-10-16

我正在用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比较,而不是和00.0NULL''比较。

如果error是一个纯布尔值,我会写if (error)

正如我所说,这是个人喜好的问题。给定您的定义,这:

if (error)

正好等于

if (error != NO_ERROR)

,你可以相信它会像你期望的那样工作。if语句中的条件被隐式地转换为bool,本质上相当于将其与0进行不等式比较。

所以你不必担心if (error)的行为不像你期望的那样。使用现代编译器,您也不必担心编译器为这两种形式生成效率较低的代码。使用任何你觉得更容易读懂的东西。(没有可写的;请记住,代码被读取的次数比被编写的次数要多得多。

是的,当整数/浮点数不为零时,它们在布尔上下文中被解释为真。指针不为null时被解释为true。但请注意,您也可以写(error != NO_ERROR)而不是!(error == NO_ERROR)

通常异常和RAII习语可以简化错误处理。它们可以比这些语法变化更有效。

假设NO_ERROR始终为零,您所做的是好的

相关文章: