零基础学C语言——运算符

这是一个C语言系列文章,如果是初学者的话,建议先行阅读之前的文章。笔者也会按照章节顺序发布。

上一篇的最后,我们在说到强制类型转换时,给出了一个例子:

c 复制代码
int a = 5.0 / 2;

这里其实涉及到了运算符,即 /

在编程语言的世界里并不是只有加减乘除的四则运算,还包含了很多其他运算,参见下图:

优先级

举个简单的例子:

1 + 2 * 3 = 7 而不会计算成9

这里其实就是因为在我们小学数学中,乘除运算的优先级高于加减运算,因此优先计算乘除,然后计算加减。

同理,运算符表中,优先级从上到下依次递减,换言之,越靠上的运算符,优先级越高。例如:

(1 + 2) * 3 = 9 而不会计算成7

因为1+2在括号中,而小括号在C语言中也是一种运算符,且其优先级最高。

结合方向

有的读者会问,同级别的运算符如何计算呢?这就要看运算符结合方向了。例如:

2 * 10 / 4 % 2

其中%为求余运算,即计算除法后的余数,也称其为取模运算。上面这个式子的结果是1。如何计算呢?

由于乘、除、求余三个运算都是同级别,且他们的结合方向都是从左到右的,因此我们从左向右依次计算即可。

X目运算符

下面我们简单介绍一下何为:单目运算符、双目运算符、三目运算符。

其中,双目运算符是最容易被理解的,例如加法:

1 + 2

在加号前后个需要一个值方可使用加法,即加法运算需要两个数值,数值的个数也就是目数,换句话说,加法就是双目运算符。

那么,单目运算符就比较容易理解了,即运算符只需要一个数值即可完成运算,例如:

-1

其中-为负号运算符,它是单目运算符,需要一个数值来进行运算,在这个例子中,这个数值就是1。而运算符配合运算所需要的数据计算后的结果是-1。

而三目运算符,就是说运算需要三个数据来完成,后面我们会对每一个运算符举出一个例子。

各个运算符举例

下面展示各种运算符的使用方式,很多运算符初学者可能不理解其含义,暂且不要纠结,后面的文章还会涉及。

  • []数组下标
c 复制代码
int a = arr[0]; //从数组arr中取其第一个元素(下标从0开始)
  • ()圆括号
c 复制代码
int a = (1 + 2) * 3; //a = 9
  • . 成员选择
c 复制代码
int a = person.name; //从person结构体对象中取name成员的值
  • -> 成员选择(指针)
c 复制代码
int a = person->name; //从person结构体指针所指向的对象中取name成员的值
  • - 负号运算符
c 复制代码
int a = -1;
  • (类型) 强制类型转换
c 复制代码
int a = (int)5.2; //a = 5
  • ++ 自增运算符
c 复制代码
int a = 1;
a++; // 变量a的值为2,但是a++表达式的值为1,表达式将在后面介绍,初学者可以先不纠结
++a; // 变量a的值为2,且++a表达式的值为2
  • -- 自减运算符
c 复制代码
int a = 1;
a--; // a的值为0,但a--表达式的值为1
--a;// a的值为0,且--a表达是的值为0
  • * 取值运算符

    int a = 0, *p = &a;
    *p = 1; //向指针p所指向的内存地址中写入整数1

  • & 取地址运算符

c 复制代码
int a = 0;
int *p = &a; //指针p等于变量a的内存地址
  • ! 逻辑非运算符
c 复制代码
int a = !1; //a = 0,任何非0值的!运算后的值都是0
  • ~ 按位取反运算符
c 复制代码
unsigned int a = ~0; //a = 0xFFFFFFFF 无符号整型占4字节,即32位,~对每一位取反,0的每一位都是0,取反后每一位都是1
  • sizeof 长度运算符
c 复制代码
int a = sizeof(int); //a = 4,sizeof将计算给定的类型或者对象所占的字节数
int b = sizeof(a); //b = 4,因为a是整型
  • /
c 复制代码
int a = 10 / 2;
  • *
c 复制代码
int a = 3 * 2;
  • % 余数(取模)
c 复制代码
int a = 9 % 2
  • +
c 复制代码
int a = 1 + 2
  • -
c 复制代码
int a = 10 - 9
  • << 左移
c 复制代码
int a = 1 << 1; //a = 2, 1默认为有符号整型,即其低字节比特形式为 0000 0001,整个32位向左移1位,低字节比特变为 0000 0010,移入部分默认补0
  • >> 右移
c 复制代码
int a = 1 >> 1; //a = 0, 1默认为有符号整型,即其低字节比特形式为 0000 0001,整个32位向右移1位,低字节比特变为 0000 0000,移入部分默认补0
  • > 大于
c 复制代码
int a = 1 > 2; //a = 0, 1 > 2是一个真值逻辑判断,很显然这个条件不成立,不成立时值为0
  • >= 大于等于
c 复制代码
int a = 1 >= 2; //a = 0, 1 >= 2是一个真值逻辑判断,很显然这个条件不成立,不成立时值为0
  • < 小于
