C语言之操作符

本文详细介绍了C语言中的各种操作符,包括算数操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符和逗号表达式。通过实例展示了它们的用法和效果,帮助读者深入理解C语言中的运算机制。
摘要由CSDN通过智能技术生成

目录

1.操作符分类

2.操作符详解

2.1算数操作符

 2.2移位操作符

2.2.1原码、补码与反码

2.2.2左移与右移

 2.3位操作符

 2.4赋值操作符

2.5单目操作符(双目,三目)

2.6关系操作符

 2.7逻辑操作符

2.8条件操作符 

2.9逗号表达式

 2.10下标引用,函数调用和结构成员


1.操作符分类

操作符种类很多,分为:

1.算数操作符

2.移位操作符

3.位操作符

4.赋值操作符

5.单目操作符

6.关系操作符

7.逻辑操作符

8.条件操作符

9.逗号表达式

10.下标引用,函数调用和结构成员

2.操作符详解

2.1算数操作符

算数操作符也叫作运算符,它就是我们平时最常用到的 ‘+’   ‘-’   ‘*’   ‘/’  '%'  ,

其中,除了‘%’,我们都很了解,所以给大家重点介绍‘%’。

1.‘%’叫模,是用来求余数的,我们举个例子:

求 a=10%4,我们可以很轻松得到a=2;

求a=3%4 ,则a=3;

我知道这如果是一道数学题,肯定很容易就得到结果,但是当它作为编程中的一个问题时,需要转一下脑筋才能出来。所以这里有一个结论:

当前一个数小于后一个数取模时,得到的结果总是前一个数。

2.处‘%’之外,其他几个操作符可以作用于整数和浮点数;

3.对于‘/'如果俩个操作数都为整数,则执行整数除法;只要操作数中有一个是浮点数,执行的就是浮点数除法;

4.’%‘两端的操作数必须是整数,返回的是整除之后的余数。

5.在double和float中,想要结果保留小数点后几位,就加.几;

例如,想要保留小数点后一位,就是printf(“%.1lf”);

           保留小数点后俩位,printf("%.2lf");

我们看代码:

#include<stdio.h>
int main()
{
	//除法
	int a = 6 / 4;//整数除法
	printf("a=%d\n", a);
	double b = 10.0 / 2;//浮点数除法
	printf("b=%lf ", b);
	printf("b=%.1lf\n", b);//保留小数点后一位
	//取余
	int c = 10 % 4;
	printf("c=%d\n", c);
	int d = 2 % 4;
	printf("d=%d\n", d);
	return 0;
}

我们得到结果如下:

 2.2移位操作符

移位,移的是二进制位。

移位操作符有   <<  左移,>>右移。

移位操作符的操作数只能是整数,不可以移负数位。

在内存中存储的起始是补码的二进制,在参与移位时,移动的都是补码。

2.2.1原码、补码与反码

1.正数的原码反码和补码都是相同的;

2.负数

原码:按照一个数的正负,直接写出它的二进制的表现形式,得到的就是原码;

反码:除符号位,原码其他位按位取反;

补码:反码加一;

例如:2的原码是:00000000 00000000 00000000 00000010

                 反码是:00000000 00000000 00000000 00000010

                 补码是:00000000 00000000 00000000 00000010

        -10的原码是:10000000 00000000 00000000 00001010

                 反码是:11111111 11111111 11111111 11110101

                 补码是:11111111 11111111 11111111 11110110

2.2.2左移与右移

1.左移:左边丢弃,右边补0;

            左移一位,得到的值是原来值的2倍。

例如,让10左移一位。

10的补码是:00000000 0000000 00000000 00001010

则补码整体向左移动一位,右边补0,因为只能保留32位,所以左边丢弃一位

左移后,得到的补码是:0000000 00000000 00000000 00010100

它在转换为原码是:00000000 00000000 00000000 00010100

则10左移之后,就变为了20,出现了*2的效果。

2.右移:参考左移

右移分为算数右移和逻辑右移;

算数右移:右边丢弃,左边补原来的符号位;

逻辑右移:右边丢弃,左边直接补0。

我们平常见到的都是算数右移。

其中只有-1的补码是全1,-1右移一位还是-1.

我们看代码:

#include<stdio.h>
int main()
{
	int a = 10;
	int b = a << 1;//左移
	printf("b=%d\n", b);
	int c = a >> 1;//右移
	printf("c=%d\n", c);
	return 0;
}

结果:

 2.3位操作符

位操作符有    &   |    ^

