【C语言】操作符总结(一)

目录

前言

 一、操作符的分类

 二、算术操作符

三、移位操作符

1、左移操作符

2、右移操作符 

四、位操作符

1、按位与

2、按位与

3、按位异或 

4、位操作符的应用 

 五、赋值操作符

1、基本赋值操作符

2、复合赋值操作符

六、单目操作符

1、单目操作符总括

2、单目操作符详解

1)逻辑反、负值、正值、sizeof操作举例

2)按位取反操作符

 3)前后置++与前后置--

4)取地址操作符与解引用操作符

5)sizeof和数组

七、关系操作符

1、关系操作符总结

八、逻辑操作符

1、逻辑操作符总结

1)逻辑与

2)逻辑或

3)逻辑与和逻辑或在表示范围中的应用

4)一道笔试题

 九、条件操作符

结束语


前言

C语言为我们提供了许多的操作符来实现对数据的处理,比如基本的加减乘除。在这篇文章中我们一起来聊聊C语言的操作符。


 一、操作符的分类

在对每个操作符进行讲解之前我们先对C语言的操作符进行全览。

  • 算数操作符
  • 移位操作符
  • 位操作符
  • 赋值操作符
  • 单目操作符
  • 关系操作符
  • 逻辑操作符
  • 条件操作符
  • 逗号表达式
  • 下标引用、函数调用和结构成员

 二、算术操作符

+      -      *      /      %

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

代码演示:

#include <stdio.h>
int main()
{
	int a = 46;
	int b = 5;
	// "+" 的演示
	int sum = 0;
	sum = a + b;
	printf("sum = %d\n", sum);
	// "-" 的演示
	int sub = 0;
	sub = a - b;
	printf("sub = %d\n", sub);
	// "*" 的演示
	int mul = 0;
	mul = a * b;
	printf("mul = %d\n", mul);
	// "/" 的演示
	int div = 0;
	div = a / b;
	printf("div = %d\n", div);
	// "%" 的使用
	int rem = 0;
	rem = a % b;
	printf("rem = %d\n", rem);

	return 0;
}

三、移位操作符

<<   左移操作符

>>   右移操作符

注:移位操作符的操作数只能是整数

1、左移操作符

移位规则:左边抛弃,右边补0

如下:以num=10时为例,来探究当num左移一位后结果是什么。

 如上图,当根据左移规则后其二进制为:00000000000000000000000000010100,其转换之后就等于20。

2、右移操作符 

移位规则:分为两种:

1)逻辑移位:左边用0填充,右边丢弃
2) 算术移位:左边用原该值的符号位填充,右边丢弃。(正数补0,负数补1)

见下图:

 注意:对于移位运算符,不要移动负数位,这个是标准未定义的,例如:

int num = 10;
num>>-1;  //错误

四、位操作符

位(二进制位)操作符有如下几个:

按位与——&       c=a&b   全1才为1

按位或——|         c=a|b     有1则为1

按位异或—^        c=a^b    相同为0,相异为1

注意:他们的操作数必须是整数

1、按位与

对比两个数的相同二进制位,若都为1则为1,否则为0。演示如下图:

 根据上图结果将c转化为十进制的形式为2,代码测试如下:

2、按位与

对比两个数的相同二进制位,若有1则为1,否则为0。演示如下图:

 根据上图结果将c转化为十进制的形式为7。代码测试如下:

3、按位异或 

对比两个数的相同二进制位,若二进制位相同(即同为0或同为1)则为0,否则为1。演示如下图:

根据上图结果将c转化为十进制的形式为5,代码测试如下:

4、位操作符的应用 

我们来看一个变态的面试题:不能创建临时变量(第三个变量),实现两个数的交换。

代码如下:

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 6;
	printf("交换前:%d %d\n", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交换后:%d %d\n", a, b);

	return 0;
}

图示:


 五、赋值操作符

1、基本赋值操作符

赋值操作符分为基本赋值操作符与复合赋值操作符。基本赋值操作符能够让我们实现变量值的改变,如下:

int a = 0;
a = 8;
a = 19;

最后a的值为19。

2、复合赋值操作符

接下来我们主要讨论复合赋值操作符。

复合赋值操作符主要有以下几种;

+=

-=

*=

/=

%=

>>=

<<=

&=

| =

^=

这些运算符都可以写成复合的效果

代码举例:(因为这些复合赋值运算符的运算原理差不多,故仅举例前几个)

#include <stdio.h>
int main()
{
	int a = 3;
	a += 5;
	printf("%d\n", a);

	a -= 5;
	printf("%d\n", a);

	a <<= 1;
	printf("%d\n", a);

	return 0;
}

六、单目操作符

1、单目操作符总括

!                逻辑反操作
-                负值
+               正值
&               取地址
sizeof        操作数的类型长度(以字节为单位)
~               对一个数的二进制按位取反
--               前置、后置--
++             前置、后置++
*                间接访问操作符(解引用操作符)
(类型)        强制类型转换

2、单目操作符详解

1)逻辑反、负值、正值、sizeof操作举例

代码如下:

