C語言中邏輯運算符(&&,||,!)和位運算符號(&,|,^)的區別

 

1.     C語言中邏輯運算符(&&||!)和位運算符號(&|^)的區別

C語言中,編程者經常混淆兩組運算符:(&&||,!)和(&|^)。第一組是邏輯運算符,它的操作數是布爾型,而第二組則是位運算符,其操作數是位序列。在布爾型操作數中,只有兩個數值,01C語言規定,在邏輯運算中,所有的非0數值都看做1處理。而位序列則可以是有無符號的字符型,整型,長短整型等。在位運算中,是相應的位之間進行邏輯運算。因此,從邏輯上講,位運算過程包含多個邏輯運算過程。通常,位運算操作數選擇無符號型數據。

1.1.    應用實例

#include <stdio.h>

int main(int argc, char *argvs[])

{

      unsigned int a = 0x11;

unsigned int b = 0x00;

unsigned short s = 0x10;

unsigned char c = 0x01;

 

/* Logic operation */

if(a&&b) printf(“True: a && b is %d /n”, a&&b);

else printf(“False: a && b is %d /n”, a&&b);

 

if(a&&s) printf(“True: a && s is %d /n”, a&&s);

else printf(“False: a && s is %d /n”, a&&s);

 

if(a&&c) printf(“True: a && c is %d /n”, a&&c);

else printf(“False: a && c is %d /n”, a&&c);

 

if(s&&c) printf(“True: s && c is %d /n”, s&&c);

else printf(“False: s && c is %d /n”, s&&c);

 

/* Bit operation */

printf(“a & b is %x /n”, a&b);

printf(“a & s is %x /n”, a&s);

printf(“a & c is %x /n”, a&c);

printf(“s & c is %x /n”, s&c);

printf(“a & 0x110 is %x /n”, a&0x110);

 

return 0;

}

 

執行結果是:

False: a && b is 0

True: a && s is 1

True: a && c is 1

True: s && c is 1

a & b is 0

a & s is 10

a & c is 1

s & c is 0

a & 0x110 is 10

1.2.    長度問題

在上面的使用案例中,讀者應該很容易明白執行的結果,但是,有沒有考慮到執行結果的長度呢?下面是一個打印不同情況下表達式結果的長度的程序。

       #include <stdio.h>

int main(int argc, char *argvs[])

{

        unsigned int  a = 0;

        unsigned short b = 0;

        unsigned char c = 0;

 

        printf("int size = %d short size = %d char size = %d/n", sizeof(unsigned int), sizeof(unsigned short), sizeof(unsigned char));

 

        printf("a&b %d/n", sizeof(a & b));

        printf("a&c %d/n", sizeof(a & c));

        printf("b&c %d/n", sizeof(b & c));

        printf("2&c %d/n", sizeof(2 & c));

        printf("2&b %d/n", sizeof(2 & b));

        printf("2&a %d/n", sizeof(2 & a));

        printf("1&c %d/n", sizeof(1 & c));

        printf("1&b %d/n", sizeof(1 & b));

        printf("1&a %d/n", sizeof(1 & a));

        printf("0&c %d/n", sizeof(0 & c));

        printf("0&b %d/n", sizeof(0 & b));

        printf("0&a %d/n", sizeof(0 & a));

 

        printf("a&&b %d/n", sizeof(a && b));

        printf("a&&c %d/n", sizeof(a && c));

        printf("b&&c %d/n", sizeof(b && c));

        printf("2&&c %d/n", sizeof(2 && c));

        printf("2&&b %d/n", sizeof(2 && b));

              printf("2&&a %d/n", sizeof(2 && a));

        printf("1&&c %d/n", sizeof(1 && c));

        printf("1&&b %d/n", sizeof(1 && b));

        printf("1&&a %d/n", sizeof(1 && a));

        printf("0&&c %d/n", sizeof(0 && c));

        printf("0&&b %d/n", sizeof(0 && b));

        printf("0&&a %d/n", sizeof(0 && a));

       return 0;

}

 

LINUX下面用GCC得到的結果是:

int size = 4 short size = 2 char size = 1

a&b 4

a&c 4

b&c 4

2&c 4

2&b 4

2&a 4

1&c 4

1&b 4

1&a 4

0&c 4

0&b 4

0&a 4

a&&b 4

a&&c 4

b&&c 4

2&&c 4

2&&b 4

2&&a 4

1&&c 4

1&&b 4

1&&a 4

0&&c 4

0&&b 4

0&&a 4

而在WINDOWS下面用VC得到的結果確是:

int size = 4 short size = 2 char size = 1

a&b 4

a&c 4

b&c 4

2&c 4

2&b 4

2&a 4

1&c 4

1&b 4

1&a 4

0&c 4

0&b 4

0&a 4

a&&b 1

a&&c 1

b&&c 1

2&&c 1

2&&b 1

2&&a 1

1&&c 1

1&&b 1

1&&a 1

0&&c 4

0&&b 4

0&&a 4

從兩種結果中我們很清晰的得出一個結論,邏輯運算結果的長度是由編譯器決定的。因此在使用到邏輯運算結果的時候,要首先判斷其長度。

1.3.    使用問題

這裏的使用問題就是操作符使用的混淆,下面有一個簡單的例子。

if((a > b) && (c > d)) {

    printf(“true/n”);

} else {

    printf(“false/n”);

}

       在這種情況下,如果將&&誤寫爲&,結果會如何呢。如果仔細分析會發現,執行結果依然正確。但是,這種情況很特殊,1)是&&被換成了&,而不是||被換成|2a>bc>d的值要麼是1,要麼是03)當10進行&&&操作時,結果相同(10)。因此,在這種情況下,是一種“僥倖”!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章