在IF语句中读写变量

Dod*_*ddy 1 c++

我希望在单个IF语句中执行以下步骤以节省代码编写:

如果ret是TRUE,则设置ret为函数的结果lookup().如果ret是,现在FALSE,打印错误消息.

我写的代码如下:

BOOLEAN ret = TRUE;

// ... functions assigning to `ret`

if ( ret && !(ret = lookup()) )
{
    fprintf(stderr, "Error in lookup()\n");
}
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,这并不像它看起来那么简单.在IF语句中读取,分配和读取同一变量.据我所知,编译器将始终根据优先级将这样的语句拆分为组成操作,并一次评估一个合并,在将操作数评估为false时立即失败,而不是全部评估它们.如果是这样,那么我希望代码遵循我上面写的步骤.

我已经在IF语句中使用了很多作业,我知道它们可以正常工作,但事先没有另外读过.

有什么理由说这不是好代码吗?就个人而言,我认为它易于阅读且含义清晰,我只是担心编译器可能因为某种原因而无法生成等效逻辑.也许编译器供应商的差异,优化或平台依赖可能是一个问题,但我对此表示怀疑.

Lun*_*din 5

...to save on code writing 这几乎不是一个有效的论据.不要这样做.特别是,不要将您的代码混淆为"保存打字"的错误,难以理解的混乱.这是非常糟糕的编程.

我有一种感觉,这并不像它看起来那么简单.在IF语句中读取,分配和读取同一变量.

正确.它与if语句本身几乎没有关系,而且与所涉及的运算符有关.

据我所知,编译器将始终根据优先级将这样的语句拆分为组成操作,并一次评估一个组合

嗯,是的......但是有运算符优先级,并且有子表达式的评估顺序,它们是不同的东西.为了使事情变得更复杂,有序列点.

如果您不知道运算符优先级和评估顺序之间的区别,或者您不知道序列点是什么,则需要立即停止将尽可能多的运算符填充到一行中,因为在这种情况下,你将在整个地方写出可怕的虫子.

在您的特定情况下,您只是因为在特殊情况下,在&&运算符的左右评估之间出现了一个序列点,因此您可以避免编程错误.例如ret + !(ret = lookup(),如果您使用不同的运算符编写了类似的混乱,则代码将具有未定义的行为.一个需要数小时,数天或数周才能找到的错误.好吧,至少你节省了10秒的打字时间!

此外,在C和C++中都使用标准bool类型而不是一些自制的版本.

您需要将代码更正为更可读和安全的内容:

bool ret = true;

if(ret)
{
  ret = lookup();
}

if(!ret)
{
  fprintf(stderr, "Error in lookup()\n");
}
Run Code Online (Sandbox Code Playgroud)

  • @Learner当您将先前混淆的代码分解为此时,您可能会意识到算法本身可能没有意义.我不知道这段代码应该做什么,但似乎这里有2个不同的bool变量.如果使用当前代码编写if-else,则必须在两个不同的位置编写相同的错误处理代码. (2认同)