我希望在单个IF语句中执行以下步骤以节省代码编写:
如果ret
为TRUE
,请将ret
设置为功能lookup()
的结果。如果ret
现在是FALSE
,则打印错误消息。
我写的代码如下:
BOOLEAN ret = TRUE;
// ... functions assigning to `ret`
if ( ret && !(ret = lookup()) )
{
fprintf(stderr, "Error in lookup()\n");
}
我感觉这并不像看起来那么简单。在IF语句中读取,分配和读取同一变量。据我所知,编译器将始终根据优先级将这样的语句拆分为组成操作,并一次评估一个合并,在将操作数评估为false时立即失败,而不是全部评估它们。如果是这样,那么我希望代码遵循我上面写的步骤。
我已经在IF语句中使用了很多作业,我知道它们可以正常工作,但事先没有另外读过。
有什么理由说这不是一个好的代码吗?就个人而言,我认为它易于阅读且含义清晰,我只关心编译器可能因任何原因而无法生成等效逻辑。也许编译器供应商的差异,优化或平台依赖性可能是个问题,但我对此表示怀疑。
答案 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)如果你!已经考虑过"我只关心编译器可能没有产生等效逻辑"你应该再想一想为什么你不确定你在做什么!我相信每个必须使用如此肮脏代码的人都会再次考虑这种组合。
提示:不要这样做!从未!