栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【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 
int main()
{
	int a = 46;
	int b = 5;
	// "+" 的演示
	int sum = 0;
	sum = a + b;
	printf("sum = %dn", sum);
	// "-" 的演示
	int sub = 0;
	sub = a - b;
	printf("sub = %dn", sub);
	// "*" 的演示
	int mul = 0;
	mul = a * b;
	printf("mul = %dn", mul);
	// "/" 的演示
	int div = 0;
	div = a / b;
	printf("div = %dn", div);
	// "%" 的使用
	int rem = 0;
	rem = a % b;
	printf("rem = %dn", 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 
int main()
{
	int a = 3;
	int b = 6;
	printf("交换前:%d %dn", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交换后:%d %dn", a, b);

	return 0;
}

图示:


 五、赋值操作符

1、基本赋值操作符

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

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

最后a的值为19。

2、复合赋值操作符

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

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

+=

-=

*=

/=

%=

>>=

<<=

&=

| =

^=

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

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

#include 
int main()
{
	int a = 3;
	a += 5;
	printf("%dn", a);

	a -= 5;
	printf("%dn", a);

	a <<= 1;
	printf("%dn", a);

	return 0;
}

六、单目操作符

1、单目操作符总括

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

2、单目操作符详解

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

代码如下:

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

	return 0;
}

2)按位取反操作符

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

a、当整数为正数时:

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

00000000 00000000 00000000 00000111

b、当整数为负数时:

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

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

举例一:

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

推导过程如下:

 举例二:

#include 
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 
void test1(int arr[])
{
    printf("%dn", sizeof(arr));//(2)
}
void test2(char ch[])
{
    printf("%dn", sizeof(ch));//(4)
}
int main()
{
    int arr[10] = {0};
    char ch[10] = {0};
    printf("%dn", sizeof(arr));//(1)
    printf("%dn", sizeof(ch));//(3)
    test1(arr);
    test2(ch);
    return 0;
}

七、关系操作符

1、关系操作符总结

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

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


八、逻辑操作符

1、逻辑操作符总结

&&          逻辑与

| |            逻辑或

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

1)逻辑与

例子如下:

#include 
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 
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 
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %dn b = %dn c = %dnd = %dn", 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语言】操作符总结(二)中我们主要来讲解下标引用、函数调用和结构成员、表达式求值的问题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030500.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号