【C语言】C语言成长之路之关于C语言的操作符以及一些表达式的讲解(՞• •՞).

操作符目录

  • 1、算术操作符
  • 2、移位操作符
  • 3、位操作符
  • 4、单目操作符
  • 5、关系操作符
  • 6、赋值操作符
  • 7、逻辑操作符
  • 8、条件操作符(三目操作符)
  • 9、逗号表达式
  • 10、一些关于引用调用的操作符
  • 11、表达式运算的相关机制
    • 1)隐式类型转换
    • 2)表达式中的操作符属性

大家好!今天小狮子我为大家带来了一篇关于我最近在学习的C语言操作符的文章,希望能和大家一起快乐学习、共同成长!૮꒰ ˶• ༝ •˶꒱ა

C语言中的操作符大致可以分为以下的几个模块进行讲解:

【C语言】C语言成长之路之关于C语言的操作符以及一些表达式的讲解(՞• •՞)._第1张图片

1、算术操作符

算数操作符包含+ - * / %
加号 +
减号 -
乘号 *
除号 /
取模 % :即取两整数相除的余数

值得一提的是,浮点数计算乘除其两数必须有一个是浮点型数。

2、移位操作符

首先我们需要明确的一点是移位操作符的操作针对的是二进制形式数字。

( >> ): 向右移动目标数的二进制位
向右移动分为两种:
1、算数位移:右边丢弃,左边补原符号位。(一般情景)
2、逻辑位移:右边丢弃,左边补零。
( << ): 向左移动目标数的二进制位,即左边丢弃,右边补零。

这里为了补充相关知识和更好地让大家理解移位操作,我给大家讲一讲整数的二进制表达

整数的二进制表示形式分为原码反码补码
首先只要是整数,那么在内存中存储的都是二进制补码。

对于正数 原反补码都相同,不需要特别的注意。

对于负数:
原码是直接按正负写出的二进制序列
反码是由原码的符号位不变(第一个二进制位),其他位按位取反得到
补码是反码加一

由此可知,我们在进行原补码转换的时候,补码变到原码可以选择和原码变为补码一样,符号位不变,其他位按位取反后加一得到。
即可以这样表示:
【C语言】C语言成长之路之关于C语言的操作符以及一些表达式的讲解(՞• •՞)._第2张图片

3、位操作符

位操作符也是针对于数的二进制位的表示进行操作:

& 按位与 两个数的位都为1才为1,即有0为0

| 按位或 两个数的位有一个为1则为1,即有1为1

^ 按位异或 相同为0,相异为1
并且按位异或支持交换律: 即a ^ b ^ c == a ^ c ^ b。

4、单目操作符

! (逻辑反操作)
逻辑反操作即将 真 变为 假 ,将 假 变为 真。

-(负号)

+(正号)

&(取地址)

sizeof(计算变量或类型所占空间大小,单位位字节)
对于sizeof()
有下面的例题:

...
int a = 0;
printf("%d",sizeof(a));
printf("%d",sizeof(int));
printf("%d",sizeof a);
printf("%d",sizeof int);
...
//请问上面的四个打印中哪些是对的?
//答:第四个是错的,其他的是对的

那么我们可以养成 在sizeof后面将要求大小的东西用括号括起来 的良好代码风格。
关于sizeof还有一题进阶:
【C语言】C语言成长之路之关于C语言的操作符以及一些表达式的讲解(՞• •՞)._第3张图片
求以上的输出值,大家可以思考一下这个问题,如果可以的话,希望你们能将自己的想法写在评论区中◕‿◕(提示:sizeof的返回值是无符号整型)

ps:由于在判断类型大小时,我们只需要知道判断类型的对象是谁,该对象的类型大小,所以sizeof()括号中放的表达式是不参与总的运算的,只会判断结果的字节大小。

从这我们可以看出系统在处理操作时会遵循能省则省的原则,如果(根据操作符的结合性)前面的操作已经能够得出结果,那么后面的操作就不会进行,或者得到了需要的属性就不会计算别的属性。

~(对一个数的二进制按位取反)

– 前置,后置–
++ 前置,后置++
注意,前置操作即为先操作后使用,后置操作即为先使用后操作

