运算符、运算符优先级

本文详细介绍了C/C++编程中的各种运算符,包括算术运算符、移位运算符、位操作符、赋值运算符、单目运算符、关系运算符、逻辑运算符、三目运算符和逗号运算符,以及它们的优先级和使用实例。通过实例演示,帮助理解运算符的工作原理和应用场景。
摘要由CSDN通过智能技术生成

算术运算符

运算符描述
+把两个操作数相加
-从第一个操作数中减去第二个操作数
*把两个操作数相乘
/分子除以分母
%取模运算符,整除后的余数

注:

  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
  3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

代码示例

//算术运算符:+ - * / %
int main()
{
	//+ - 相加
	int a = 1 + 1;
	printf("%d\n", a);// 2

	//- - 相减
	int b = 2 + 1;
	printf("%d\n", b);// 3

	//* - 相乘
	int c = 2 * 2;
	printf("%d\n", c);// 4

	//整数除整数,结果为小数时,会把小数部分去除
	int d = 9 / 2;
	//如果想得到小数,就得把其中的一个整数改为浮点数
	float e = 9 / 2.0;
	printf("%d %f\n", d, e);// 4 4.500000

	//% - 取余
	int f = 9 % 2;
	printf("%d\n", f);// 1
	return 0;
}

移位运算符

运算符描述
<<二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
>>二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

代码示例

//移位运算符:<< >>
int main()
{
	int a = 2;
	//整数型2的二进制表示:
	//00000000 00000000 00000000 00000010
	//<<:为左移运算符,表示整体向左移动一位
	//00000000 00000000 00000000 00000100
	int b = a << 1;
	//00000000 00000000 00000000 00000010
	//>>:为右移运算符,表示整体向右移动一位
	//00000000 00000000 00000000 00000100
	int c = a >> 1;
	printf("%d %d", b, c);// 4 1
	return 0;
}

位操作符

运算符描述
&按位与操作,按二进制位进行"与"运算。
|按位或运算符,按二进制位进行"或"运算。
^异或运算符,按二进制位进行"异或"运算。

代码示例

//位运算符:& | ^ 
int main()
{
	int a = 2;
	int b = 3;
	int c = 0;

	//& - 按位与同位两个数字都为1得1,其他结果得0
	//2的二进制: 00000000 00000000 00000000 00000010
	//3的二进制: 00000000 00000000 00000000 00000011
	//2 & 3操作:00000000 00000000 00000000 00000010
	c = a & b;
	printf("%d\n", c);// 2
	
	//| - 按位或同位两个数字其中一个为1或两个都为1得1,其他结果得0
	//2的二进制: 00000000 00000000 00000000 00000010
	//3的二进制: 00000000 00000000 00000000 00000011
	//2 | 3操作:00000000 00000000 00000000 00000011
	c = a | b;
	printf("%d\n", c);// 3

	//^ - 按位异或同位两个数字相同得0,不同得1
	//2的二进制: 00000000 00000000 00000000 00000010
	//3的二进制: 00000000 00000000 00000000 00000011
	//2 ^ 3操作:00000000 00000000 00000000 00000001
	c = a ^ b;
	printf("%d\n", c);// 1
	
	return 0;
}

赋值运算符

运算符描述
=简单的赋值运算符,把右边操作数的值赋给左边操作数
+=加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数
-=减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数
*=乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数
/=除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数
%=求模且赋值运算符,求两个操作数的模赋值给左边操作数
<<=左移且赋值运算符
>>=右移且赋值运算符
&=按位与且赋值运算符
|=按位或且赋值运算符
^=按位异或且赋值运算符

代码示例

//赋值运算符 = += -= *= /= %= <<= >>= &= |= ^=
int main()
{
	int a = 0;

	a = 5;//把2赋予给a
	a += 3;//等同于a = a + 3;
	a -= 3;//等同于a = a - 3;
	a *= 3;//等同于a = a * 3;
	a /= 3;//等同于a = a / 3;
	a %= 3;//等同于a = a % 3;
	a <<= 3;//等同于a = a << 3;
	a >>= 3;//等同于a = a >> 3;
	a &= 3;//等同于a = a % 3;
	a |= 3;//等同于a = a % 3;
	a ^= 3;//等同于a = a % 3;

	return 0;
}

单目运算符

运算符描述
!称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。
+表示为整数
-表示为负数
sizeof()返回变量的大小。
~取反运算符,按二进制位进行"取反"运算。
++自增运算符,整数值增加 1(后置++,先使用,再++;前置++,先++,后使用)
自减运算符,整数值减少 1(后置–,先使用,再–;前置–,先–,后使用)
&返回变量的地址。
*指向一个变量。
(类型)强制类型转换。

代码示例

