c语言---操作符(详解)

news2024/9/24 23:28:09

目录

  • 一、操作符的分类
  • 二、算术操作符
  • 三、 移位操作符
    • 3.1<<左移操作符
      • 3.1.1移位规则
      • 3.1.2直接上代码以及解释
    • 3.2>> 右移操作符
      • 3.2.1移位规则
      • 3.2.2画图解释
    • 3.3注意
  • 四、位操作符:&、|、^、~
    • 4.1&按位与
      • 4.1.1按位与的计算逻辑
      • 4.1.2代码
      • 4.1.3运行结果
      • 4.1.4 画图解释
    • 4.2 按位或(|)
      • 4.2.1按位或的计算逻辑
      • 4.2.2 代码
      • 4.2.3运行结果
      • 4.2.4画图解释
    • 4.3按位异或(^)
      • 4.3.1按位异或计算逻辑
      • 4.3.2代码
      • 4.3.3 运算结果
      • 4.3.4画图解释
    • 4.4按位取反(~)
      • 4.4.1按位取反计算逻辑
      • 4.4.2代码
      • 4.4.3运行结果
      • 4.4.4画图分析
  • 五、单目操作符
        • !、++、--、&、*、+、-、~ 、(类型)
  • 六、逗号表达式
    • 6.1形式
    • 6.2特点
    • 6.3代码
    • 6.4运行结果
    • 6.5画图解释
  • 七、 下标访问[]、函数调用()
    • 7.1下标访问[]操作符
    • 7.2函数调用操作符
  • 八、结构成员访问操作符
    • 8.1结构体
      • 8.1.1结构的声明
      • 8.1.2结构体变量的定义和初始化
      • 8.1.3 结构体成员的直接访问
        • 8.1.3.1代码1
        • 8.1.3.1.1代码1运行结果
        • 8.1.3.2代码2
        • 8.1.3.2.2代码2运行结果
      • 8.1.4接构体成员的间接访问
        • 8.1.4.1代码
        • 8.1.4.1.1代码运行结果:
  • 九、 操作符的属性:优先级、结合性
    • 9.1优先级
    • 9.2结合性
    • 9.3注意
  • 十、 总结

一、操作符的分类

