gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:34:59 24 4
gpt4 key购买 nike

我想知道是否可以在返回值后更改变量?

所讨论的函数是一个简单的获取私有(private) bool 标志变量的函数。我希望读取此标志具有破坏性,所以我想:

bool myGet (context_t * someContext) {
return (someContext->flag) ? (someContext->flag = false) : false;
}

推理评估语句 (someContext->flag = false) 的结果将是 true,但它似乎不是。

也许它是在 条件 (someContext->flag)? 之前求值的。

有没有其他方法可以在不诉诸临时存储标志值、清除标志然后返回临时副本的情况下实现预期的功能?谢谢。

最佳答案

return 的所有参数必须在 return 本身被求值之前被求值,即在执行离开当前函数之前。

赋值的值就是分配的值,所以它是false,如您所见。

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

以明确的方式进行没有错:

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 指针,这将是我脑海中的即时警告标志.由于它具有非常奇怪的(对于 setter/getter )副作用,因此应该以某种方式反射(reflect)在名称中。

关于返回后更改值的复合语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22017739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com