C 返回值后要更改值的复合语句?
我想知道是否有可能有一个变量在返回它的值后改变 该函数是私有布尔标志变量的简单get函数。我希望这面旗子具有破坏性,所以我想:C 返回值后要更改值的复合语句?,c,return,C,Return,我想知道是否有可能有一个变量在返回它的值后改变 该函数是私有布尔标志变量的简单get函数。我希望这面旗子具有破坏性,所以我想: bool myGet (context_t * someContext) { return (someContext->flag) ? (someContext->flag = false) : false; } 推断对语句(someContext->flag=false)求值的结果将是true,但它看起来不是 可能是在条件(someContext
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的回答,你只要习惯它就可以了,但我承认。这甚至可能是最糟糕的!(请参见编辑)我喜欢这样做,不需要临时变量,并且具有相同数量的分支