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

目录

  • 一、操作符的分类
  • 二、算术操作符
  • 三、 移位操作符
    • 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 };//初始化breturn 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.mzph.cn/news/665459.shtml

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

相关文章

2024程序员就业咋办?

国际研究机构Gartner会在每年10月份左右发布下一年度的战略发展趋势预测&#xff0c;并在次年3月左右发布和网络安全相关的趋势预测。绿盟科技通过将近3年的趋势预测进行分组对比分析后发现&#xff0c;除了众人皆知的AI技术应用外&#xff0c;数据模块化、身份优先安全、行业云…

阿里云OSS对象存储

一、前言 阿里云对象存储OSS作用&#xff1a;用于存储图片、视屏、文件等数据。 参考阿里云文档地址&#xff1a;阿里云对象存储教程 二、总体思路 说明&#xff1a;客户端给服务端发送请求&#xff0c;获取policy和signature等数据&#xff08;服务端提供&#xff09;&#…

VS打包.exe文件步骤

1.借助vs自带扩展工具 2.1打开扩展栏 2.2搜索栏填入 " installer " 2.3下载安装 下载完成后&#xff0c;推出vs自动弹出安装。 2.生成安装包 2.1新建一个项目 2.2输入"setup" 直接下一步 2.3输入项目名称和存储位置、点击创建 出现该栏 2.4选择 主文件…

Pandas--数据结构 - DataFrame(4)

DataFrame 是一个表格型的数据结构&#xff0c;它含有一组有序的列&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔型值&#xff09;。DataFrame 既有行索引也有列索引&#xff0c;它可以被看做由 Series 组成的字典&#xff08;共同用一个索引&#xff09;…

python求解中位数

首先将数组nums进行排序&#xff0c;然后找到中间位置的数值 如果数组长度n为奇数&#xff0c;则(n1)/2处对应值为中位数&#xff0c;如果数组下标从0开始&#xff0c;还需要减去1 如果数组长度n为偶数&#xff0c;则n/2,n/21两个位置数的平均值为中位数 假设中位数为x&#x…

ManageEngine推出云原生身份平台以解决劳动力IAM挑战

ManageEngine推出云原生身份平台以解决企业员工身份与访问管理&#xff08;IAM&#xff09;面临的挑战。该公司还为其本地身份治理和管理&#xff08;IGA&#xff09;解决方案添加了先进的安全功能。 IAM 内置通用目录可在企业应用程序之间集中管理用户身份&#xff0c;使用身…

【Nginx】nginx入门

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

【复现】帮管客CRM 客户管理系统 sql注入漏洞_37

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 帮管客CRM客户管理系统基于先进的CRM营销理念设计&#xff0c;集客户档案、销售记录、业务往来于一身&#xff0c;以凝聚客户关系…

Vue3 - 从 vue2 到 vue3 过渡,这一套就够了(案例 + 效果演示)(一)

目录 一、Vue3 从入门到进阶 1.1、Vue3 相比于 Vue2 好在哪里&#xff1f; 1.2、创建 vue-cli3 脚手架 1.3、Vue3 的使用 1.3.1、拉开序幕的 setup 1.3.2、ref 函数 什么是响应式数据 ref 响应式处理 1.3.3、reactive 1.3.4、reactive 对比 ref 1.3.5、setup 的参数…

【全网独创】2024美赛E题33页成品论文+1-4问完整代码数据助攻

E题社区抗灾能力综合评估与决策模型研究 摘要&#xff1a;社区抗灾能力的提升对于灾害风险管理至关重要。本研究基于机器学 习方法&#xff0c;构建了社区抗灾能力预测模型&#xff0c;以评估社区在灾害事件中的表现。首先&#xff0c; 我们采用梯度提升树模型对社区基础设施、…

Python学习03 -- 函数相关内容

1.def --- 这个是定义函数的关键字 \n --- 这个在print()函数中是换行符号 1.注意是x, 加个空格之后再y 1.形式参数数量是不受限制的&#xff08;参数间用&#xff0c;隔开&#xff09;&#xff0c;传实参给形参的时候要一一对应 返回值 --- 函数返还的结果捏 1.写None的时…

C++ 动态规划 线性DP 最长上升子序列

给定一个长度为 N 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N 。 第二行包含 N 个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1≤N≤1000 &#xff0c; −109≤数列中的数…

算法学习——华为机考题库2(HJ11 - HJ20)

算法学习——华为机考题库2&#xff08;HJ11 - HJ20&#xff09; HJ11 数字颠倒 描述 输入一个整数&#xff0c;将这个整数以字符串的形式逆序输出 程序不考虑负数的情况&#xff0c;若数字含有0&#xff0c;则逆序形式也含有0&#xff0c;如输入为100&#xff0c;则输出为0…

Map和Set的封装

目录 一、底层原理 二、红黑树的节点 三、仿函数 四、迭代器 4.1、迭代器的定义&#xff1a; 4.2、*:解引用操作 4.3、->:成员访问操作符 4.4、!、 4.5、迭代器的&#xff1a; 4.6、迭代器的-- 五、Map 六、Set 七、红黑树源码 一、底层原理 我们要知道&#…

机器学习_14_多分类及多标签分类算法

文章目录 1 单标签二分类问题1.1 单标签二分类算法原理1.2 Logistic算法原理 2 单标签多分类问题2.1 单标签多分类算法原理2.2 Softmax算法原理2.3 ovo2.4 ovr2.5 OvO和OvR的区别2.6 Error Correcting 3 多标签算法问题3.1 Problem Transformation Methods3.1.1 Binary Relevan…

kubernetes基本概念和操作

基本概念和操作 1.Namespace1.1概述1.2应用示例 2.Pod2.1概述2.2语法及应用示例 3.Label3.1概述3.2语法及应用示例 4.Deployment4.1概述4.2语法及应用示例 5.Service5.1概述5.2语法及应用示例5.2.1创建集群内部可访问的Service5.2.2创建集群外部可访问的Service5.2.3删除服务5.…

Deepin如何开启与配置SSH实现无公网ip远程连接

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

【JavaScript】前端攻击

前端攻击 1. CSRF的基本概念、缩写、全称 CSRF&#xff08;Cross-site request forgery&#xff09;&#xff1a;跨站请求伪造。 从上图可以看出&#xff0c;要完成一次CSRF攻击&#xff0c;受害者必须满足两个必要的条件&#xff1a; 登录受信任网站A&#xff0c;并在本地生…

09.领域驱动设计:深入学习6本经典推荐书籍

目录 前言 1、《领域驱动设计&#xff1a;软件核心复杂性应对之道》 1.作者简介 2.内容简介 3.推荐理由 4.豆瓣链接 ​编辑 2、《实现领域驱动设计》 1.作者简介 2.内容简介 3.推荐理由 4.豆瓣链接 ​编辑 3、《领域驱动设计精粹》 1.作者简介 2.内容简介 3.推…

深度学习和大数据技术的进步在自然语言处理领域的应用

文章目录 每日一句正能量前言一、深度学习在NLP中的应用二、大数据技术在NLP中的应用三、深度学习和大数据技术的影响四、应用场景后记 每日一句正能量 努力学习&#xff0c;勤奋工作&#xff0c;让青春更加光彩。 前言 随着深度学习和大数据技术的迅猛发展&#xff0c;自然语…