在IF语句中读写变量

Read and write variable in an IF statement

本文关键字:读写 变量 语句 IF      更新时间:2023-10-16

我希望在单个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语句中使用了很多赋值,我知道它们是有效的,但没有事先阅读。

为什么这不是好的代码?就我个人而言,我认为这很容易阅读,意思很清楚,我只是担心编译器可能不会产生等效的逻辑,不管什么原因。也许编译器供应商的差异,优化或平台依赖性可能是一个问题,尽管我对此表示怀疑。

...to save on code writing这几乎从来不是一个有效的参数。不要这样做。特别是,不要为了"节省输入"而将代码混淆成一个有bug的、不可读的混乱。这是一个非常糟糕的程序。

我有一种感觉,这并不像看起来那么简单。从IF语句中的同一变量中读取、赋值和再次读取。

正确的。这与if语句本身没有什么关系,而是与所涉及的操作符有关。

据我所知,编译器总是会根据优先级将这样的语句拆分为它们的组成操作,并一次计算一个连词

嗯,是的…但是有运算符优先级和子表达式的求值顺序,它们是不同的东西。为了使事情更加复杂,有序列点

如果你不知道操作符优先级和求值顺序之间的区别,或者你不知道序列点是什么,你需要立即停止在一行中填充尽可能多的操作符,因为在这种情况下,你将会到处写可怕的错误。

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

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

你需要把你的代码修改成更容易读和更安全的东西:

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

为什么这不是好的代码?

是的,这种肮脏的代码片段有很多问题!

1)没有人能读懂它,它也无法维护。许多编码指南都包含这样一条规则:"每行一条语句"。

2)如果在一个if语句中组合了多个表达式,在定义表达式之前,只执行第一个语句!这意味着:如果你有多个表达式与AND相结合,第一个生成false的表达式将是最后一个执行的表达式。与OR组合相同:第一个计算为true的是最后一个执行的。你已经写过了,还有你!知道这个,但这是一个有点棘手的编程。如果你所有的学院都这样写代码,也许没问题,但据我所知,我的同事们在第一步不会理解你在做什么!

3)永远不要在一个语句中比较和赋值。它简直太丑了!

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

提示:不要那样做!从来没有!