C语言学习随笔-08 运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。
C语言中的运算符主要有:
● 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、杂项运算符
1、算术运算符:+、-、*、/、%、++、--
int a = 21; int b = 10; int c; c = a + b; printf("Line 1 - c 的值是: %d\n", c);//31 c = a - b; printf("Line 2 - c 的值是: %d\n", c);//11 c = a * b; printf("Line 3 - c 的值是: %d\n", c);//210 c = a / b; printf("Line 4 - c 的值是: %d\n", c);//2 c = a % b; printf("Line 5 - c 的值是: %d\n", c);//1 c = a++;//赋值后再加1,c为21,a为22 printf("Line 6 - c 的值是: %d\n", c);//21 c = a--;//赋值后再减1,c为22,a为21 printf("Line 7 - c 的值是: %d\n", c);//22 printf("----------------------------\n");
//a++与++a的区别 int cc; int aa = 10; cc = aa++; printf("先赋值后运算:\n"); printf("Line1 - cc 的值是 %d\n",cc);//10 printf("Line2 - aa 的值是 %d\n",aa);//11 aa = 10; cc = aa--; printf("Line3 - cc 的值是 %d\n", cc);//10 printf("Line4 - aa 的值是 %d\n", aa);//9 printf("先运算后赋值:\n"); aa = 10; cc = ++aa; printf("Line5 - cc 的值是 %d\n", cc);//11 printf("Line6 - aa 的值是 %d\n", aa);//11 aa = 10; cc = --aa; printf("Line7 - cc 的值是 %d\n", cc);//9 printf("Line8 - aa 的值是 %d\n", aa);//9
2、关系运算符:(a==b)为假、(a!=b)为真、(a>b)为假、(a<b)为真、(a>=b)为假、(a<=b)为真
int a = 21; int b = 10; int c; if (a == b)//a不等于b { printf("a等于b\n"); } else { printf("a不等于b\n"); } if (a < b)//a不小于b { printf("a小于b\n"); } else { printf("a不小于b\n"); } if (a > b)//a大于b { printf("a大于b\n"); } else { printf("a不大于b\n"); } /* 改变a和b的值 */ a = 5; b = 20; if (a <= b) { printf("a小于或等于b\n"); } if (b >= a) { printf("b大于或等于a\n"); }
3、逻辑运算符:&& -逻辑与、|| -逻辑或、!-逻辑非
&&:如果两个数都非零,则为真,否则为假
||:如果两个数中有一个数非零,则为真,否则为假
!:把条件为真的变为假
int a = 5; int b = 20; int c; if (a && b) { printf("Line1 - 条件为真\n"); } if (a || b) { printf("Line2 - 条件为真\n"); } /* 改变a和b的值 */ a = 0; b = 10; if (a && b) { printf("Line3 - 条件为真\n"); } else { printf("Line3 - 条件为假\n"); } if (!(a && b)) { printf("Line4 - 条件为真\n"); }
4、位运算符:位运算符作用于二进制的位,并逐位执行操作
&(与)、|(或)、^(异或)、~(取反)、<<(左移)、>>(右移) x=0,y=0:x&y=0,x|y=0,x^y=0 x=0,y=1:x&y=0,x|y=1,x^y=1 x=1,y=1:x&y=1,x|y=1,x^y=0 x=1,y=0,x&y=0,x|y=1,x^y=1 A = 00111100; B = 00001101; A & B = 00001100; A | B = 00111101; A ^ B = 00110001; ~A = 11000011;
▷ & 与运算符:对两个操作数的每一位执行逻辑与操作,如果位都为1,则结果为1,否则为0
0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1 & 1 = 1; A & B = 00001100;
▷ | 或运算符:对两个操作数的每一位执行逻辑或操作,如果1位都为0,则结果为0,否则为1
0 | 0 = 0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 1; A | B = 00111101;
▷ ^ 异或运算符:对两个操作数的每一位执行异或操作,如果两个相应的位值相同,则结果为0,否则为1
0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0; A ^ B = 00110001;
▷ ~ 取反运算符:对操作数的每一位执行取反操作,即每一位的0变为1,1变为0
~1 = -2; ~0 = -1 (~A) = 11000011;
▷ << 左移运算符:将操作数的所有位向左移动指定的位数。左移n位相当于乘以2的n次方
二进制左移运算符,将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)
A << 2将得到240,即为11110000
▷ >> 右移运算符:将操作数的所有位向右移动指定为位数。右移n位相当于除以2的n次方
二进制右移运算符,将一个运算对象的各二进制位全部右移若干位(正数左补0,负数左补1,右边丢弃)
A >> 2将得到 15,即为00001111
unsigned int x = 60;/* 60 = 00111100 */ unsigned int y = 13;/* 13 = 00001101 */ int z = 0; z = x & y;/* 12 = 00001100 */ printf("Line 1 - z的值是:%d\n", z);//12 z = x | y;/* 61 = 00111101 */ printf("Line 2 - z的值是:%d\n", z);//61 z = x ^ y;/* 49 = 00110001 */ printf("Line 3 - z的值是:%d\n", z);//49 z = ~x;/* -61 = 11000011 */ printf("Line 4 - z的值是:%d\n", z);//-61 z = x << 2;/* 240 = 11110000 */ printf("Line 5 - z的值是:%d\n", z);//240 z = x >> 2;/* 15 = 00001111 */ printf("Line 6 - z的值是:%d\n", z);//15
5、赋值运算符:
= 简单的赋值运算符,把右边的值赋值给左边操作数
+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数
-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数
*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数
/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数
%= 求模且赋值运算符,求两操作数的模赋值给左边操作数
<<= 左移且赋值运算符
>>= 右移且赋值运算符
&= 按位与且赋值运算符
^= 按位异或且赋值运算符
|= 按位或且赋值运算符
int a = 21; int c; c = a;//c=21 printf("Line1, = 运算符实例, c的值 = %d\n",c); c += a;//c=c+a printf("Line2, += 运算符实例, c的值 = %d\n", c); c -= a;//c=c-a printf("Line3, -= 运算符实例, c的值 = %d\n", c); c *= a;//c=c*a printf("Line4, *= 运算符实例, c的值 = %d\n", c); c /= a;//c=c/a printf("Line5, /= 运算符实例, c的值 = %d\n", c); c = 200; c %= a;//c=c%a printf("Line6, %= 运算符实例, c的值 = %d\n", c); c <<= 2;//c=c<<=2 printf("Line7, <<= 运算符实例, c的值 = %d\n", c); c >>= 2;//c=c>>=2 printf("Line8, >>= 运算符实例, c的值 = %d\n", c); c &= 2;//c=c&2 printf("Line9, &= 运算符实例, c的值 = %d\n", c); c ^= 2;//c=c^2 printf("Line10, ^= 运算符实例, c的值 = %d\n", c); c |= 2;//c=c|2 printf("Line11, |= 运算符实例, c的值 = %d\n", c);
6、杂项运算符:
sizeof() 返回变量的大小
& &a,将给出变量的实际地址
* *a,指向一个变量
?: 条件表达式
int a = 4; short b; double c; int* ptr; //sizeof运算符实例 printf("Line1 - 变量a的大小= %lu\n",sizeof(a)); printf("Line2 - 变量b的大小= %lu\n",sizeof(b)); printf("Line3 - 变量c的大小= %lu\n",sizeof(c)); //&和*运算符实例 ptr = &a;//‘ptr’现在包含‘a’的地址 printf("a的值是:%d\n",a); printf("*ptr是:%d\n",*ptr); //三元运算符实例 a = 10; b = (a == 1) ? 20 : 30; printf("b的值是:%d\n",b); b = (a == 10) ? 20 : 30; printf("b的值是:%d\n",b);
7、运算符的优先级
1、后缀 () [] -> . ++ -- 从左到右
2、一元 + - ! ~ ++ -- (type)* & sizeof 从右到左
3、乘除 * / % 从左到右
4、加减 + - 从左到右
5、移位 << >> 从左到右
6、关系 < <= > >= 从左到右
7、相等 == != 从左到右
8、位与AND & 从左到右
9、位异或XOR ^ 从左到右
10、位或OR | 从左到右
11、逻辑与AND && 从左到右
12、逻辑或OR || 从左到右
13、条件 ?: 从右到左
14、赋值 = += -= *= %= >>= <<== &= ^= |= 从右到左
15、逗号 . 从左到右
int a = 20; int b = 10; int c = 15; int d = 5; int e; e = (a + b) * c / d; // ( 30 * 15 ) / 5 printf("(a + b) * c / d的值是:%d\n",e); e = ((a + b) * c) / d; // ( 30 * 15 ) / 5 printf("((a + b) * c) / d的值是:%d\n",e); e = (a + b) * (c / d); // (30) * (15 / 5) printf("(a + b) * (c / d)的值是:%d\n",e); e = a + (b * c) / d; // 20 + ( 150 / 5) printf("a + (b * c) / d的值是:%d\n",e);

浙公网安备 33010602011771号