【发布时间】:2010-09-05 03:54:40
【问题描述】:
简单的问题,但 | 运算符与 ||(或)运算符相比有什么作用?
【问题讨论】:
简单的问题,但 | 运算符与 ||(或)运算符相比有什么作用?
【问题讨论】:
| 是按位 OR 运算符,其中 || 是逻辑 OR 运算符。也就是说,前者用于将来自两个数值的位“组合”为一个并集,而后者则在运算符左侧或右侧的任一条件为真时计算为真。
具体来说,位运算符(不要与逻辑运算符混淆)对数字的每一位(在相同的序数位置)进行运算,并相应地计算结果。在按位OR 的情况下,如果任一位为 1,则结果位为 1,仅当两个位均为 0 时结果位为 0。例如,1|2 = 3,因为:
1 = 0001
2 = 0010
--------
0011 = 3
此外,2|3 = 3,因为:
2 = 0010
3 = 0011
--------
0011 = 3
起初这似乎令人困惑,但最终你会掌握它的窍门。按位OR 主要用于在位字段上设置标志的情况。即,在单个值(通常是 32 位数字)中保持一组相关条件的开/关状态的值。在 Win32 中,窗口样式值是位域的一个很好的例子,其中每个样式都由一个位(或标志)表示,如 WS_CAPTION,它指示窗口是否有标题栏。
【讨论】:
一个字中有几个(通常是 32、16、8 或 64)位。按位或(一个垂直条)返回该位位置中每个位位置的逻辑或。逻辑 OR(两个竖线)只返回 TRUE 或 FALSE。
【讨论】:
| 是bitwise or 运算符。维基百科页面Operators in C and C++ 很好地描述了所有运算符。
【讨论】:
正如其他人所提到的,| 是 按位 OR 运算符,|| 是 逻辑 OR 运算符,它们在概念上是不同的运算(通常)对不同类型的输入进行操作。但这可能会引发另一个问题:如果您将 | 与布尔操作数一起使用,那会不会与 || 做同样的事情,因为一切最终都归结为比特?是否需要一个独特的 || 运算符?
除了概念上的差异之外,另一个重要的差异是|| 是短路。这意味着如果第一个操作数为真,则根本不计算第二个操作数。例如:
int flag = Foo() || Bar();
仅当 Foo() 返回 0 时才会调用 Bar()。如果使用 |,则始终会计算两个操作数。
(当然,& 和 && 也有类似的行为。)
【讨论】:
||是逻辑或和 |是按位或。大多数时候,当您检查 if (i == 0 || i ==1) 之类的内容时,您只想使用 ||但是当您执行诸如将标志作为变量传递之类的操作时,请使用 |. (如果你不知道那是什么,你可能根本不需要 |)
【讨论】: