我正在开展项目,我在其中一个班级中使用 checkInternet 方法验证互联网可用性。在那个方法中,我有以下代码:
对于以下代码行,我收到警告,“使用Logical&& with constant operand” 对于此块代码(flag&& kSCNetworkFlagsReachable)。
BOOL isavailable = NO;
Boolean success;
isavailable = success && (flag && kSCNetworkFlagsReachable) && !(flag & kSCNetworkFlagsConnectionRequired);
作为一个解决方案xcode给出选项“使用& for bitwise operand”,这很好,我这样做,它删除了我的警告。 但我想知道它是如何工作的逻辑运算符?为什么它告诉我改为按位?
答案 0 :(得分:5)
bitwise operator &
比较每一对比特。仅当左右操作数至少有一个匹配位设置为1时,结果才为非空。
示例:0100 AND 0010→0000但0110和0010→0010。
此运算符允许您使用单个整数值在不同位上存储多个布尔值,然后使用第二个值(称为掩码)来过滤这些位。
kSCNetworkFlagsReachable
等于1<<1
(2
)。因此,flag & kSCNetworkFlagsReachable
仅在flag
的第二个最低有效位设置为1时才为真。
使用&&
代替&
是一个常见的错误。编译器将尝试检测该错误。在您的示例中,kSCNetworkFlagsReachable
是一个常量值。由于kSCNetworkFlagsReachable
是常量且始终为真,因此测试flag && kSCNetworkFlagsReachable
是否为真与测试flag
是否为真相同。因此,您不太可能真的想在逻辑运算中使用常量值。这就是编译器发出警告的原因。
答案 1 :(得分:3)
kSCNetworkFlagsReachable
是一个整数,而BOOL
是typedef short
。使用逻辑和(&&
)将返回YES
如果它们都是非0而使用按位而(&
)将返回整数(非0),如果任何匹配位是1。
答案 2 :(得分:0)
在条件中,第一次评估必须为false意味着它不会检入逻辑运算符(&amp;&amp;)。但是按位运算符(&amp;)。
答案 3 :(得分:0)
按位运算符(&)
执行逐位AND运算,并将结果作为int值返回。例如,如果您使用00110011
和11111111
执行按位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语句。它会变得冗长,是的,但是从现在起一年后,当你可能忘记了有些随意的优先规则时,你的代码将保持清晰易读......