一、逻辑运算符:包括:1。
&&逻辑与 2。
||逻辑或 3。
!逻辑非逻辑运算符用于对包含关系运算符的表达式进行合并或取非对于使用逻辑运算符的表达式,返回0表示“假”,返回1表示“真”。
关于逻辑运算符的解释请注意:任何使用两个字符做符号的运算符,两字符之间不应有空格,即将==写成= =是错误的。
假设一个程序在同时满足条件a<10和b==7时,必须执行某些操作。
应使用关系运算符和逻辑运算符“与”来写这个条件的代码。
用&&表示“与”运算符,该条件代码如下:(a<10) && (b==7);类似地,“或”是用于检查两个条件中是否有一个为真的运算符。
它由两个连续的管道符号(||)表示。
如果上例改为:如果任一语句为真,则程序需执行某些操作,则条件代码如下:(a<10) || (b==7);第三个逻辑运算符“非”用一个感叹号(!)表示。
这个运算符对表达式的真值取反。
例如,如果变量s小于10,程序程序需执行某些操作,则条件代码如下:(s<10)或(!(s>=10)) //s不大于等于10关系运算符和逻辑运算符的优先级一般都低于算术运算符。
例如,5>4+3的计算与5>(4+3)运算符是一样的,即先计算4+3,再执行关系运算。
此表达示的结果为“假”,即,将返回0。
下面的语句printf("%d",5>4+3);将输出 0可以总结为:&&的结果是真真为真。
||的结果是假假为假。
与A&&B 只有A B都为真才是真或A||B 只有A B都为假才是假非 ~A A为真时,此式为假二、位运算符:包括:1。
&位与符 2。
|位或符 3。
^位异或符 4。
~位取反符以操作数12为例。
位运算符将数字12视为1100。
位运算符将操作数视为位而不是数值。
数值可以是任意进制的:十进制、八进制或十六进制。
位运算符则将操作数转化为二进制,并相应地返回1或0。
位运算符将数字视为二进制值,并按位进行相应运算,运算完成后再重新转换为数字。
例如:表达式10&15表示(1010 & 1111),它将返回表示1010的值10。
因为真真得真,或者是11得1,同位全是1结果也是1表达式10|15表示(1010 | 1111),它将返回表示1111的值15。
假假得假。
全零得零。
表达式10^15表示(1010 ^ 1111), 它将返回表示0101的值5。
此时是同性相斥,相同的就为假。
表达式~10表示(~1010),它将返回表示0101的值 -11。
此号好理解,按位取反1.C语言中逻辑运算符(&&,||,!)和位运算符号(&,|,^)的区别在C语言中,编程者经常混淆两组运算符:(&&,||,!)和(&,|,^)。
第一组是逻辑运算符,它的操作数是布尔型,而第二组则是位运算符,其操作数是位序列。
在布尔型操作数中,只有两个数值,0或1。
C语言规定,在逻辑运算中,所有的非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 prin tf(“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 0True: a && s is 1True: a && c is 1True: s && c is 1a &b is 0a & s is 10a & c is 1s & c is 0a & 0x110 is 101.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 = 1a&b 4a&c 4b&c 42&c 42&b 42&a 41&b 41&a 40&c 40&b 40&a 4a&&b 4a&&c 4b&&c 42&&c 42&&b 42&&a 41&&c 41&&b 41&&a 40&&c 40&&b 40&&a 4而在WINDOWS下面用VC得到的结果确是:int size = 4 short size = 2 char size = 1a&b 4a&c 4b&c 42&c 42&b 42&a 41&c 41&b 41&a 40&c 40&b 40&a 4a&&b 1a&&c 1b&&c 12&&b 12&&a 11&&c 11&&b 11&&a 10&&c 40&&b 40&&a 4从两种结果中我们很清晰的得出一个结论,逻辑运算结果的长度是由编译器决定的。