我有必要代码的形式为什么C没有逻辑赋值运算符?
a = a || expr;
其中expr
应评估和结果分配给a
当且仅当a
没有设置的声明。这依赖于逻辑OR的短路能力。
写上面会,当然是
a ||= expr;
但较短的方式(让我吃惊的)C没有逻辑赋值运算符。
所以我的问题是双重的。首先,在标准C中写出第一条语句的方法更短(三元运算符更糟糕 - a = a ? a : expr
要求我拼出a
三倍)。
其次,为什么C中没有逻辑赋值?我能想到的可能原因有:
- 它使语法难以解析?
- 处理这些情况下的短路有一些微妙之处吗?
- 它被认为是多余的(但不是反对所有运营商分配的争论?)
编辑
请解开这个问题,因为:
它被连接到的问题(作为所谓的重复)尚未得到答复。该问题的(接受的)答案指出
||=
不存在,因为重复了|=
的功能。这是错误的答案。|=
不会短路。C和C++不是相同的语言。我想知道为什么C没有它。事实上,像C++这样的派生语言,特别是Java(它没有像Edmund的答案中提到的遗留代码的问题)的事实使得这个问题更加有趣。
EDIT 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
,并将其返回
以上步骤似乎对于赋值和正常情况都是相同的。
此问题*不是*上述“可能重复”的确切副本。那个问题问为什么没有'|| ='的语法缩写,等等。这个问题询问为什么C不允许通过布尔运算符来携带非布尔运算符。 – Edmund 2010-08-17 09:41:43
我打算发表一个答案:如果那些短路工作会很好。 有一个选项'if(!a)a = expr;'这个选项很清楚简洁。 至于技巧,请注意,布尔的加法和乘法分别产生OR和AND函数,只要你不需要短路或强制转换为'bool','+ ='和'* ='分别执行'|| ='和'&& ='。 – Potatoswatter 2010-08-17 09:43:10
由于这是过早关闭,我在评论中回答。我认为这不存在,因为它的解释是不明确的。在'a | = expr'中应该赋值'expr'的结果还是其逻辑值? “a | = expr”的整体类型,“int”,“a”的类型或者“a”和“expr”的结果应该是什么?我不认为这些问题有一个直接的解决方案,所以任何可能已经考虑过这个问题的人都已经很快放弃了。我个人会选择'a =(a?a:expr)'并让编译器优化分配。 – 2010-08-17 12:44:57