(类型) 强制转换类型
强制转换类型不建议经常使用,毕竟古话说得好:“强扭的瓜不甜”(笑)
值得注意的是,强制类型转换是一个暂时性的转换,只在当前表达式成立。

*解引用操作符(间接引用操作符)
与指针结合使用,用于访问指针指向的元素。

5、关系操作符

!= (不等号)

== (判断相等)

关系运算符的运算即判断式子两边的值是否符合操作符含义,符合即返回真 1 ,不符合即返回假 0。

值得注意的是,在判断多个表达式相等时,我们需要在判断的表达式之间加上&&以表示这几者的并列,而不能习惯性的写上 A == B == C。(我本人自己就这样错过(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ ))

6、赋值操作符

=
+=
-=
*=
=
……
(复合赋值符)
即给需要的变量进行赋值,符合赋值符将=与算数运算符结合,具体应用是这样的:
a += b 等价于 a = a + b。

7、逻辑操作符

&& 逻辑与(两者为真则为真,有一者为假则为假)并且
|| 逻辑或(有一者为真则为真)或者

逻辑操作符的返回值为1(真)、0(假)

逻辑操作符如果与运算结合就要遵循上述sizeof那里标黑的系统规律,即可以判断出返回值之后不必要不计算(即可以控制求值顺序)。

8、条件操作符(三目操作符)

exp1 ? exp2 : exp3;

ps:exp1对则计算exp2并返回表达式的值,反之则exp3被执行。

9、逗号表达式

exp1,exp2,exp3,…ezpn

逗号表达式会从左到右依次执行,且逗号表达式的返回值是最后一个表达式的值。

10、一些关于引用调用的操作符

[下标]
()
.
->

[下标]引用、访问下标指向的元素
() 函数的调用 printf()

引出结构体的成员:
. 的用法:结构体变量.成员
-> 的用法:结构体指针->成员

11、表达式运算的相关机制

1)隐式类型转换

隐式类型转换有 整型提升算术转换 这两种类型:

整型提升
注意C的整形算数运算总是至少以缺省整型类型的精度来进行的。

为了获得这个精度,表达式运算时,如果有达不到整形 int 大小的变量在运算过程中,就会发生整形提升。

ps:注意运算时储存的是补码,而打印结果时需要转换成原码进行打印(主要是注意负数计算)
经典例题:

将 char 类型的 3 和 char类型的 127 相加存放在一个char类型的变量里,并将其打印成整形:

int main()
{
	//char --> signed char
	char a = 3;
	//截断
	//00000000000000000000000000000011
	//00000011 - a截断后的结果
	//
	char b = 127;
	//00000000000000000000000001111111
	//01111111 - b

	char c = a + b;
	//00000011
	//01111111
	//整型提升
	//00000000000000000000000000000011
	//00000000000000000000000001111111
	//00000000000000000000000010000010
	//10000010 - c截断后符号位变为了1
	printf("%d\n", c);
	//%d 是打印十进制的整数,这时要注意整型提升
	//11111111111111111111111110000010 - 补码
	//11111111111111111111111110000001
	//10000000000000000000000001111110 - 原码
	//-126
	return 0;
}

输出的结果:
输出的结果

算术转换
当操作符的各个操作数属于不同的类型,那系统就会将两个数的类型统一后进行运算,转换的规律由低到高正如下图。
【C语言】C语言成长之路之关于C语言的操作符以及一些表达式的讲解(՞• •՞)._第4张图片
这里推荐一下CSDN里一位友友的文章大家可以看一看ya~ C语言算术转换与整型提升(՞•Ꙫ•՞)

2)表达式中的操作符属性

操作符属性
1)操作符的优先级

2)操作符的结合性

3)是否控制求值顺序
这里也偷个小懒,转一下别的友友的博客ya~操作符属性,Ծ‸Ծ,

这次的文章我们一起学习了C语言基础中的操作符和表达式相关的知识,那么今天的学习就到这里为止啦,希望大家阅读我的文章之后可以得到一些收获呀ꉂꉂ꒰•̤▿•̤*ૢ꒱

如果大家我的文章有什么意见和想法可以在评论区中发表出来呦~欢迎大家的讨论!

最后,祝大家能够快乐学习,天天向上!

你可能感兴趣的:(【C语言】C语言成长之路,c语言,c++)