逻辑运算符如何使用目标c中的常量操作数

时间:2012-06-25 13:56:32

标签: iphone objective-c ios5 reachability

我正在开展项目,我在其中一个班级中使用 checkInternet 方法验证互联网可用性。在那个方法中,我有以下代码:

对于以下代码行,我收到警告,“使用Logical&& with constant operand” 对于此块代码(flag&& kSCNetworkFlagsReachable)

BOOL isavailable = NO;
Boolean success;
isavailable = success && (flag && kSCNetworkFlagsReachable) && !(flag & kSCNetworkFlagsConnectionRequired);

作为一个解决方案xcode给出选项“使用& for bitwise operand”,这很好,我这样做,它删除了我的警告。 但我想知道它是如何工作的逻辑运算符?为什么它告诉我改为按位?

5 个答案:

答案 0 :(得分:5)

bitwise operator &比较每一对比特。仅当左右操作数至少有一个匹配位设置为1时,结果才为非空。

示例:0100 AND 0010→0000但0110和0010→0010。

此运算符允许您使用单个整数值在不同位上存储多个布尔值,然后使用第二个值(称为掩码)来过滤这些位。

kSCNetworkFlagsReachable等于1<<12)。因此,flag & kSCNetworkFlagsReachable仅在flag的第二个最低有效位设置为1时才为真。

使用&&代替&是一个常见的错误。编译器将尝试检测该错误。在您的示例中,kSCNetworkFlagsReachable是一个常量值。由于kSCNetworkFlagsReachable是常量且始终为真,因此测试flag && kSCNetworkFlagsReachable是否为真与测试flag是否为真相同。因此,您不太可能真的想在逻辑运算中使用常量值。这就是编译器发出警告的原因。

答案 1 :(得分:3)

kSCNetworkFlagsReachable是一个整数,而BOOLtypedef short。使用逻辑和(&&)将返回YES如果它们都是非0而使用按位而(&)将返回整数(非0),如果任何匹配位是1。

答案 2 :(得分:0)

在条件中,第一次评估必须为false意味着它不会检入逻辑运算符(&amp;&amp;)。但是按位运算符(&amp;)。

答案 3 :(得分:0)

按位运算符(&)执行逐位AND运算,并将结果作为int值返回。例如,如果您使用0011001111111111执行按位AND运算,结果将是。

   00110011
&  11111111
===========
   00110011

另一方面,逻辑运算符(&&)进行比较。如果两个变量不相等,则返回int 1 {否} 0返回0。这意味着:

   00110011 => 0x33 => 51  => (BOOL) true
&& 11111111 => 0xFF => 255 => (BOOL) true 
===========
   00000001 => 0x01 => 1   => (BOOL) true

答案 4 :(得分:0)

您可能需要考虑将该代码重构为neated if / else语句。它会变得冗长,是的,但是从现在起一年后,当你可能忘记了有些随意的优先规则时,你的代码将保持清晰易读......