【C语言】操作符详解

article/2025/9/13 20:50:58

文章目录

  • 前言
  • 一、操作符分类
  • 二、用法详述
    • 1.算数操作符
    • 2.移位操作符
      • 2.1左移操作符
      • 2.2右移操作符
      • 2.3==警告==:
    • 3.位操作符
      • 3.1 ==&== 按位与
      • 3.2 ==|== 按位或
      • 3.3 ==\^== 按位异或
    • 4.赋值操作符
    • 5.单目操作符
      • 5.1逻辑反操作符 ==!==
      • 5.2 自增、自减操作符 ==++、--==
      • 5.3 按位取反 ==~==
    • 6.关系操作符
    • 7.逻辑操作符
    • 8.条件操作符
    • 9.逗号表达式
    • 10.下标引用、函数调用和结构成员
  • 三、表达式求值
    • 1.隐式类型转换
    • 2.算术转换
    • 3.操作符的属性
      • 3.1==操作符优先级==
  • 总结


前言

操作符的掌握是学习C语言的重要基础,操作符的用法至关重要,今天就带大家了解一下操作符的详细用法。


一、操作符分类

操作符符号
算数操作符‘+’ 、 ‘-’ 、 ‘*’ 、 ‘/’ 、 ‘%’
移位操作符<< (左移操作符) >> (右移操作符)
位操作符‘&’、‘|’、‘^’
赋值操作符=
单目操作符‘!’、‘-’、‘+’、‘&’、‘~’、‘- -’、‘*’、‘++’
关系操作符‘>’、‘<’、‘<=’、‘>=’、‘!=’、‘==’
逻辑操作符’&&‘、‘||’
条件操作符exp1 ? exp2 : exp3
逗号操作符exp1, exp2, exp3, …expn
下标引用、函数调用和结构成员‘[ ]’、‘()’、‘.’、‘->’

二、用法详述

1.算数操作符

由于算术操作符比较简单,只简要介绍下注意点

1.除了 % 操作符之外,其他几个操作符均可以作用于整数和浮点数。
2.对于 / 操作符,如果两个操作数都为整数,执行整数除法,而只要有浮点数执行的就是浮点数除法。
在这里插入图片描述
在这里插入图片描述
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

2.移位操作符

移位操作符的操作数只能是整数,并且移位操作符都是对二进制位进行操作
计算机内储存数值均采用补码

2.1左移操作符

左移操作符规则比较简单,即左边抛弃,右边补0
在这里插入图片描述

2.2右移操作符

右移运算分为两种

1.逻辑移位:左边用0填充,右边丢弃。
2.算术移位:左边用原该值的符号位填充,右边丢弃。

在这里插入图片描述

2.3警告

对于移位操作符,不要移动负数位,这个是C语言标准中没有定义的。
例如:

int num = 10;
num >> -1;//这样是错误的

3.位操作符

规则很简单,还是对二进制位进行操作,不过操作数必须为整数

3.1 & 按位与

例如:

000000101
000010100    //进行按位与
000000100    //只有两个都为1,按位与才为1,否则都为0

给一道利用按位与的经典题目:

