« デザート 青森産りんご 富士 | トップページ | 本日の朝ご飯のおかずの写真 尾道のちりめん山椒、アジ出汁の味噌汁など »

2012年1月24日 (火)

C言語の論理演算子 サンプルソースで考える「&と&&の違い」(&1個と2個の違い)

 C言語の論理演算子は、ネット上で多数解説されている。
 しかし、「&と&&の違い」(&1個と2個の違い)がちょっと分かりにくい。
 そこで、次に参考ソースを含めてまとめる。

【1.参考ソース】
#include
int main(void)
{
int a,b,c,d1,d2,e1,e2,f1,f2;
a=4;
b=11;
c=0;
d1=a&b;
d2=a&&b;
e1=a|b;
e2=a||b;
f1=a&c;
f2=a&&c;
printf("%d & %d =%d \n",a,b,d1);
printf("%d && %d =%d \n",a,b,d2);
printf("%d | %d =%d \n",a,b,e1);
printf("%d || %d =%d \n",a,b,e2);
printf("%d & %d =%d \n",a,c,f1);
printf("%d && %d =%d \n",a,c,f2);
return 0;
}

【2.上記1の実行結果】
4 & 11=0
4 && 11=1
4 | 11 =15
4 || 11 =1
4 & 0 =0
4 && 0 =0

【3.解説】
① &1個の場合
 それぞれを一度2進数に置き換える。
 4は、0100、11は1011である。この状態で、ビット毎の論理積ANDを行う。
 0×0=0、0×1=0、1×1=1に従う。
 即ち、0100+1011=0000となる。

② &&2個の場合
 先ず、それぞれの数値を0であるかそうでないかを判断する。
 即ち、4は1、11は1となる。4&&11の論理積は、1&&1=1となる。
 言葉で表現すると、演算子の左側の条件が不成立ならば、不成立になった位置より右側の式を~となるが、上記ソースのようにポンを変数1個の場合、「えっ」なると思う。私はそうだった。

③ |1個の場合
 これも①同様に一度2進数に置き換えてビット毎の論理和ORを求める。
 即ち、0100+1011=1111(2進数)、10進数では15。

④ ||2個の場合
 ②同様に数値が0かそうでないかを判断する。
 即ち、4||11の論理和は、1||1=1となる。

⑤ C=0が絡む
 &の場合は、0100と0のビット毎の論理積で0。
 &&の場合は、Cは数値0なので0、1&&0=0となる。

【4.Javaは?】
 JavaはC言語と動作が異なる。
a=4;
b=11;
    System.out.println( 4 & 11);
    System.out.println( a & b);
    System.out.println( a>0 && b<20);
    System.out.println( 4 | 11);
    System.out.println( a | b);
    System.out.println( a>0 || b<20);
これを実行すると
0
0
true
15
15
true
となる。
 Javaの場合、&&など2つ重ねると、System.out.println( a>0 && b<20);のような表現を行わないとエディタ上でエラーとなる(eclipseの場合)。
 

|

« デザート 青森産りんご 富士 | トップページ | 本日の朝ご飯のおかずの写真 尾道のちりめん山椒、アジ出汁の味噌汁など »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: C言語の論理演算子 サンプルソースで考える「&と&&の違い」(&1個と2個の違い):

« デザート 青森産りんご 富士 | トップページ | 本日の朝ご飯のおかずの写真 尾道のちりめん山椒、アジ出汁の味噌汁など »