这是正确的 - ' +'或者' |'在objective-c?

时间:2014-07-24 16:51:29

标签: objective-c

我已经在各种线程中看到了这两种符号,我想知道哪个是正确的? 或者,没有功能差异吗?

return UIInterfaceOrientationMaskPortrait + UIInterfaceOrientationMaskPortraitUpsideDown;

return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;

3 个答案:

答案 0 :(得分:2)

' |'更好

为了组合位掩码标志,它们几乎相同。你有:

0 + 0 = 0
0 | 0 = 0

0 + 1 = 1
0 | 1 = 1

1 + 0 = 1
1 | 0 = 1

然而,当你这样做时,它们会有所不同:

1 + 1 = 0 // and 1 goes to higher bit
1 | 1 = 1

你可以拥有' 1 + 1' case,当你组合相同的标志。它可能会错误地发生,当你修改现有的掩码,或者当你做一些不那么简单的事情时,比如你通过调用其他方法得到那些标志,然后你将它们累积在一些变量中,并且可以多次获得相同的标志。

在这种情况下,只有|会给出正确的结果,所以我说最好养成一直使用|的习惯。

它还可以使您的代码更易被他人阅读。

答案 1 :(得分:2)

正如其他人所说,|是用于位域的正确运算符。

虽然其他运算符可能会起作用并产生类似的结果,但使用它们在语义上是错误的,并且会让其他程序员在阅读代码时感到困惑。

使用+(或^在这种情况下具有类似效果)只是混淆了含义。在代码审查中,我会拒绝它。

答案 2 :(得分:0)

在这种特殊情况下它们都具有相同的结果,但|是首选,因为对于可能算术但通常无意义的位域,它是更正确的算子。

例如,如果您在变量中具有接口方向,并且要启用或禁用特定值,则使用+可能会导致意外行为。

UIInterfaceOrientationMask mask = UIInterfaceOrientationMaskPortrait;
// some other code ...
// Now I want to (incorrectly!) enable portrait, without checking it first
mask = mask + UIInterfaceOrientationMaskPortrait; 
// mask now counterintuitively == UIInterfaceOrientationMaskPortraitUpsideDown

如果您是用户|,则可以确保您在位字段上正常运行:

UIInterfaceOrientationMask mask = UIInterfaceOrientationMaskPortrait;
// ...
// Now I want to (correctly!) enable portrait, without checking it first
mask = mask | UIInterfaceOrientationMaskPortrait; // mask is what you would expect it to be.