2010-09-05 53 views

回答

11

|是一个位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 

这看起来可能会让人困惑,但最终你会得到它的窍门。 Bitwise OR主要用于在位域上设置标志的情况。也就是说,一个值将一组相关条件的开/关状态保存在单个值(通常是32位数字)中。在Win32中,窗口样式值是位字段的一个很好的例子,每个样式都由一个位(或标志)表示,如WS_CAPTION,它指示窗口是否有标题栏。

3

单词中有几个(通常是32,16,8或64)位。按位OR(一个垂直条)为该位位置中的每个位置返回逻辑或。逻辑OR(两个垂直条)只返回TRUE或FALSE。

0

该||是一个逻辑或和|是一个按位或。大多数情况下,当你检查if(i == 0 || i == 1)时,你只是想使用||但是当你正在做象传递标志这样的变量时使用|。 (如果你不知道那是什么,你可能不需要|在所有)

2

正如其他人提及的,|按位 OR运算并||逻辑 OR运算符,以及它们在概念上不同的操作上不同种类的输入,(通常)操作。但是,这可能会引发另一个问题:如果您将|与布尔操作数一起使用,那么它会不会与||做同样的事情,因为一切最终都会归结为位?是否需要独特的||操作员?

除了概念上的差异,另一个重要的区别是||短路。这意味着如果第一个操作数为真,则第二个操作数根本就不被计算。例如:

int flag = Foo() || Bar(); 

将调用Bar()只有Foo()返回0。如果|使用,两个操作数总是会进行评估。

(而且,当然,&&&有类似的行为。)

+0

+1希望我能够投票这件事不止一次。非常重要的一点! – 2011-05-01 20:21:52