c语言之运算符

目录

一.常见运算符及分类

二.运算符详解

1.算数运算符

2. 关系运算符

3. 位运算符

3.1 左移运算符

3.2 右移运算符

3.3 按位与

3.4 按位或

3.5 按位异或

3.6 按位取反

4.赋值运算符

5. 单目运算符   

6. 逻辑运算符

7. 条件运算符

8.逗号运算符

三.运算符的优先级


一.常见运算符及分类

算数运算符    +    -   *  /   %     
关系运算符<   ==    >     <=   >=   !=  
 位运算符 <<    >>    &   |     ^     ~
赋值运算符 =   +=  -=   *=   /=   %=   &=  
单目运算符 

 ! -  +  &(取地址)~  --  ++   *(解引用)   

        (类型)强制转换类型

逻辑运算符  &&    ||
条件运算符? :
逗号运算符  ,

二.运算符详解

1.算数运算符

+    -    *    /     %     

其中,/运算符两边的操作数如果是整数,执行整数运算。如果要计算出小数结果,两边操作数至少有一个为浮点数

%运算符,就是取模(取余),计算出的结果是整除后的余数

除了 % 运算符,其他的几个运算符可以作用于整数和浮点数

int main()
{
	int ret = 10 / 3;
	double ret2 = 10 / 3.0;
	double ret3 = 2 * 2.0;
	printf("%d\n", ret);
	printf("%.5f\n", ret2);
	printf("%.5f\n", ret3);
 
	return 0;
}

3
3.33333
4.00000

2. 关系运算符

<   ==    >     <=   >=   !=  

首先,容易混淆的是==和=运算符,我们要记住==是用来判断是否相等,而=是用来赋值

*比较两个字符串是否相同应该用strcmp()函数,而不是用==

strcmp()的原型

int strcmp ( const char * str1, const char * str2 )

其中,str1  是要进行比较的第一个字符串,str2 是要进行比较的第二个字符串

在比较时,实际上是按 ASCII 值大小进行比较

当返回值小于 0,表示 str1 小于 str2,当返回值大于 0,表示 str1 大于 str2,当返回值等于 0,则表示 str1 等于 str2

3. 位运算符

<<    >>    &   |     ^     ~

移位运算符的操作数只能是整数,都以二进制形式运算

<< 左移运算符

>> 右移运算符

& 按位与       对应位有0,结果为0。两个1,结果为1

|  按位或        对应位有1,结果为1。两个0,结果为0

^  按位异或    相同时为0,相异为0

^  按位取反     对一个数的二进制按位取反,包括符号位
 

3.1 左移运算符

移位原则: 无论算数左移还是逻辑左移,都是左边舍弃,右边缺多少补多少个0

3.2 右移运算符

右移运算符分为逻辑右移和算数右移

移位原则:  逻辑右移时, 左边用0填充,右边舍弃 。算术右移时,左边用原该值的符号位填充,右边舍弃

3.3 按位与

&       对应位有0,结果为0。两个1,结果为1

如,12 & 10 = 8 ,12的二进制为0000 1100,10的二进制为0000 1010,两个数相与结果为0000 1000,对应的就是8

3.4 按位或

|         对应位有1,结果为1。两个0,结果为0

如,12  | 10 = 14,0000 1100 | 0000 1010 =  0000 1110

3.5 按位异或

^          相同时为0,相异为0

如,12 ^ 10 = 6, 0000 1100 ^ 0000 1010 = 0000 0110。1 ^ 1=0 ,   0 ^ 1=1。

我们可以总结出两个规律:

1. a^a=0 

2.a^0=a

还有一道经典的练习:

不创建临时变量(第三个变量),实现两个数的交换

不创建临时变量(第三个变量),也可以理解为不多占用内存空间


#include<stdio.h>
int main()
{
		int a = 12;
		int b = 23;
		a = a ^ b;
		b = a ^ b;
		a = a ^ b;
		printf("a = %d\nb = %d\n", a, b);
		
	return 0;
}

这里,a=a^b;b=a^b;那么可以得到 b=a^b^b,即b=a^0,可以得到b=a。a=a^b等价于a=a^a^b,即a=0^b,可得a=b。这样就完成了一次交换

缺点就是代码的可读性差

3.6 按位取反

~         对一个数的二进制按位取反,包括符号位

当a=-1时,~a=0

原码1000 0001
反码1111 1110
补码1111 1111

4.赋值运算符

 =   +=  -=   *=   /=  %=   &= 

+=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

意思就是这个意思了,这些运算符用起来会简化表达,看起来更加简洁

5. 单目运算符   

! -  +  &(取地址)~  --  ++   *(解引用)     (类型)强制转换类型

!运算符常用于判断语句中,值得一提的是在c语言中,0表示假,!0表示真。c语言的逻辑运算值是0或1,0表示假,1表示真 ,非0值也表示为1

&运算符与*(解引用)运算符常常一起出现,&用于取出地址,*用于解引用


int main()
{
	int a = 12;
	int* pa = &a;
	*pa =23;//解引用
	printf("%d\n", a);
 
	return 0;
}

打印结果就是23

++   --是自增自减,可前置可后置,区别是前置时先 增/减 后使用

类型)强制转换类型

例如:


int main()
{
	float a = 9.9;
	int b = 0;
	b = (int)a;
	printf("%d\n", b);
	return 0;
}

6. 逻辑运算符

 &&     ||

&&为逻辑与运算符,||逻辑或运算符

运用这两个逻辑运算符能优化代码

如,解决闰年问题时

int main()
{
	int year = 0;
	for (year = 1000; year <= 2000; year+=4)
	{
		if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
		{
			printf("%d ", year);
		}
	}
	return 0;
}

7. 条件运算符

 ? :       表达式1?表达式2:表达式3。意思是如果表达式1为真,就执行表达式2,否则就执行表达式3。就不用判断语句

简单举一个例子:


int main()
{
	int a = 22;
	int b = 33;
	printf("max=%d", a > b ? a : b);
 
	return 0;
}

结果为:max=33

8.逗号运算符

c语言中,我们把用  ,(运算符)连接起来的表达式叫做逗号表达式

如   表达式1,表达式2  其中逗号表达式的值为表达式2的值

int main()
{
	int a = 5;
	int b = (a+10, a + 5);
	printf("%d\n", b);
	return 0;
}

 结果为   10

三.运算符的优先级

大致的优先级:

算数运算符>关系运算符>赋值运算符

其中,同一的优先级的运算符,运算时的顺序由结合方向决定

这次关于c语言运算符的内容就分享到这里了,若有补充或者发现错误,欢迎评论私信交流!

over

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值