#include <stdio.h>
int main()
{
	//逻辑反、负值、正值、取地址、sizeof操作举例
	int a = -10;
	int* p = NULL;
	printf("%d\n", !2);
	printf("%d\n", !0);
	a = -a;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(int));

	return 0;
}

2)按位取反操作符

我们需要先明白一个知识:整数在计算机中是以二进制的补码存放的

a、当整数为正数时:

正数的原码、反码、补码相同,故其存储在内存中的二进制的补码就等于原码,例如正数7在内存中存储的二进制如下:

00000000 00000000 00000000 00000111

b、当整数为负数时:

对于负数的原码、反码、补码之间有转换的公式:

  • 原码取反(1变0,0变1),除了符号位不变外,得到反码
  • 反码加一得到补码

举例一:

#include <stdio.h>
int main()
{
	int a = 7;
	int b = 0;
	b = ~a;
	printf("%d", b); //-8
	return 0;
}

推导过程如下:

 举例二:

#include <stdio.h>
int main()
{
	int a = -2;
	int b = 0;
	b = ~a;
	printf("%d", b);
	return 0;
}

推导过程如下:

 3)前后置++与前后置--

前置++与前置--用法一致,后置++与后置--用法一致,故这里只讲解前置++与后置++。

其用法如下:

前置++:先自加再使用

后置++:先使用后自加

举例:

对于a1来说其先自己加一(即-2 + 1),再对a2进行赋值;而对于b1来说其先对b2进行赋值,再进行自加。

4)取地址操作符与解引用操作符

当我们写一句代码时:int a = 10;其会在内存中为a开辟一个4个字节的内存空间,而每个内存单元都有一个编号,该编号就被称为内存单元的地址。我们可以通过取地址操作符——‘&’来取出变量a的地址,如下代码便可打印a的地址:

有时候我们取出地址后不仅仅是要打印出来而是需要存起来,那么则需要一个指针变量(存放地址的)将其存放。

int *pa = &a;

*代表pa是一个指针变量,而int则代表指向的数据类型为int。

那么今后如果我们先再次找到变量a并对a进行赋值,我们可以通过下面这个方法进行:

*pa = 20;

这里的*号为解引用操作符(或间接访问操作符),通过解引用存放a的地址即可找到变量a。

5)sizeof和数组

#include <stdio.h>
void test1(int arr[])
{
    printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
    printf("%d\n", sizeof(ch));//(4)
}
int main()
{
    int arr[10] = {0};
    char ch[10] = {0};
    printf("%d\n", sizeof(arr));//(1)
    printf("%d\n", sizeof(ch));//(3)
    test1(arr);
    test2(ch);
    return 0;
}

七、关系操作符

1、关系操作符总结

>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”

关系操作符比较简单,直说一下需要注意的点:注意==与=不要写错。


八、逻辑操作符

1、逻辑操作符总结

&&          逻辑与

| |            逻辑或

通俗来说逻辑与和逻辑或表达的意思就是”并且“”或者“的意思

1)逻辑与

例子如下:

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 0;
	if (a && b)
	{
		printf("Hello world!");
	}
	return 0;
}

if语句的判断条件使用了逻辑与,当a并且b同时为真(0为假,非0即为真)时,则打印Hello world!,否则不进入循环。

2)逻辑或

例子如下:

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 0;
	if (a || b)
	{
		printf("Hello world!");
	}
	return 0;
}

还是上面那个例子,只是将逻辑与改为了逻辑或,而这时程序运行后可以打印出Hello world!。逻辑或是当两边有一个为真即为真,故上述判断条件为真。

3)逻辑与和逻辑或在表示范围中的应用

使用代码表示范围时如果我们安装如下方式会报错:

10 <= x <=90;

那么在程序里我们如何正确表示范围呢?这就需要用到逻辑与与逻辑或操作符:

如果我们想表示x∈[10,90]应该这样表示:

x >=10 && x <= 90;

如果我们想表示x∈(-∞,6)或(9,+∞)应该这样表示

x <= 6 || x >= 9;

4)一道笔试题

#include <stdio.h>
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}
//程序输出的结果是什么?

我们一起来分析一下这道题:a++前置++先使用后自加,即a先进行逻辑与运算再自加。我们前面说过&&操作符只要有0即为0。详解见下图:

即上述程序只需要计算a++,这就是短路现象。

运行结果为: 


 九、条件操作符

其基本格式如下:

exp1 ? exp2 : exp3

它是一个三目操作符,它的意思为,先判断exp1语句,若exp1语句为真则执行语句exp2,exp1语句为假则执行语句exp3。简记为:前真后假。

练习一:

if (a > 5)
    b = 3;
else
    b = -3;
//转换成条件表达式,是什么样?

代码为:

a > 5 ? b = 3 : b = -3;

练习二:使用条件表达式实现找两个数中较大数

代码为:

a > b ? a : b;

结束语

这篇文章主要讲解了算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符以及条件操作符几大类。对于操作符的使用想要深入地了解其用法还需代码练习。在【C语言】操作符总结(二)中我们主要来讲解下标引用、函数调用和结构成员、表达式求值的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值