算术操作符: + 、- 、*、/ 、%
移位操作符: << >>
位操作符: & | ^ `
赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
单⽬操作符: !、++、–、&、
、+、-、~ 、sizeof、(类型)
关系操作符: > 、>= 、< 、<= 、 == 、 !=
逻辑操作符: && 、||
条件操作符: ? :
逗号表达式: ,
下标引⽤: []
函数调⽤: ()
结构成员访问: . 、->

二、算术操作符

在这里插入图片描述

三、 移位操作符

3.1<<左移操作符

3.1.1移位规则

左边抛弃,右边补0。

3.1.2直接上代码以及解释

#include<stdio.h>
int main()
{
	int a = 6;
	int b = a << 1;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

运行结果:
在这里插入图片描述
数据存放内存中其实存放的是补码。
在这里插入图片描述
如果改成a=-6,那么结果如何呢?
直接上代码:

#include<stdio.h>
int main()
{
	int a = -6;
	int b = a << 1;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

3.2>> 右移操作符

3.2.1移位规则

首先右移运算分两种:
1.逻辑右移:左边用0填充,右边丢弃。
2.算术右移:左边用原该值的符号位填充,右边丢弃。
其次右移到底是算术右移,还是逻辑右移取决于编译器的实现,常见的编译器都是算术右移。

3.2.2画图解释

在这里插入图片描述

3.3注意

1.移位操作符的操作数只能是整数,移动的是二进制。
2.不要移动负数位,这是未定义的,例如:

int num = 10;
num>>-1;//error

四、位操作符:&、|、^、~

操作的是二进制位。

& //按位与
|//按位或
^//按位异或
~//按位取反

4.1&按位与

4.1.1按位与的计算逻辑

相同为1,不同为0。

4.1.2代码

#include<stdio.h>
int main()
{
	int a = 3;
	int b = -5;
	int c = a & b;
	printf("%d\n", c);
	return 0;
}

4.1.3运行结果

在这里插入图片描述

4.1.4 画图解释

在这里插入图片描述

4.2 按位或(|)

4.2.1按位或的计算逻辑

两个同时为0,才为0

4.2.2 代码

#include<stdio.h>
int main()
{
	int a = 3;
	int b = -5;
	int c = a |b;
	printf("%d\n", c);
	return 0;
}

4.2.3运行结果

在这里插入图片描述

4.2.4画图解释

在这里插入图片描述

4.3按位异或(^)

4.3.1按位异或计算逻辑

相同为0,相异为1。

4.3.2代码

#include<stdio.h>
int main()
{
	int a = 3;
	int b = -5;
	int c = a ^b;
	printf("%d\n", c);
	return 0;
}

4.3.3 运算结果

在这里插入图片描述

4.3.4画图解释

在这里插入图片描述

4.4按位取反(~)

4.4.1按位取反计算逻辑

所有位按位取反

4.4.2代码

#include<stdio.h>
int main()
{
	int a = 0;
	int b= ~a;
	printf("%d\n", b);
	return 0;
}

4.4.3运行结果

在这里插入图片描述

4.4.4画图分析

在这里插入图片描述

五、单目操作符

!、++、–、&、*、+、-、~ 、(类型)

在这里插入图片描述
如上图标黄色的,先参与运算,再加或减。
如上图标红色的,先加或减,再运算。
在这里插入图片描述

六、逗号表达式

逗号表达式,就是⽤逗号隔开的多个表达式。

6.1形式

exp1, exp2, exp3, …expN

6.2特点

从左往右依次计算,取最右边的结果为表达式最后的结果。

6.3代码

#include<stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);
		printf("%d", c);
	return 0;
}

6.4运行结果

在这里插入图片描述

6.5画图解释

在这里插入图片描述

七、 下标访问[]、函数调用()

7.1下标访问[]操作符

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5 };
		printf("%d", arr[2]);//这里的[]就是下标访问操作符
	return 0;
}

7.2函数调用操作符

在这里插入图片描述

八、结构成员访问操作符

8.1结构体

c语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问题,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚⾄是其他结构体。

8.1.1结构的声明

创造一个新的类型

struct tag
{
 member-list;
}variable-list;

描述一个学生:

struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}s4,s5,s6; //分号不能丢
//s4,s5,s6是结构体变量(全局的)
struct Stu s7;//也是全局的
int main()
{
 struct Stu s1;
 struct Stu s2;
 struct Stu s3;
 //s1,s2,s3这三个结构体变量(局部的)
 return 0}

8.1.2结构体变量的定义和初始化

struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}s4, s5, s6; //分号不能丢
//s4,s5,s6是结构体变量(全局的)
struct Stu s7;//也是全局的
int main()
{
	struct Stu s1 = { "张三",20,"男","20231234" };//初始化
	struct Stu s2={.age=30,.name="Lina", .sex="男",.id="1008611"};//指定顺序初始化
	struct Stu s3;
	//s1,s2,s3这三个结构体变量(局部的)
	return 0;
}

再看一个初始化

#include<stdio.h>

struct S
{
	char c;
	int n;
};
struct B
{
	struct S s;
	int* p;
	char arr[10];
	float sc;
};
int main()
{
	struct B b = { {'A',60},NULL,"权权",66.6f };//初始化b
	return 0;
}

8.1.3 结构体成员的直接访问

使用方式:结构体变量.成员名

8.1.3.1代码1
#include<stdio.h>
struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}s4, s5, s6; //分号不能丢
//s4,s5,s6是结构体变量(全局的)
struct Stu s7;//也是全局的
int main()
{
	struct Stu s1 = { "张三",20,"男","20231234" };//初始化
	struct Stu s2={.age=30,.name="Lina", .sex="男",.id="1008611"};//指定顺序初始化
	struct Stu s3;
	//s1,s2,s3这三个结构体变量(局部的)
	printf("%s %d %s %s", s1.name, s1.age, s1.sex, s1.id);
	return 0;
}
8.1.3.1.1代码1运行结果

在这里插入图片描述

8.1.3.2代码2
#include<stdio.h>
struct S
{
	char c;
	int n;
};
struct B
{
	struct S s;
	int* p;
	char arr[10];
	float sc;
};
int main()
{
	struct B b = { {'A',60},NULL,"权权",66.6f };
	printf("%c\n", b.s.c);
	return 0;
}
8.1.3.2.2代码2运行结果

在这里插入图片描述

8.1.4接构体成员的间接访问

使用方法:结构体指针->成员名
有时候我们得到的不是⼀个结构体变量,⽽是得到了⼀个指向结构体的指针。如下所示:

8.1.4.1代码
#include<stdio.h>
struct Point
{
	int x;
	int y;
};
int main()
{
	struct Point p = { 3, 4 };
	struct Point* ptr = &p;
	ptr->x = 10;
	ptr->y = 20;
	printf("x = %d y = %d\n", ptr->x, ptr->y);
	return 0;
}
8.1.4.1.1代码运行结果:

在这里插入图片描述

九、 操作符的属性:优先级、结合性

C语⾔的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。

9.1优先级

优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的。

 3 + 4 * 5;

上面示例中,表达式 3 + 4 * 5 里面既有加法运算符( + ),又有乘法运算符( * )。由于乘法的优先级高于加法,所以会先计算 4 * 5 ,而不是先计算 3 + 4 。

9.2结合性

如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符( = )。

 5* 6 / 2;

上面示例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执行,先计算 5 * 6 ,再计算 6 / 2 。
运算符的优先级顺序很多,下面是部分运算符的优先级顺序(按照优先级从⾼到低排列),建议大概记住这些操作符的优先级就行,其他操作符在使用的时候查看下面表格就可以了。
• 圆括号( () )
• 自增运算符( ++ ),⾃减运算符( – )
• 单⽬运算符( + 和 - )
• 乘法( * ),除法( / )
• 加法( + ),减法( - )
• 关系运算符( < 、 > 等)
• 赋值运算符( = )
由于圆括号的优先级最⾼,可以使用他改变其他运算符的优先级。
下表列出 C 运算符的优先级和结合性。运算符从上到下以降序列出。
在这里插入图片描述

9.3注意

即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的计算路径,那这个表达式就是存在潜在⻛险的,建议不要写出特别负责的表达式。

十、 总结

掌握好操作符,可以更好的在编程中得心应手,虽然有一点多,加油,奥利给,干就完了。
在这里插入图片描述

欧耶!!!!!我学会啦!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1430283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Modbus协议学习第七篇之libmodbus库API介绍(modbus_write_bits等)

写在前面 在第六篇中我们介绍了基于libmodbus库的演示代码&#xff0c;那本篇博客就详细介绍一下第六篇的代码中使用的基于该库的API函数。另各位读者&#xff0c;Modbus相关知识受众较少&#xff0c;如果觉得我的专栏文章有帮助&#xff0c;请一定点个赞&#xff0c;在此跪谢&…

redis布隆过滤器(Bloom)详细使用教程

文章目录 布隆过滤器1. 原理2. 结构和操作3. 特点和应用场景4. 缺点和注意事项 应用-redis插件布隆过滤器使用详细过程安装以及配置springboot项目使用redis布隆过滤器下面是布隆过滤器的一些基础命令 扩展 布隆过滤器 Bloom 过滤器是一种概率型数据结构&#xff0c;用于快速判…

算法学习——华为机考题库5(HJ31 - HJ35)

算法学习——华为机考题库5&#xff08;HJ31 - HJ35&#xff09; HJ31 单词倒排 描述 对字符串中的所有单词进行倒排。 说明&#xff1a; 1、构成单词的字符只有26个大写或小写英文字母&#xff1b; 2、非构成单词的字符均视为单词间隔符&#xff1b; 3、要求倒排后的单…

Jmeter,如何从数组参数中取值

有个post请求&#xff0c;参数“equipment_ids”&#xff0c;是个数组&#xff0c;需求每次执行的时候&#xff0c;按顺序取equipment_ids中不同的值 要实现在 JMeter 中每次执行请求时按顺序取不同的 equipment_ids 中的值&#xff0c;你可以使用 Counter 元件来生成索引&…

Linux 磁盘空间占用率100%的排查

&#x1f4d1;前言 使用 Linux 操作系统时&#xff0c;可能会遇到磁盘空间不足的错误&#xff0c;这种错误通常会导致系统运行缓慢或崩溃。本文将介绍磁盘排查的方法。⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1…

【深入浅出Java性能调优】「底层技术原理体系」详细分析探索Java服务器性能监控Metrics框架的实现原理分析(Dropwizard度量基础案例指南)

深入探索Java服务器性能监控Metrics框架的实现原理分析 前提介绍Dropwizard MetricsDropwizard的特点Dropwizard的开发案例需要引入Maven依赖常用度量类型Meter(每秒请求数为单位测量请求率)定义度量核心MetricRegistry构建对应的Meter指标对象请求标记采样业务方法控制报告器…

【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]

阅读导航 引言一、C语言的输入与输出二、流是什么三、CIO流1. C标准IO流&#xff08;1&#xff09;istream&#xff08;2&#xff09;ostream&#xff08;3&#xff09;iostream&#xff08;4&#xff09;cin 和 cout 2. C文件IO流&#xff08;1&#xff09;ifstream&#xff0…

WPF简介

WPF早期名称为Avalon&#xff0c;是微软的一个项目&#xff0c;目的是构建统一的平面展示平台 WPF是一个与分辨率无关的UI框架&#xff0c;是一种基于矢量的呈现引擎技术&#xff1b;所用的语言为XAML(全称Extensible Application MarkupLanguage)&#xff0c;它的基本度量单位…

02 使用jdk运行第一个java程序:HelloWorld

使用jdk运行第一个java程序 1 HelloWorld小案例1.1 编写流程1.2 错误示例 首先在CMD命令行里面&#xff0c;使用javac xxxx.java&#xff0c; 进行编译&#xff0c;其中会有报错&#xff1b; 然后生成xxxx.class 文件&#xff0c;然后使用java xxxx.class 进行运行。 1 HelloWo…

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&…

五大浏览器内核及代表浏览器,一文讲透!

Hi,我是贝格前端工场&#xff0c;在进行web前端开发的时候&#xff0c;浏览器兼容性一直是让所有前端工程师头疼的问题&#xff0c;其根源在于不同的浏览器应用了不同的内核&#xff0c;其对html、css、js的解析规则也是不一样的&#xff0c;作为前端开发的你&#xff0c;如果不…

2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模

上一篇已经对赛题进行详细分析了&#xff0c;而且大方向和基本的模型已经确定完毕&#xff0c;数据集都已经找到了&#xff0c;现在最重要的就是要分析风暴数据集以及建立时序预测模型&#xff0c;使用气候模型预测的数据&#xff0c;评估气候变化对未来极端天气事件频率和强度…

全面认识DOS系统

目录 一、DOS系统的功能 1.执行命令和程序&#xff08;处理器管理&#xff09; 2.内存管理 3.设备管理 4.文件管理 5.作业管理 二、文件与目录 三、文件类型与属性 1.系统属性&#xff08;S&#xff09; 2.隐含属性&#xff08;H&#xff09; 3.只读属性&#xff08…

深度学习手写字符识别:训练模型

说明 本篇博客主要是跟着B站中国计量大学杨老师的视频实战深度学习手写字符识别。 第一个深度学习实例手写字符识别 深度学习环境配置 可以参考下篇博客&#xff0c;网上也有很多教程&#xff0c;很容易搭建好深度学习的环境。 Windows11搭建GPU版本PyTorch环境详细过程 数…

华为机考入门python3--(6)牛客6-质数因子

分类&#xff1a;质数、素数 知识点&#xff1a; 取余符号% 5%3 2 取整符号// 5//3 1 list中int元素转str map(str, list) 题目来自【牛客】 def prime_factors(n): """ 输入一个正整数n&#xff0c;输出它的所有质因子&#xff08;重复的也…

python pygame实现倒计时

实现思路 获取开始时间、当前时间&#xff0c;通过当前时间-开始时间时间差&#xff0c;再通过倒计时的总时长-时间差即可实现&#xff01; 随着时间的流逝&#xff0c;当前时间会变大&#xff0c;也就导致时间差会变大&#xff0c;当使用总时长-时间差的时候&#xff0c;得到…

基于控制台的购书系统(Java 语言实现)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…

【Nginx】nginx入门

文章目录 一、Web服务器二、Nginx三、Nginx的作用Web服务器正向代理反向代理 四、CentOS上安装Nginx(以CentOS 7.9为例) 一、Web服务器 Web 服务器&#xff0c;一般是指“网站服务器”&#xff0c;是指驻留于互联网上某种类型计算机的程序。Web 服务器可以向 Web 浏览器等客户…

[开源]基于野火指南者的MQTT框架+FreeRTOS移植(使用板载esp8266模块)

MQTT移植 项目地址 实际使用 基于野火指南者开发板 移植大佬的MQTT框架, 参考韦东山的课程 实际移植的项目: mqttclient 主要实现的是使用开发板上面的ESP8266连接MQTT服务器, 目前使用的是ip地址进行连接(FreeRTOS版本) 测试程序在mqtt/at/at_comment.c文件里面, 需要改…

Vivado MIG IP使用配置

目录 1 MIG 基本配置 1 MIG 基本配置 配置如下图所示 图1 图2 图3 图4 图5 图6 图8 图9 在设立只讲解共同配置&#xff0c;这是所有DDR3中配置通用部分。