《C语言教程》08章 比较、逻辑、位运算符


一、运算符的优先级
优先运算符含义对象个数结合方向
1()
[ ]
->
.
圆括号
下标符
结构体运算符
结构体运算符
左→右
2!
~
++
--
-
(类型)
*
&
sizeof
逻辑非
位取反
增1
减1
负号
类型转换
指针
地址
类型长度
单目左←右
3*
/
%


双目左→右
4+
-

双目左→右
5<<
>
位左移
位右移
双目左→右
6<

=
<=
比较符双目左→右
7==
!==
比较符双目左→右
8&位与双目左→右
9^位与或双目左→右
10|位或双目左→右
11&&逻辑与双目左→右
12||逻辑或双目左→右
13? :逻辑与三目左←右
14=,+=,-=
*=,/=,%=
>=,<<=,
&=,^=,|=
赋值双目左←右
15,顺序求值符左→右

二、比较、逻辑、位运算符

只有类型相同(或C语言能自动转换)的表达式才能比较,如果类型不同就必须用函数转换。例如:判断一字符串的长度是否等于10,就要用strlen()将字符串的长度求出来变成了整型,才能和10比较。

比较运算符只有6个,即:等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。比较运算符也叫关系运算符。

逻辑运算符只有3个,即:与AND(&&)、或OR(||)、非NOT(!)。

位运算符只有6个,即:与AND(&)、或OR(|)、非NOT(~)、异或XOR(^)、左移ShiftLeft(<<)、右移ShiftRight(>)。


#include <stdio.h>

int main(void)
{
    //全部为1字节的变量,实际运算是4字节
    unsigned char i, j, k1, k2, k3 ;

    i = 0x5A;     //    0101 1010    --5A
    j = 0x9B;     //    1001 1011    --9B
    k1 = ~i;      //    1010 0101    --A5
    k2 = i << 2;  //(01)0110 1000    --68
    k3 = j > 2;  //    0010 0110(11)--26

    printf("与运算  :5A & 9B = %X\n",i & j);  //1A
    printf("或运算  :5A | 9B = %X\n",i | j);  //DB
    printf("异或运算:5A ^ 9B = %X\n",i ^ j);  //C1
    printf("取反运算:~5A = %X\n", k1);        //A5
    printf("左移2位 :5A << 2 = %X\n",k2);     //68
    printf("右移2位 :9B > 2 = %X\n",k3);     //26

    //注意:这儿验证参与运算的实际结果不是1字节,而是4字节
    printf("取反运算:~5A = %X\n", ~i);        //FFFF FFA5
    printf("左移2位 :5A << 2 = %X\n",i << 2); //0000 0168
    printf("右移2位 :9B > 2 = %X\n",j > 2); //0000 0026

    return 0;
}

三、其它运算符

一些常用易错的运算符要注意。

  1. 逗号(,)运算符,将几个内容合成一个运算,且不改变分开运行的结果。for语句中常用。
  2. i++和++i单独使用时功能相同,赋值时有先后问题。
  3. 赋值语句可以连续赋值,但不建议过多过杂。

#include <stdio.h>

int main(void)
{
    unsigned char i, j, k1, k2, k3 ;

    //逗号,运算符
    i = 15, j = 19;
    k1 = (12, 23, i, j);  //将12,23,i,j分别赋值给k1,最后一个是j
    printf("k1 = %d\n", k1);
    printf("\n");


    //增1运算符
    k2 = i++;    //k2=15, i=16  先赋值后加
    k3 = ++j;    //k3=20, j=20  先加后赋值
    printf("i = %d    k2 = %d\n", i, k2);
    printf("j = %d    k3 = %d\n", j, k3);
    printf("\n");

    //赋值运算符
    printf("赋值前:i=%d   j=%d   k1=%d   k2=%d   k3=%d\n", i, j, k1, k2, k3);
    i = j = k1 = k2 = k3;    //自右向左,将k3分别赋给k2,k1,j,i
    printf("赋值后:i=%d   j=%d   k1=%d   k2=%d   k3=%d\n", i, j, k1, k2, k3);

    return 0;
}