优先 | 运算符 | 含义 | 对象个数 | 结合方向 |
---|---|---|---|---|
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 0026return
0; }
一些常用易错的运算符要注意。
#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; }