我需要编写表格的声明
a = a || expr;
whereexpr
应该被评估并且没有设置分配给a
iff的结果a
。这依赖于逻辑 OR 的短路功能。
当然,写上面的更短的方法是
a ||= expr;
但是(令我惊讶的是)C 没有逻辑赋值运算符。
所以我的问题是双重的。首先,是否有更短的方法可以用标准 C 编写第一条语句(三元运算符更糟——a = a ? a : expr
需要我拼出a
三次)。
其次,为什么 C 语言中没有逻辑赋值?我能想到的可能原因是:
- 它使语法更难解析?
- 这些情况下处理短路有一些微妙之处吗?
- 它被认为是多余的(但这不是反对所有运算符分配的论点吗?)
编辑
请解开这个问题,因为:
它所链接的问题(作为所谓的副本)尚未得到答复。该问题的(已接受)答案指出
||=
不存在,因为重复了|=
. 那是错误的答案。|=
不会短路。C 和 C++ 不是同一种语言。我想知道为什么 C 没有它。事实上,派生语言如 C++,尤其是 Java(没有像 Edmund 的回答中所建议的那样受到遗留代码问题的困扰)这一事实使这个问题变得更加有趣。
编辑 2
现在看来我的初衷是错误的。在语句中a = a || expr
(其中a
是整数并expr
返回一个整数值,首先两者a
和expr
都将被隐式转换为“布尔值”,然后“布尔”值将被分配给a
。这将是不正确的 - 整数值将丢失。谢谢,延斯和埃德蒙。
因此,对于问题的第一部分,正确的方法,而不是替代方案:),编码我的意图是:
if (!a) a = expr;
或者
a = a ? a : expr;
它们应该被优化相同(我认为),但我个人更喜欢第一个(因为它少了一个a
要输入的内容)。
但是,问题的第二部分仍然存在。Jens 和 Edmund 关于a ||= expr
在a = a || expr
. 分配案例可以简单地视为正常案例:
- 转换
a
为布尔值 - 如果为真,则整个表达式的值变为等于布尔值
a
- 否则评估
expr
,将结果转换为布尔值,分配给a
,并返回它
对于分配和正常情况,上述步骤似乎是相同的。