1. 算术运算符
算术运算符用于算术运算,大致分为以下几种:
- +:加法运算符
- –:减法运算符
- *:乘法运算符
- /:除法运算符
- %:模运算符
这五个运算符都是二元运算符,就是有两个运算数才能完成运算,“+”和“-”也可以用作正负值,因此也作为一元运算符,一个运算数就可以完成运算。下面是算术运算符的示例:
/*+和-表示一元运算符,正负值*/
int a = +5;//表示正值,等同于int a = 5;可以省略
int b = -5;//表示负值
/*二元运算符*/
int c = 5 + a;//实现加法运算
int d = 5 - b;//实现减法运算
int e = a * b;//实现乘法运算
int f = a / 3;//实现除法运算,两个整数相除,得到的还是一个整数,小数部分会丢弃,得数是1
float g = 9.0 / a;//实现浮点数除法运算,两个运算数有一个是浮点数,会保留小数部分,得数是1.8
int h = 12 % a;//实现模运算,返回两个运算数的余值,这里得数是2,且不能用于浮点数
int i = 12 % -a;//结果为2
int j = -12 % a;//结果为-2,负值求模的结果的正负号由第一个运算数的符号决定
2. 自增、自减运算符
C语言提供了自增、自减运算符,也就是对变量自身加1、减1的操作。
- ++:自增运算符
- —:自减运算符
自增、自减运算符按照所在的位置分为两种形式,得到的结果也是不一样的:
- i++和i–是先返回自增或自减操作前i的值,再对i自增或自减操作;
- ++i和–i是先对i自增或自减操作,再返回自增或自减之后i的值。
//i++,i--
int a = 5;
int b = a++;//a先赋值给b,再自加1
int c = b--;//b先赋值给c,再自减1
printf("a的值为%d\n",a);//结果为6
printf("b的值为%d\n",b);//结果为4
printf("c的值为%d\n",c);//结果为5
//++i,--i
int a = 5;
int b = ++a;//a先自加1,再赋值给b
int c = --b;//b先自减1,再赋值给c
printf("a的值为%d\n",a);//结果为6
printf("b的值为%d\n",b);//结果为5
printf("c的值为%d\n",c);//结果为5
3. 关系运算符
关系运算符主要用于比较两个值或表达式的关系,常用于控制语句(if/else语句),结果返回一个布尔值,1为真,0为假,主要分为以下6种:
- >:大于运算符,判断左边的值是否大于右边的值
- <:小于运算符,判断左边的值是否小于右边值
- >=:大于等于运算符,判断左边的值是否大于或等于右边的值
- <=:小于等于运算符,判断左边的值是否小于或等于右边的值
- ==:相等运算符,判断两个值是否相等
- !=:不相等运算符,判断两个值是否不相等
int a= 5;
int b = 10;
int c = 10;
if(a > b){ //返回false
printf("a大于b");
}else{ //返回true
printf("a小于b");
}
if(a < b){ //返回true
printf("a小于b");
}else{ //返回false
printf("a小于b");
}
if(a >= b){ //返回false
printf("a大于或等于b");
}else{ //返回true
printf("a小于或等于b");
}
if(a <= b){ //返回true
printf("a小于或等于b");
}else{ //返回false
printf("a大于或等于b");
}
if(b == c){ //返回true
printf("b与c相等");
}else{ //返回false
printf("b与c不相等");
}
if(a != b){ //返回true
printf("a与b不相等");
}else{
printf("a与b相等");
}
4. 逻辑运算符
逻辑运算符主要用于对两边的值或表达式逻辑判断,C语言提供了三种逻辑运算符:
- &&:逻辑与运算符,两边的运算数都为真,则返回真,否则为假;
- ||:逻辑或运算符,两边的运算数至少有一个为真,则返回真,否则为假;
- !:逻辑非运算符,改变运算数的逻辑真假
int a = 5;
int b = 10;
if(a >= 5 && b <= 10){ //这里两个表达式都满足条件,所以返回真
printf("返回真");
}else{
printf("返回假");
}
if(a > 5 || b >= 10){ //这里a > 5为假,b >= 10为真,有一个为真则返回真
printf("返回真");
}else{
printf("返回假");
}
if(!(a > 5)){ //这里a > 5为假,使用!运算符改变为真;这里!的优先级比>运算符高,所以要加上括号
printf("返回真");
}
逻辑运算符的执行顺序是,先计算左边的表达式,后计算右边的表达式。在某些情况下,如果左边的表达式符合条件,只判断左边的表达式就可以得到结果,就不会再对右边的表达式计算了,这就是“短路”:
if(condition1 && condition2)
if(condition1 || condition2)
第一个短路与&&运算符,condition1为假,那就直接返回假,没有必要对condition2计算了
第二个短路与||运算符,condition1为真,那就直接返回真,也没有必要对condition2计算了
5. 位运算符
位运算符用来操作二进制位(bit),C语言提供了6种位运算符:
- &:按位与运算符
- |:按位或运算符
- ^:按位异或运算符
- ~:按位取反运算符
- <<:左移运算符
- >>:右移运算符
与运算符&,对两个操作数的每一个二进制位进行逐位比较,如果两个二进制位都为1,则返回1,否则返回0。
int a = 5;//101
int b = 7;//111
a = a & b;//简写为a &= b;
printf("a的值为%d\n",a);//返回5,即二进制101
或运算符|,对两个操作数的每一个二进制位进行逐位比较,如果两个二进制位至少有一个为1,则返回1,否则返回0。
int a = 5;//101
int b = 7;//111
a = a | b;//简写为a |= b;
printf("a的值为%d\n",a);//返回7,即二进制111
异或运算符^,对两个操作数的每一个二进制位进行逐位比较,如果两个二进制位相同,则返回0,否则返回1。
int a = 5;//101
int b = 7;//111
a = a ^ b;//简写为a ^= b;
printf("a的值为%d\n",a);//返回2,即二进制10
取反运算符~,对运算数的每一个二进制位取反,即1变0,0变1,返回一个新的值。
int a = 5;//101
a = ~a;//按位取反
printf("a的值为%d\n",a);//返回-6
左移运算符<<,将运算数的每一个二进制位向左移动指定的位数,左移相当于乘法操作,左移n位就相当于运算数乘以2的n次方,左边的二进制位舍弃,右边补0。
int a = 12;
a = a << 2;//简写为a <<= 2,相当于12乘以2的2次方
printf("a的值为%d\n",a);//返回48
右移运算符>>,将运算数的每一个二进制位向右移动指定的位数,右移相当于除法操作,右移n位就相当于运算数除以2的n次方,正数左边补0,负数左边补1,右边舍弃。
int a = 12;
a = a >> 2;//简写为a >>= 2,相当于12除以2的2次方
printf("a的值为%d\n",a);//返回3
6. 赋值运算符
赋值运算符用于对变量的赋值,赋值运算符以“=”表示,“=”的左边是变量,称为左值或左值表达式,也可以出现在“=”的右边;“=”的右边是具体的值或表达式语句,称为右值,右值是不能被赋值且不能出现在“=”的左边。赋值运算符可以和算术运算符结合起来组成新的运算符,大致分为以下几种:
- =:基本赋值运算符,将右边的运算数赋给左边的运算数
- +=:加法和赋值结合的简写形式,a += b相当于a = a + b
- -=:减法和赋值结合的简写形式,a -= b相当于a = a – b
- *=:乘法和赋值结合的简写形式,a *= b相当于a = a * b
- /=:除法和赋值结合的简写形式,a /= b相当于a = a / b
- %=:模运算和赋值结合的简写形式,a %= b相当于a = a % b
- <<=:左移和赋值结合的简写形式,a <<= b相当于a = a << b
- >>=:右移和赋值结合的简写形式,a >>= b相当于a = a >> b
- &=:按位与和赋值结合的简写形式,a &= b相当于a = a & b
- |=:按位或和赋值结合的简写形式,a |= b相当于a = a | b
- ^=:按位异或和赋值结合的简写形式,a ^= b相当于a = a ^ b
7. 三目运算符
三目运算符是指有三个运算数,也称为条件表达式,基本表现形式是:condition ? a : b;
int a = 5;
int b;
b = (a == 5) ? 10 : 20;
printf("a的值为%d\n",a);//返回10
8. 运算符优先级
运算符的优先级是指在一个表达式中包含多个运算符,哪个运算符应当优先执行,这通常会影响到一个表达式的结果,相当于是对运算符进行排序,下面是运算符的优先级排序(由高到低排序):
- 一级:小括号( )
- 二级:从右往左:负号运算符-、按位取反~、自增运算符++、自减运算符–、逻辑非!、sizeof()
- 三级:乘法*、除法/、%模运算
- 四级:加法+、减法-
- 五级:左移<<、右移>>
- 六级:关系运算符(>、<、=等)
- 七级:位运算符(&、|、^)
- 八级:逻辑运算符(&&、||)
- 九级:从右至左:三目运算符
- 十级:从右至左:赋值运算符
- 十一级:逗号运算符,用于表达式
有错误的地方、需要补充的知识欢迎评论区指正