在IF语句中读写变量

时间:2015-06-01 11:45:24

标签: c++

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

如果retTRUE,请将ret设置为功能lookup()的结果。如果ret现在是FALSE,则打印错误消息。

我写的代码如下:

BOOLEAN ret = TRUE;

// ... functions assigning to `ret`

if ( ret && !(ret = lookup()) )
{
    fprintf(stderr, "Error in lookup()\n");
}

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

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

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

2 个答案:

答案 0 :(得分:5)

...to save on code writing这几乎不是一个有效的论据。不要这样做。特别是,不要将你的代码混淆成一个有缺陷的,难以理解的混乱,以节省打字和#34;。这是非常糟糕的编程。

  

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

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

  

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

嗯,是的......但是有operator precedence and there is order of evaluation of subexpressions,它们是不同的东西。为了使事情变得更复杂,有sequence points

如果您不了解运营商优先级和评估顺序之间的区别,或者您不知道序列点是什么,则需要立即停止填充尽可能多的运算符因为在这种情况下,你将在整个地方写下可怕的错误。

在你的具体情况下,你只是因为一个特殊情况,在&&和&&运营商。如果您使用不同的运算符编写了类似的混乱,例如ret + !(ret = lookup(),您的代码将具有未定义的行为。一个需要数小时,数天或数周才能找到的错误。好吧,至少你节省了10秒的打字时间!

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

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

bool ret = true;

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

if(!ret)
{
  fprintf(stderr, "Error in lookup()\n");
}

答案 1 :(得分:3)

  

有什么理由说这不是一个好的代码吗?

是的,这些脏代码碎片有很多问题!

1) 没有人可以阅读它,它是不可维护的。很多编码指南都包含一条规则,告诉你:"每行一个语句"。

2)如果在一个if语句中组合多个表达式,则只有第一个语句才会执行,直到定义表达式为止!这意味着:如果你有多个与AND结合的表达式,那么生成false的第一个表达式将是最后一个将被执行的表达式。与OR组合相同:第一个评估为true的组合是最后一个被执行的组合。你已经写过这个和你了!知道这一点,但这是一个棘手的编程。如果你所有的大学都以这种方式编写代码,那也许没问题,但据我所知,我的同事们不会在第一步就明白你在做什么!

3)你不应该在一个陈述中进行比较和分配。这简直太丑了!

4)如果你!已经考虑过"我只关心编译器可能没有产生等效逻辑"你应该再想一想为什么你不确定你在做什么!我相信每个必须使用如此肮脏代码的人都会再次考虑这种组合。

提示:不要这样做!从未!