1

我正在做一个项目,我在我的一个班级中有checkInternet方法来验证互联网的可用性。在该方法中,我有以下代码:

对于下面的代码行,我收到警告,“使用带有常量操作数的逻辑 &&” 对于这个块代码(flag && kSCNetworkFlagsReachable)

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

作为解决方案,xcode 提供了“使用 & 用于按位操作数”的选项,这很好,我这样做了,它消除了我的警告。但我想知道它是如何工作的逻辑运算符?为什么它告诉我按位更改?

4

5 回答 5

5

位运算符 比较每个单独的&位对。仅当左右操作数至少有一个匹配位设置为 1 时,结果才会为非空。

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

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

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

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

于 2012-06-25T14:36:27.373 回答
3

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

于 2012-06-25T14:02:56.567 回答
0

在条件首先评估必须为假意味着它不会检查逻辑运算符(&&)。但按位运算符(&)在里面。

于 2012-06-25T14:09:04.943 回答
0

位运算符(&)逐位执行 AND 运算并将结果作为 int 值返回。例如,如果您对它进行按位与运算,00110011结果11111111将是。

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

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

   00110011 => 0x33 => 51  => (BOOL) true
&& 11111111 => 0xFF => 255 => (BOOL) true 
===========
   00000001 => 0x01 => 1   => (BOOL) true
于 2012-06-25T14:20:14.537 回答
0

您可能需要考虑将该代码重构为整洁的 if/else 语句。它会变得冗长,是的,但是一年后,当你可能忘记了有点武断的优先规则时,你的代码将保持清晰和不言而喻......

于 2012-06-25T14:26:21.857 回答