C 返回值后要更改值的复合语句?

C 返回值后要更改值的复合语句?,c,return,C,Return,我想知道是否有可能有一个变量在返回它的值后改变 该函数是私有布尔标志变量的简单get函数。我希望这面旗子具有破坏性,所以我想: bool myGet (context_t * someContext) { return (someContext->flag) ? (someContext->flag = false) : false; } 推断对语句(someContext->flag=false)求值的结果将是true,但它看起来不是 可能是在条件(someContext

我想知道是否有可能有一个变量在返回它的值后改变

该函数是私有布尔标志变量的简单get函数。我希望这面旗子具有破坏性,所以我想:

bool myGet (context_t * someContext) {
    return (someContext->flag) ? (someContext->flag = false) : false;
}
推断对语句
(someContext->flag=false)
求值的结果将是
true
,但它看起来不是

可能是在条件
(someContext->flag)?
之前计算的

是否有其他方法可以实现预期功能,而无需临时存储标志值、清除标志然后返回临时副本?谢谢

推断对语句
(someContext->flag=false)
求值的结果是正确的,但看起来不是

(someContext->flag=false)
是一个赋值表达式。其值是指定的表达式的值(即
false

任务确实完成了,尽管它发生在返回之前,而不是之后。如果您想使用三元运算符,可以使用逗号运算符,如下所示:

return (someContext->flag) ? (someContext->flag = false, true) : false;
但是,这不是很容易理解,因此我更喜欢这种没有条件的等效实现:

bool temp = someContext->flag;
someContext->flag = false;
return temp;

您可以使用后减量运算符:

return (someContext->flag) ? someContext->flag-- : false;
只有当执行
(someContext->flag=false)
时,如果标记的
true
值具有数值
1

someContext->flag
设置为false,然后返回它,这才会产生所需的结果

你可以做:

return (someContext->flag) ? !(someContext->flag = false) : false;
这样,您将返回刚刚设置为false的
someContext->flag
的oposite(因此返回true),但是
someContext->flag
在返回后将保持false

编辑

最难理解的是:

return !(someContext->flag = !someContext->flag);

必须在计算
返回
本身之前,即在执行离开当前函数之前,计算
返回
的所有参数

赋值的值就是赋值,所以它是
false

我认为最接近的是post增量,但这当然会严格限制可用的值

以明确的方式做这件事没有错:

bool getAndClear(context_t *someContext)
{
  if(someContext->flag)
  {
    someContext->flag = false;
    return true;
  }
  return false;
}
它非常清晰,比你的可怕代码更容易理解。很容易想象编译器可以对其进行优化,因为这是非常简单的

如果我想变得聪明,我可能会使用以下方法:

bool getAndClear2(context_t *someContext)
{
  const bool flag = someContext->flag;

  someContext->flag ^= flag; /* Clears if set, leaves alone if not set. */

  return flag;
}
注意,它没有分支,这有时很漂亮。但是,同样,聪明并不总是最令人敬畏的道路


还注意到,我认为这个函数不只是命名为“GET”,因为它不需要一个<代码> const <代码>指针,这将是我脑海中的一个即时警告标志。因为它有着非常奇怪的副作用(对于一个吸烟者来说),这应该在名字中有所反映。

我喜欢这个方法,简短而甜美:)确实缺乏可读性,所以我可能不得不接受unwind的回答,你只要习惯它就可以了,但我承认。这甚至可能是最糟糕的!(请参见编辑)我喜欢这样做,不需要临时变量,并且具有相同数量的分支