//单目运算符 ! + - sizeof ~ ++ -- & * (类型)
int main()
{
	//0 表示假,非0就是真
	int a = 0;
	printf("%d\n", !a);//1

	a = -5;
	a = -a;
	a = +a;

	//sizeof是一个操作符
	//不是函数
	//计算类型或者变量的大小的
	int b = 10;
	printf("%d\n", sizeof(int));// 4
	printf("%d\n", sizeof(b));// 4
	//10*4 = 40 
	int arr[10] = { 0 };
	printf("%d\n", sizeof(arr));//40 计算的是数组的总大小,单位是字节
	printf("%d\n", sizeof(arr[0]));//4
	int sz = sizeof(arr) / sizeof(arr[0]);//数组的长度
	printf("%d\n", sz);// 10

	//~ 按位取反
	int c = 0;
	//0的二进制:00000000 00000000 00000000 00000000
	//~取反    :11111111 11111111 11111111 11111111
	//整数在内存中的形式为补码
	//正整数的原码、反码、补码相同
	//负整数(拿-1举例)
	//原码:10000000 00000000 00000000 00000001 (头位属于符号位,1为负数)
	//反码:11111111 11111111 11111111 11111110 (原码符号位不变,其余取反)
	//补码:11111111 11111111 11111111 11111111 (反码加1,最后得到补码)
	printf("%d\n", ~c);// -1

	//++ 和 --
	int d = 10;
	int e = d++;//后置++,先使用,再++

	printf("%d\n", d);//11
	printf("%d\n", e);//10

	int f = 10;
	int g = ++f;//前置++ - 先++,后使用

	printf("%d\n", f);//11
	printf("%d\n", g);//11

	//&返回变量的地址。
	int h = 6;
	int* p = &h;
	printf("%p\n", p);// 0000005C13AFFA24(这是内存地址,不是固定的)

	//*指向一个变量
	int i = *p;
	printf("%d\n", i);// 6

	//强制类型转换
	int j = (int)3.14;
	printf("%d\n", j);// 3

	return 0;
}

关系运算符

运算符描述
==检查两个操作数的值是否相等,如果相等则条件为真。
!=检查两个操作数的值是否相等,如果不相等则条件为真。
>检查左操作数的值是否大于右操作数的值,如果是则条件为真。
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。
<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。

代码示例

//关系运算符 == != > < >= <=
int main()
{
	int a = 6;
	int b = 8;

	if (a == b)
	{
		printf("a == b\n");
	}
	if (a != b)
	{
		printf("a != b\n");
	}
	if (a > b)
	{
		printf("a > b\n");
	}
	if (a < b)
	{
		printf("a < b\n");
	}
	if (a >= b)
	{
		printf("a >= b\n");
	}
	if (a <= b)
	{
		printf("a <= b\n");
	}

	return 0;
}

运行结果

a != b
a < b
a <= b

逻辑运算符

运算符描述
&&称为逻辑与运算符。如果两个操作数都非零,则条件为真。
||称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。
!称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。

代码示例

//逻辑运算符 && || !
int main()
{
	//在C语言中程序把非零和非空的值判断为true,把零和NULL判断为false
	int a = 0;
	int b = 1;

	if (a && b)
	{
		printf("a && b为真\n");
	}
	else
	{
		printf("a && b为假\n");
	}
	if (a || b)
	{
		printf("a || b为真\n");
	}
	else
	{
		printf("a || b为假\n");
	}
	if (!b)
	{
		printf("!b为真\n");
	}
	else
	{
		printf("!b为假\n");
	}

	return 0;
}

运行结果

a && b为假
a || b为真
!b为假

三目运算符

运算符描述
? :条件表达式

代码示例

//三目运算符
int main()
{
	int a = 0;
	int b = 3;
	int max = 0;

	max = a > b ? a : b;
	printf("%d\n", max);// 3

	return 0;
}

逗号运算符

代码示例

//逗号运算符
int main()
{
	//(2, 4 + 5, 6);
	int a = 0;
	int b = 3;
	int c = 5;
	        //a=5       c=1        b=3
	int d = (a = b + 2, c = a - 4, b = c + 2);
	//逗号表达式,是从左向右依次计算的
	//整个表达式的结果是最后一个表达式的结果

	printf("%d\n", d);
	return 0;
}

运算符优先级

优先级运算符名称或含义使用形式结合方向说明
1[]数组下标数组名[常量表达式]左到右-----
()圆括号(表达式)/函数名(形参表)-----
.成员选择(对象)对象.成员名-----
->成员选择(指针)对象指针->成员名-----
2-负号运算符-表达式右到左单目运算符
(类型)强制类型转换(数据类型)表达式-----
++前置自增运算符++变量名单目运算符
++后置自增运算符变量名++单目运算符
--前置自减运算符--变量名单目运算符
--后置自减运算符变量名--单目运算符
*取值运算符*指针变量单目运算符
&取地址运算符&变量名单目运算符
!逻辑非运算符!表达式单目运算符
~按位取反运算符~表达式单目运算符
sizeof长度运算符sizeof(表达式)-----
3/表达式/表达式左到右双目运算符
*表达式*表达式双目运算符
%余数(取模)整型表达式/整型表达式双目运算符
4+表达式+表达式左到右双目运算符
-表达式-表达式双目运算符
5<<左移变量左到右双目运算符
>>右移变量>>表达式双目运算符
6>大于表达式>表达式左到右双目运算符
>=大于等于表达式>=表达式双目运算符
<小于表达式双目运算符
<=小于等于表达式双目运算符
7==等于表达式==表达式左到右双目运算符
!=不等于表达式!= 表达式双目运算符
8&按位与表达式&表达式左到右双目运算符
9^按位异或表达式^表达式左到右双目运算符
10|按位或表达式|表达式左到右双目运算符
11&&逻辑与表达式&&表达式左到右双目运算符
12||逻辑或表达式||表达式左到右双目运算符
13?:条件运算符表达式1? 表达式2: 表达式3右到左三目运算符
14=赋值运算符变量=表达式右到左-----
/=除后赋值变量/=表达式-----
*=乘后赋值变量*=表达式-----
%=取模后赋值变量%=表达式-----
+=加后赋值变量+=表达式-----
-=减后赋值变量-=表达式-----
<<=左移后赋值变量-----
>>=右移后赋值变量>>=表达式-----
&=按位与后赋值变量&=表达式-----
^=按位异或后赋值变量^=表达式-----
|=按位或后赋值变量|=表达式-----
15,逗号运算符表达式,表达式,…左到右从左向右顺序运算

说明:

同一优先级的运算符,运算次序由结合方向所决定。

简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

本文出现任何错误,欢迎留言批评指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值