C语言初阶第四篇:讲一讲操作符,史上最全C语言操作符介绍(全部的操作符解析)

雄关漫道真如铁,而今迈步从头越
老铁们,咱们上一篇文章把C语言语句的知识点给过了一遍,今天我们就从单目操作符与双目操作符和三目操作符来说一说操作符,咱们开始吧!

一、单目操作符

单目运算符就是只有一个操作数

单目运算符含义
!就是取反的意思
-负值
+正值
&取地址
sizeof操作数的类型长度(以字节为单位)
~对一个数的二进制进行取反
- -前置、后置–
++前置、后置++
*间接访问操作符(常见于指针解引用)
(类型)强制类型转换

我们现在具体看一下这些操作符(前面的几个比较好理解,我们从后面的挑几个说):

前置++和后置++
有什么区别?前置++就是先自增一,再使用,后置++就是先使用,再自增一。
前置- - 和后置- -
一样的,在前面就先减再用,在后面就先用再减。
但是注意,像这种错误的代码没必要研究,不同的编译器可能结果不一样:

	int a = 1;
	int b = (++a) + (++a) + (++a);//2+3+4
	printf("%d\n", b);

关于自增和自减,我们只需要明白什么时候增,什么时候减就好了。

至于解引用操作符,就可以理解为取出地址上的值,进行使用,一般用于指针。更详细的说明,我们会在指针的文章里深入探讨

这些操作符,称为单目是因为只对一个数据进行操作,所以,不要记混了双目操作符和单目操作符的概念呀!

二、双目操作符

1、算术运算符

运算符含义
*将运算符左右两边的数相乘
/运算符左边的数除右边的数
%进行取余
+相加
-相减

算数运算符的运算次序就是我们小学到现在一直使用的次序。

2、关系运算符

C语言提供6种关系运算符,如表所示:

运算符名称功能
<小于a小于b时返回真;否则返回假
<=小于等于a小于等于b时返回真;否则返回假
>大于a大于b时返回真;否则返回假
>=大于等于a大于等于b时返回真;否则返回假
==等于a等于b时返回真;否则返回假
!=不等于a不等于b时返回真;否则返回假

(注意加黑的地方,不要写错表达式了,特别是 赋值表达式 一个 = 和 等于 两个 = =)

这里注意一点:
关系运算符的值只能是0或1。
关系运算符的值为真时,结果值都为1。
关系运算符的值为假时,结果值都为0。

前4种关系运算符的优先级别相同,后两种也相同。前四种高于后两种。
关系运算符的优先级低于算术运算符。
关系运算符的优先级高于赋值运算符。

3、逻辑操作符

逻辑操作符只有三个,一个是与 ” && “ 一个是或 “ || ”。
另一个是单目运算符里的非 “ !”

&& 的判断顺序是从左至右,如果左边判断为假,那么右边不判断。
|| 判断顺序不区分,两边都要判断,即使左边为假,也继续判断右边的真假。

三、三目操作符–条件操作符

**exp1 ? exp2 : exp3 **

(exp就是expression,即表达式)
这也是C语言里唯一一个三目操作符。

意思是:如果表达式1的结果为真,就计算表达式2,否则计算表达式3 。
例如:

int main()
{
	int a = 4;
	int b = 3;
	int c = 5;
	int d = 6;
	int e;
	e = a > b ? c > d ? d > a:c:b;
	printf("%d\n", e);//结果是5
	return 0;
}

为什么结果是5?我们首先对式子进行切割:
e = (a > b ) ? ( c > d ? d > a : c) : b ;
这是第一步切割,我们发现应该计算第二个表达式:
(c > d ) ? ( d > a ) : c
这一步我们发现c>d为假,所以取第三个表达式,就是c,那么最终结果也就是c。

将这个表达式作为一个整体,就不会出错了。

四、逗号运算符

(exp1,exp2,exp3,exp4…)

这个就是逗号表达式了,注意,里面同样的,可以有很多表达式。

逗号表达式的特点:表达式从左向右依次计算,是最后一个表达式的结果

int main()
{
	int a = 3;
	int b = 20;
	int c = 0;
	int d;
	d = (a -= 3, b += a, c = a - b, b = a - 4);
	//计算下来 a = 0, b = 20 , c = -20 , b = -4
	printf("%d\n", d);
	//逗号表达式的特点:表达式从左向右依次计算,是最后一个表达式的结果
	return 0;
}

所以这段代码的最终结果也就是-4。

五、初等运算符–下标引用,函数调用和结构体成员

()这个是函数调用使用的运算符

int main(){......}

[]这个是下标引用运算符,一般用于数组的操作

int arr[10] = { 0 };
int b = arr[5];
printf("%d\n",b);

[ . ]是结构体成员访问:

#include<stdio.h>
typedef struct StudentInfo {
	int age;
	char *name;
	char *ID;
}StudentInfo;
StudentInfo s;
int main()
{
	s.age = 20;
	s.name = "xiaohong";
	s.ID = "98765432112345";
	printf("%d %s %s\n", s.age, s.name, s.ID);	
	return 0;
}

[ -> ]是结构体指针成员的访问:

#include<stdio.h>
#include<string.h>
typedef struct StudentInfo {
	int age;
	char *name;
	char *ID;
}StudentInfo;
StudentInfo s;
int main()
{
	StudentInfo* ps = &s;
	ps->age = 19;
	ps->name = "xiaoming";
	ps->ID = "12345678901234";
	printf("%d %s %s\n",ps->age,ps->name,ps->ID);
	return 0;
}

== 至于 [ -> ]和 [ . ] 这两个操作符的更加详细的说明,我们会在结构体的文章里说明。==

六、位运算符

位运算就是基于二进制的运算,一般用的不是很多(笔者有一篇哈夫曼压缩的文章,用到了位运算)
按位与运算符【&】
按位异或运算符【^】
按位或运算符【|】
左移动运算符【<<】
右移动运算符【>>】
我们用实际代码和来说明这些运算符的作用:

int main()
{
	int a = 1;
	int b = 4;
	printf("%d\n", a & b);//0
	printf("%d\n", a ^ b);//5
	printf("%d\n", a | b);//5
	int c = 2;
	printf("%d\n", c << 2);//8
	printf("%d\n", c >> 2);//0
	return 0;
}

这些代码后面已经跟上了结果,现在我们来分析一下结果:
由于位运算基于二进制,所以我们先看看a,b,c的二进制都是多少:
a – 00000001
b – 00000100
c – 00000010
现在我们来看一看a&b是什么,
a&b,也就是一个新的二进制:00000000,这个二进制数的值是0
之后是a^b,异或,就是两个不一样就取1,两个一样就取0(一男一女生孩子)
a^b,新的二进制是:00000101,这个二进制数的值是5
之后是“按位或”,”按位或“是能取啥就取啥,有1就一定取:
a|b,新的二进制是: 00000101,值也是5(注意区分它和异或的区别)

然后就到了位移运算,这个就相对简单一点,
c << 2,数字左移2位,二进制就变成了 00001000,也就是8,
c >> 2,数字右移2位,二进制就变成了 00000000,也就是0。

今天的分享也就到这里了,希望带来了帮助!也祝大家小年快乐!
至此,我们就把C语言中所有能见到的运算符给说了一遍,欢迎指正批评哦!

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值