位操作符的操作数必须是整数

&:按位与,俩个操作数对应补码二进制位有0,则为0,俩个同时为1,才为1;

|:按位或,俩个操作数对应的补码二进制位有1则为1,两个同时为0,才为0;

^:按位异或,俩个操作数对应的补码二进制位相同位0,相异为1;

 ^支持交换律,其中  a^a=0;

                                  0^a=a;

                                 a^b^a=a^a^b=b;

看代码:

#include<stdio.h>
int main()
{
	int a = 3;
	int b = -5;
	int c = a & b;//按位与
	int d = a | b;//按位或
	int e = a ^ b;//按位异或
	printf("c=%d\n", c);
	printf("d=%d\n", d);
	printf("e=%d\n", e);
	return 0;
}

结果:

 2.4赋值操作符

赋值操作符可以连续使用;

赋值操作符从右向左赋值;

复合赋值符:+=  -=  /=  *=   %=  <<=   >>=  &=  |=   ^=

例如:a=a/10等价于a/=10;

看代码:

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 0;
	int c = 20;
	a = b = b + c;//连续赋值,这样的代码可读性不高
	printf("a=%d\n", a);
	c = c / 10;
	printf("c=%d\n", c);
	c = 20;//还原c的初始值
	c /= 10;
	printf("c=%d\n", c);
	return 0;
}

结果:

 

2.5单目操作符(双目,三目)

1.单目操作符:!表示非,例如!0,就是不是0,常用在条件语句中,用来判断;

                         -   + 正负号,表正负数;

                         &表取地址,与 &与操作符不同;

                          sizeof,变量类型所占空间的大小,单位是字节;

                          ~表示对一个二进制数按位取反(补码计算);

                       ++     -- 前置与后置加加减减;

                          (类型),表强制类型转换;

                       * 表解引用操作符,指针中会用到。

2.例如  a+b,则 + 就是双目操作符;

3.三目操作符目前我们用到的只有条件操作符一个: exp1?exp2:exp3 ,在2.8中举例子介绍

其中exp1是条件语句,判断这个条件,如果为真,执行exp2,否则执行exp3;

看代码:

#include<stdio.h>
int main()
{
	int a = 10;
	int i = 2;
	while (i != a)//单目操作符!
	{
		i++;
	}
	printf("i=%d\n", i);
	int* b = &a;//&取地址操作符
	printf("b=%p\n", b);
	*b = 20;//解引用操作符
	printf("a=%d\n", a);
	int c = 0;
	int d = ~c;//按位取反~
	printf("d=%d\n", d);
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//sizeof求arr数组在内存中占了多大空间
	int sz = sizeof(arr);
	printf("sz=%d\n", sz);
	int j = 12;
	int k = j++;//后置++,先使用j,j在自加1;若是++j,则j先+1,在使用,--也是相同道理
	printf("k=%d,j=%d\n", k, j);
	int f = (int)3.14;//强制类型转换,让3.14变为整数3
	printf("f=%d\n", f);
	return 0;
}

看结果:

2.6关系操作符

关系操作符有:<    >     >=   <=      ==     !=

== 用来测试两边操作数相等;

!=用来测试不相等。

看代码:

int main()
{
	int n = 5;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		if (i == n)
			printf("%d ", i);
		if (i != n)
			printf("* ");
	}
	printf("\n");
	return 0;
}

                

 2.7逻辑操作符

逻辑操作符有  ||  表示或;

                        &&  表示与。

||:表达式中只要有一个结果为真,就结束计算;

&&:表达式中只要有一个结果为假,就结束计算。

看代码:

int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
	int j = 0, e = 0, f = 2, k = 3, l = 4;
	j = e++ || --f ||k++|| l++;
	printf("e=%d,f=%d,k=%d,l=%d\n", e,f,k,l);
	return 0;
}

结果是:

2.8条件操作符 

条件操作符也叫三目操作符

看代码:

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c=a > b ? a : b;
	printf("c=%d\n", c);
	return 0;
}

2.9逗号表达式

从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

看代码:

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = (a++, b--, a = a * 2, b = a + b);
	printf("c=%d\n", c);
	return 0;
}

结果是:

 2.10下标引用,函数调用和结构成员

1,[ ]:下标引用操作符,是一个双目操作符,它的操作数为一个数组名+一个索引值;

2.():函数调用操作符,例如自定义函数:int max=get_max(a,b);

3.访问结构体成员,用  .  或者—>来访问。


总结完毕啦各位小伙伴们,完结撒花!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮夹馍干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值