#include <stdio.h>
//统计一个数的二进制中1的个数
int main()
{int num = 0;scanf("%d", &num);int count = 0;while (num){num = num & (num - 1);//每次操作都会把最右边的1变为0count++;              //这样直到都为0的时候循环才结束}printf("%d\n", count);return 0;
}

还有一个小技巧就是一个数按位与1,能得到其二进制的最后一位数,这样就能通过右移操作+按位与来得到一个数的所有二进制位。

for (i = 0; i < 32; i++){printf("%d", (num >> i) & 1);//假设一位数是用32个二进制位表示的话}

3.2 | 按位或

两个数按位或只要有一个二进制位为1就是1,只有两个均为0才是0

000000101
000010100 
000010101 //按位或

3.3 ^ 按位异或

规则简单总结来说就是:相同为0,相异为1

000000101
000010100 
000010001   //按位异或

给一道按位异或和按位与相结合的题目:

#include <stdio.h>
//求两个数二进制中不同位的个数
int main()
{int a = 0, b = 0;int count = 0;scanf("%d %d", &a, &b);int ret = a ^ b;  //利用按位异或的特点,将不一样的二进制全部变成1while (ret){ret = ret & (ret - 1);//这样用刚刚讲过的技巧来统计1的个数count++;              //这样便巧妙求出两个数二进制位不同的个数}printf("%d\n", count);return 0;
}

4.赋值操作符

赋值操作符很简单,没啥要点,但要记住的一点就是赋值操作符的左边必须得是变量,不能是常量,表达式。其结合顺序是从右向左

5.单目操作符

所谓单目操作符就是只有一个操作数的操作符,大多数很简单,这里举出一些有代表性的操作符。

5.1逻辑反操作符 !

//只要不是0的数,进行逻辑反操作之后结果都是0
int a = 5;
printf("%d\n", !a);//打印的结果就是0
//0对其进行罗基反操作得到的结果就是1
int a = 0;
printf("%d\n", !a);//结果为1

5.2 自增、自减操作符 ++、–

这里需要注意的是前置和后置的区别
后置操作符是先使用变量的值再进行自增自减操作
前置操作符是先对变量进行自增自减操作,再使用变量的值

在这里插入图片描述
在这里插入图片描述

5.3 按位取反 ~

一言以蔽之,就是对每个二进制位进行取反,0变为1,1变为0

6.关系操作符

没什么需要关注的,大于等于和小于等于需要注意等号的位置,正好就是中文读法的顺序。
还有在比较相等的时候,==操作符和=操作符这两个是不一样的,前者是判断两个表达式是否相同,后者是进行赋值操作。

7.逻辑操作符

逻辑操作符比较简单,举几个例子就明白了。

1&&2---->1
1&&0---->0  //两个操作数有一个为0,表达式结果就是0,只有两个都是真,//结果才是1
1||2---->1
1||0---->1  //两个操作数只有要有一个1,结果就为1,只有两个都是0,//结果才为0

需要注意的是,当使用逻辑或时,只要左边的表达式为真,就不会再判断右边的表达式。
在这里插入图片描述

8.条件操作符

exp1 ? exp2 : exp3
简单来说就是exp1为真,就执行exp2,否则就执行exp3.

int a = 10;if (a > 5){b = 3;}else{b = -3;}//上面的代码可以浓缩成下面者一句代码a > 5 ? b = 3 : b = -3;

9.逗号表达式

逗号表达式就是用逗号隔开的多个表达式
逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果

在这里插入图片描述

10.下标引用、函数调用和结构成员

这些操作符都涉及指针和结构体的时候会用到,在那里会重点用到,在这里就不再给大家讲述这些操作符了。

三、表达式求值

1.隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

负数整型提升,高位补充符号位,即1
正数整型提升,高位同样补充符号位,为0
无符号整形提升,高位补0

int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
//c只要参与表达式运算,就会发生整形提升,表达式 +c ,
//就会发生提升,所以 sizeof(+c) 是4个字节。
//表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,
//但是 sizeof(c) ,就是1个字节。

2.算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类
型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

long double
double
float
unsigned long int
long int
unsigned int
int
//如果某个操作数的类型在上面这个列表中排名较低,
//那么首先要转换为另外一个操作数的类型后执行运算,
//要注意算术转换由高到低会存在精确缺失问题。

3.操作符的属性

复杂表达式的求值有三个影响的因素。

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序。
    两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

3.1操作符优先级

在这里插入图片描述

(图片截自百度百科)
不过,需要注意的是即使知道,操作符的优先级、求值顺序和结合性也不一定能唯一确定表达式的值,但此时代码一定是存在问题的,要具体问题具体分析。

总结

看完本文即能比较详细了解各种操作符的用法。
码字不易,如果觉得不错的话,记得点赞,收藏和关注哦,您的关注就是我更新的最大动力。


http://chatgpt.dhexx.cn/article/Z89CNuOc.shtml

相关文章

集合类型的操作符(共10个)

注意&#xff1a;本次所有的举例均为s{1,2,3,4,5},t{4,5,6,7} 1.S - T 或 S.difference(T): 返回一个新集合&#xff0c;包括在集合S中但不在集合T中的元素 eg:2.S - T或S.difference_update(T): 更新集合S&#xff0c;包括在集合S,包括在集合S中但不在集合T中的元素。 eg: 3.S…

c++ 操作符大全-算术操作符、关系操作符、逻辑操作符、位操作符、自增自减操作符、赋值操作符、条件操作符、逗号操作符、操作符优先级

文章目录 操作符1、算术操作符2、关系操作符3、逻辑操作符4、位操作符5、自增自减操作符6、赋值操作符7、条件操作符8、逗号操作符9、操作符优先级 操作符 计算机程序可以看作一串运算式&#xff0c;可以对各种运算类型进行运算。这种运算不仅仅是代数上的加减乘除&#xff0c…

操作符详解—c语言

目录 1. 操作符分类&#xff1a; 2. 算术操作符 3. 移位操作符 3.1 左移操作符 3.2 右移操作符 4. 位操作符 5. 赋值操作符 6. 单目操作符 6.1 单目操作符介绍 7. 关系操作符 8. 逻辑操作符 9. 条件操作符 10. 逗号表达式 11. 下标引用、函数调用和结构成…

【SV】流操作符

流操作符 作用 把其后的数据打包成一个比特流 >>和<< 操作符>>把数据从左向右变成流&#xff0c;<<则把数据从右到左变成流。 注意&#xff1a; 可以指定一个片段宽度&#xff0c;把源数据按照这个宽度分段以后再转变成流。 例如 h{>>1{j}} 或…

C语言操作符总结

目录 1.算术操作符 2.移位操作符 3.位操作符 4.赋值操作符 5.单目操作符 6.关系操作符 7.逻辑操作符 8.条件操作符 9.逗号表达式 10.下标引用、函数调用和结构成员 C语言中操作符总共有10种&#xff0c;分别是&#xff1a; 算术操作符&#xff0c;移位操作符&#xf…

C语言操作符汇总

目录 一、算术操作符 二、移位操作符 三、位操作符 四、赋值操作符 五、单目操作符 六、关系操作符 七、逻辑操作符 八、条件操作符 九、逗号表达式 十、下标引用、函数调用和结构成员 C语言的操作符分为以下10种&#xff1a; 算术操作符移位操作符位操作符赋值操作…

python 操作符

1.注释: 三种 # " " " 2.输入输出 输出:print() 输入input() 3.变量 保存数据的,就是一个容器 变量名 值 修改变量的值:变量名 新值 *变量的命名: a-z A-Z 0-9 _ 注意:不能以数字开头,就以字母开头就好,_有特殊的作用,不能使用关键字 关键字: …

VHDL的操作符

一、赋值操作符 作用在于更新被赋值数据对象的值&#xff0c;数据对象主要是指信号和变量。VHDL赋值操作符也有信号赋值与变量赋值的区别&#xff0c;分别是&#xff1a; ”<"是信号赋值操作符&#xff0c;可以对标量型的信号类型对象或是矢量型信号类型对象整体赋值…

操作符详解(C语言)

目录 算术操作符(运算符)&#xff1a; - * / % 1、/ &#xff08;除法&#xff09; 2、% (取模、取余&#xff09; 移位操作符&#xff1a; << (左移&#xff09; >>(右移&#xff09; 注意&#xff1a;移位操作符的操作数只能是整数 1、<< …

Java中的类变量和实例变量的区别

类变量也叫静态变量&#xff0c;也就是在变量前加了static 的变量&#xff1b; 实例变量也叫对象变量&#xff0c;即没加static 的变量&#xff1b; 区别在于&#xff1a; 类变量和实例变量的区别在于&#xff1a;类变量是所有对象共有&#xff0c;其中一个对象将它值改变&…

python面向对象类变量的调用和改变

python中对类变量的访问 在python中对类变量的访问有两种方式 方式一&#xff1a;使用类名.变量名 方法二&#xff1a;使用对象名. 变量名 注意&#xff1a;但在使用方法二时&#xff0c;需要注意&#xff0c;在当前对象中是否具有与类变量同名的实例变量&#xff0c;若没有&am…

如何理解Java的类变量、成员变量、常量、类属性、实例属性、字段(field)、成员方法、类方法

文章目录 变量相关概念变量/常量类变量/静态变量成员变量/实例变量类属性/实例属性/对象属性什么是 field 成员变量和类变量的区别两个变量的生命周期不同访问方式不同数据存储位置不同 方法相关概念示例代码判断题 变量相关概念 变量/常量 所谓变量就是指可以改变的数据量&a…

第7.12节 可共享的Python类变量

第7.12节 可共享的Python类变量 一、 引言 在上节已经引入介绍了类变量和实例变量&#xff0c;类体中定义的变量为类变量&#xff0c;默认属于类本身&#xff0c;实例变量是实例方法中定义的self对象的变量&#xff0c;对于每个实例都是独有数据&#xff0c;而类变量是该类…

Java基础---类变量和实例变量

类变量和实例变量 成员变量&#xff1a;把类内、方法体外的变量称为成员变量。 package com.chen.offer.BiliBili;/*** author chenshimiao* Email 16622880228163.com* date 2022/2/18 10:27 下午** 区分成员变量 实例变量和类变量*/ public class Clothes {//实例变量Strin…

什么是类变量,什么是实例变量,它们之间有什么区别?

了解术语很重要。实例变量和类变量都是成员变量。它们都是成员变量&#xff0c;因为它们都与特定类相关联。但是&#xff0c;实例变量和类变量之间存在差异。 实例变量 实例变量属于类的实例。换句话说&#xff0c;实例变量属于对象&#xff0c;因为对象是类的实例。每个对象都…

Java类变量的初始化

目录 两个必须的知识点 字节码指令验证 结果分析 非法前向引用变量 最近在学JVM&#xff0c;在学到类的初始化的时候明白了以前不是很理解的类中静态变量的初始化的过程&#xff0c;如果你也对静态变量的初始化有所困扰或者如下图的输出结果有所疑惑&#xff0c;相信你看完…

如何使用Arthas查看类变量值

使用arthas查看类变量值核心思路是&#xff1a;通过实现ApplicationContextAware接口定义ApplicationUtil类&#xff0c;该类可以获取ApplicationContext的所有的Bean实例&#xff0c;然后通过arthas的ognl查看类实例中的属性值。 搭建简易Spring Boot工程 1. pom依赖 <?…

类变量(静态变量),静态方法(类方法)快速了解一篇足矣

什么是类变量&#xff1f; 类变量也叫静态变量&#xff0c;静态属性&#xff0c;是该类所有对象共享的变量&#xff0c;任何一个该类的对象去访问他时&#xff0c;取到的值都是相同的值&#xff0c;同样任何一个该类对象 去修改他时&#xff0c;修改的也是同一个变量。 如何定…

VS 关于 .sln 文件和 .suo 文件

Visual Studio.NET采用两种文件类型&#xff08;.sln和.suo&#xff09;来存储特定于解决方案的设置,它们总称为解决方案文件。为解决方案资源管理器提供显示管理文件的图形接口所需的信息&#xff0c;从而在每次继续开发任务时&#xff0c;不会因开发环境而分散精力&#xff1…

Linux命令ln -snf给文件创建软链接和硬链接

我们知道 ln 命令用于创建链接文件,ln命令的参数选项有很多,此处主要理解 -snf三个: -s:--symbolic比较容易,有-s时表示创建软连接,没有-s时,表示创建硬链接 -f:--force 强行删除任何已存在的目标文件 -n:--no-dereference 把符号链接的文件视为一般文件 一、创建软链…