位和逻辑运算符

来源:互联网 发布:金融很虚 知乎 编辑:程序博客网 时间:2024/05/28 15:28

一、逻辑运算符:

  包括: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

 

 二、位运算符:

   包括: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的值5。此号好理解,按位取反

 如果 P0 = 0x80;

P0 ^ 1 == 0x81;

P0 ^ 2 ==0x82;

P0 ^ 3 ==0x83;

P0 ^ 4 ==0x84;


 

1级(左结合)   () 圆括号;[]下标运算符;->指向结构体成员运算符;. 结构体成员运算符。  2级(右结合)  !逻辑非运算符;~按位取反运算符;++前缀增量运算符;--前缀减量运算符;+正号运算符;-负号运算符;(类型)类型转换运算符;*指针运算符;&地址运算符;sizeof长度运算符。  3级(左结合)   *乘法运算符;/除法运算符;%取余运算符。   4级(左结合)   +加法运算符;-减法运算符。     5级(左结合)  <<左移运算符;>>右移运算符。  6级(左结合)  <、<=、>、>=关系运算符。  7级(左结合)   ==等于运算符;!=不等于运算符。   8级(左结合)   &按位与运算符。  9级(左结合)   ^按位异或运算符。   10级(左结合)   |按位或运算符。   11级(左结合)  &&逻辑与运算符。   12级(左结合)   ||逻辑或运算符。  13级(右结合)   ? :条件运算符。   14级(右结合)   =、 +=、 -=、 *=、 /=、 %=、&=、 ^=、 |=、 <<=、>>=赋值运算符。   15级(左结合)   ,逗号运算符。
编辑本段运算符优先级与结合性
  运算符的优先级:C语言中,运算符的运算优先级共分为15 级。1 级最高,15 级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符 优先级相同时,则按运算符的结合性所规定的结合方向处理。  运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y 应先与“-”号结合,执行x-y 运算,然后再执行+z 的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z 再执行x=(y=z)  运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。  优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。  所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其它的都是从左至右结合。  具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。()是与函数相关,[]与数组相关,而->及.是取结构成员。  其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的。  另外在C语言里,没有前置后置之分,因为++ -- 是右结合所以右侧优先运算,表现为 "操作数后置优先级比较高"的假象,前置和后置的区分是因为运算符重载而后加入C++的   接下来是算术运算符,*、/、%的优先级当然比+、-高了。  移位运算符紧随其后。   其次的关系运算符中,< <=> >=要比 == !=高一个级别,不大好理解。  所有的逻辑操作符都具有不同的优先级(单目运算符除外,!和~)   逻辑位操作符的"与"比"或"高,而"异或"则在它们之间。  跟在其后的&&比||高。  接下来的是条件运算符,赋值运算符及逗号运算符。  在C语言中,只有4个运算符规定了运算方向,它们是&&、||、条件运算符及赋值运算符。   &&、||都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式的值。如 a = 0&& b;&&运算符的左边位0,则右边表达式b就不再判断。  在条件运算符中。如a?b:c;先判断a的值,再根据a的值对b或c之中的一个进行求值。  赋值表达式则规定先对右边的表达式求值,因此使 a = b = c = 6;成为可能。