c 复制代码
int a = 2 < 1; //a = 0, 2 < 1是一个真值逻辑判断,很显然这个条件不成立,不成立时值为0
  • <= 小于等于
c 复制代码
int a = 2 <= 1; //a = 0, 2 <= 1是一个真值逻辑判断,很显然这个条件不成立,不成立时值为0
  • == 等于
c 复制代码
int a = 2 == 1; //a = 0, 2 == 1是一个真值逻辑判断,很显然1不等于2,不成立时值为0
  • != 不等于
c 复制代码
int a = 2 != 1; //a = 1, 2 == 1是一个真值逻辑判断,很显然1不等于2条件成立,成立时值为1
  • & 按位与
c 复制代码
int a = 3 & 2; //a = 2, 3的低字节二进制为0000 0011,2的低字节二进制为0000 0010,与运算只有对应位都为1时结果为1,其余为0,所以低字节与运算结果位 0000 0010
  • ^ 按位异或
c 复制代码
int a = 3 ^ 2; //a = 1, 异或运算是两数对应位数值不相同则运算后该位值为1,相同为0
  • | 按位或
c 复制代码
int a = 1 | 2; //a = 3,或运算是两数对应位数值只要有一个为1则运算后该位值为1,都为0则为0
  • && 逻辑与
c 复制代码
int a = 0 && 1; //a = 0, &&前后均为真值判断,且当左侧真值判断为假时,不再进行右侧真值判断,0在真值判断时含义为假,而假对应的数值为0,因此a = 0
  • || 逻辑或
c 复制代码
int a = 0, b = 2;
int c = a || b; //c = 1, ||前后均为真值判断,且当左侧真值判断为真时,不再进行右侧真值判断,2在真值判断时含义为真,而真对应的数值为1,因此c = 1而不是2
  • ?: 条件运算符
c 复制代码
int a = 1 > 2 ? -1 : 3; //a = 3
//条件运算符的左右时先进行?左侧的真值判断,如果为真则计算?与:之间的值,如果为假则计算:右侧的值
int b = 1 > 2 ? 3 - 1 : 2 + 6; //b = 8
  • = 赋值运算符
c 复制代码
int a = 1; //其中的=就是赋值运算符
  • /= 除后赋值运算符
c 复制代码
int a = 10;
a /= 2; //a = 5, 运算符等价于 a = a / 2,原本a=10,除以2后等于5
  • *= 乘后赋值
c 复制代码
int a = 2;
a *= 3; //a = 6, 等价于a = a * 3
  • %= 取模后赋值
c 复制代码
int a = 9;
a %= 2; //a = 1, 等价于a = a % 2
  • += 加后赋值
c 复制代码
int a = 1;
a += 1; //a = 2, 等价于 a = a + 1
  • -= 减后赋值
c 复制代码
int a = 5;
a -= 2; //a = 3, 等价于 a = a - 2
  • <<= 左移后赋值
c 复制代码
int a = 1;
a <<= 1; //a = 2, 等价于 a = a << 1
  • >>= 右移后赋值
c 复制代码
int a = 3;
a >>= 1; //a = 1, 等价于 a = a >> 1
  • &= 按位与后赋值
c 复制代码
int a = 3;
a &= 1; //a = 1, 等价于 a = a & 1
  • ^= 按位异或后赋值
c 复制代码
int a = 3;
a ^= 1; //a = 2, 等价于 a = a ^ 1
  • |= 按位或后赋值
c 复制代码
int a = 1
a |= 2; //a = 3, 等价于 a = a | 2
  • , 逗号运算符
c 复制代码
int a = (1,2,3); //a = 3, 逗号运算符的值是最右侧逗号右侧的值
//这里之所以加(),是因为赋值表达式优先级高于逗号表达式,会导致a=1作为逗号运算符的一部分
//我们将在表达式的文章中再次介绍这个运算符

喜欢的读者可以关注码哥,也可以在下方留言评论,如果有不清楚的地方也可以私信码哥,我会第一时间回复。

感谢阅读!

相关推荐
有书Show43 分钟前
文章发稿平台哪个好用?哪个类型的媒体平台比较好过稿?
经验分享·媒体
小奥超人1 小时前
PDF无法打印!怎么办?
windows·经验分享·pdf·办公技巧·pdf加密解密
AAA.建材批发刘哥2 小时前
Linux快速入门-Linux文件系统管理
linux·运维·服务器·c语言·学习方法
AC使者2 小时前
5820 丰富的周日生活
数据结构·算法
cwj&xyp3 小时前
Python(二)str、list、tuple、dict、set
前端·python·算法
LKAI.3 小时前
搭建Elastic search群集
linux·运维·elasticsearch·搜索引擎
Kisorge3 小时前
【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数
c语言·开发语言
机智的叉烧3 小时前
前沿重器[57] | sigir24:大模型推荐系统的文本ID对齐学习
人工智能·学习·机器学习
gywl4 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
量子-Alex4 小时前
【多模态聚类】用于无标记视频自监督学习的多模态聚类网络
学习·音视频·聚类