为什么C/C++中缺少逻辑运算符(&&=和||=)赋值?

8

1)为什么没有逻辑运算符赋值,就像有加法和减法赋值一样呢?

bool a = true;
bool b = false;
a = a || b;
a ||= b; // syntax error!
a |= b;   // OK.

2)在布尔变量上应用位运算符的含义是什么?与使用逻辑运算符是否相同?


1
请重新表达你的问题。我不明白你在说什么? - haccks
3
@haccks 他在问为什么没有复合布尔赋值运算符 ||=&&= - bolov
2
请提出一个明确的问题。目前不清楚您是在问“为什么没有||=,&&=等”还是“在布尔变量上应用位运算符的含义是什么”。 - Spikatrix
@CoolGuy 完成了。实际上现在我正在问两个问题。 - Sanich
关于第二个问题,有人应该看看这篇帖子(https://softwareengineering.stackexchange.com/questions/134118/why-are-shortcuts-like-x-y-considered-good-practice/134136#134136)。您下面提到的这个链接值得放在这里。对于新手来说,这将会非常有帮助。直接放在问题下方即可。 - LiTTle
2个回答

7

确实,C语言中缺少&&=||=。我认为其中一个原因是在C语言中,逻辑AND和OR会执行短路计算,在简写形式中这会有点奇怪。但是不要使用位运算赋值运算符来代替它们。相反,只需编写:

a = a && b;
c = c || d;

如果您有规范的真/假值(1和0),则按位运算符将起作用。但是,如果应用于非规范化的值,例如5和2,则会得到不同的结果(5 && 2为1,但5 & 2为0)。


C语言中的bool类型是否总是规范的? - Sanich
4
对于 &&|| 运算符的短路计算意味着只有在需要确定结果时才会评估第二个操作数。例如,如果你有 0 && x,那么 x 不会被评估,因为你已经知道答案是 0。同样地,如果你有 1 || y,那么 y 不会被评估,因为你已经知道答案是 1。这在第二个操作数评估较慢(例如一个函数调用)或者具有副作用的情况下非常重要。 - Tom Karzes
1
关于C语言中的bool类型是否总是规范的问题,最初C语言中并没有bool类型。后来的C语言版本引入了bool类型,并在C99中引入了更强的支持,但由于bool变量至少占用1个字节的空间,因此始终可以通过联合或指针转换“强制”非规范值进入它们。 - Tom Karzes
是的,没错。但我认为有些人会觉得赋值运算符有时会忽略其右侧是不直观的。 - Tom Karzes
1
我做了一些研究,发现这不仅是语法上的差异。赋值运算符对应于明显不同的机器指令和寻址模式。在这里阅读更多信息。但我仍然没有找到一个好的答案来解释为什么C中缺少&&=和||=。根据上面的信息,你是否更清楚它们为什么缺失或无关呢? - Sanich
显示剩余3条评论

2

a |= b 的意思与 a = (a | b) 相同,只是 a 的地址只被计算一次。然后您需要查找提升规则和布尔赋值的规则。


2
你能在布尔值上使用位运算符吗? - Sanich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接