gpt4 book ai didi

c - 为什么C没有逻辑赋值运算符?

转载 作者:行者123 更新时间:2023-11-30 16:43:49 24 4
gpt4 key购买 nike

我需要编写以下形式的语句

a = a || expr;

其中应评估 expr 并将结果分配给 a(当未设置 a 时)。这依赖于逻辑或的短路能力。

当然,编写上述内容的较短方法是

a ||= expr;

但是(令我惊讶的是)C 没有逻辑赋值运算符。

所以我的问题是双重的。首先,是否有更短的方法来用标准 C 编写第一个语句(三元运算符更糟糕 - a = a ? a : expr 要求我拼写出 a三次)。

其次,为什么 C 中没有逻辑赋值?我能想到的可能原因是:

  • 它使语法更难解析?
  • 处理这些情况的短路有一些微妙之处吗?
  • 它被认为是多余的(但这不是反对所有运算符分配的论据吗?)

编辑

请解锁此问题,因为:

  • 它所链接的问题(据称是重复的)尚未得到答复。该问题的(已接受)答案指出 ||= 不存在,因为重复了 |= 的功能。这是错误的答案。 |= 不会短路。

  • C 和 C++ 不是相同的语言。我想知道为什么C没有它。事实上,像 C++ 这样的派生语言,特别是 Java(它没有像 Edmund 的回答中所建议的那样受到遗留代码问题的困扰)这一事实使这个问题变得更加有趣。

编辑2

现在看来我的初衷是错误的。在语句 a = a || 中expr (其中 a 是整数,expr 返回整数值,首先是 aexpr将隐式转换为“ bool 值”,然后将“ bool 值”分配给 a。这将是不正确的 - 整数值将丢失。谢谢 Jens 和 Edmund。

因此,对于问题的第一部分,正确的方法,而不是替代方法:),编码我的意图是:

if (!a) a = expr;

a = a ? a : expr;

它们应该进行相同的优化(我认为),尽管我个人更喜欢第一个(因为它少了一个a需要输入)。

但是,问题的第二部分仍然存在。 Jens 和 Edmund 就 a ||= expr 中的歧义给出的论点同样适用于 a = a ||表达式。赋值情况可以简单地视为正常情况:

  • a转换为 bool 值
  • 如果为 true,则整个表达式的值等于 a 的 bool 值
  • 否则计算expr,将结果转换为 bool 值,分配给a,然后返回

对于分配和正常情况,上述步骤似乎是相同的。

最佳答案

a ||= expr由于对其等效物的短路评估而存在问题 a = a || expr .

拥有a ||= expr功能类似于 a = a || expr考虑OP的断言:

"In the statement a = a || expr ..., first both a and expr will be implicitly converted to "booleans","

这不太正确。 expr如果a则不会被转换计算结果为 true 。这会产生影响应该 expr类似于 scanf()rand()或一些影响程序状态的函数。

代码如a ||= scanf("%d", &i) != 1;只会尝试扫描 a 中具有错误值的数据。尽管可以通过这种方式扩展语言,但需要向当前的 || 集合添加额外的短路运算符。和&&与明显的简化相比,可能会导致更多的编码问题。

另一方面:一种快速但令人困惑的编写代码的方法,其中函数在出错时返回非零代码。

// Perform functions until an error occurs.
bool error = foo1();
error &&= foo2(); // Only valid if C was extended with &&=
error &&= foo3();

关于c - 为什么C没有逻辑赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44950800/

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