1

私は、インターネットの可用性を確認するために、クラスの1つにcheckInternetメソッドがあるプロジェクトに取り組んでいます。そのメソッドでは、次のコードがあります。

以下の行のコードでは 、このブロックのコード(フラグ&& kSCNetworkFlagsReachable)に対して「定数オペランドで論理&&を使用する」という警告が表示されます。

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

そして、解決策として、「ビット単位のオペランドに&を使用する」というオプションを提供するxcodeを使用すると、そのようになり、警告が削除されます。しかし、論理演算子がどのように機能していたか知りたいですか?なぜビット単位に変更するように指示されているのですか?

4

5 に答える 5

0

ビット演算子(&)はビットごとのAND演算を実行し、結果をint値として返します。たとえば、でビットごとのAND演算を実行する0011001111111111、結果は次のようになります。

   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

条件では、最初の評価が false でなければならないということは、論理演算子 (&&) でチェックインしないことを意味します。しかし、ビット単位の演算子 (&) はありません。

于 2012-06-25T14:09:04.943 に答える
0

そのコードをきちんとした if/else ステートメントにリファクタリングすることを検討することをお勧めします。はい、冗長になりますが、1年後、やや恣意的な優先順位ルールを忘れているかもしれませんが、コードは読みやすく自明なままです...

于 2012-06-25T14:26:21.857 に答える