C语言——操作符详解2

目录

  • 0.过渡
    • 0.1 不创建临时变量,交换两数
    • 0.2 求整数转成二进制后1的总数
  • 1.单目表达式
  • 2. 逗号表达式
  • 3. 下标访问[ ]、函数调用( )
    • 3.1 下标访问[ ]
    • 3.2 函数调用( )
  • 4. 结构体成员访问操作符
    • 4.1 结构体
      • 4.1.1 结构体的申明
      • 4.1.2 结构体变量的定义和初始化
    • 4.2 结构体成员的访问
      • 4.2.1 结构体成员的直接访问
      • 4.2.2 结构体成员的间接访问
  • 5. 操作符的属性:优先级、结合性

  • 前半部分的操作符详解在这个链接——操作符详解1

0.过渡

  • 在操作符1中我们最后讲了位操作符的概念
  • 这里我想举几个例子加深理解

0.1 不创建临时变量,交换两数

  • 这是一道很变态的面试题
  • 首先我们可以看看下面两个等式:
  1. a ^ a =0
  2. a ^ 0 = a
  • 接着我们来理解一下这道变态面试题的答案
#include <stdio.h>
int main()
{int a = 10;int b = 20;a = a^b;b = a^b;//根据上面的代码,这里的a^b=a^b^b=a^0=a,这里相当于把a给ba = a^b;//根据上面的代码,这里的a^b=a^a^b=0^b=b,这里相当于把b给aprintf("a = %d b = %d\n", a, b);return 0;
}
  • 运行结果如下:

在这里插入图片描述

0.2 求整数转成二进制后1的总数

  • 首先我们看一下当一个二进制数和1按位与后的结果

在这里插入图片描述

  • 我们发现当一个二进制的最后一位是 0 时,和1按位与后的结果为0
  • 当最后一位为1时,按位与1后的结果时1
  • 这样就相当于把二进制的最后一位给取出来了,那么我只要加个循环,把每一位都取出来再相加即可(这里我为了方便只写了八个二进制数,×86环境为32位,×64环境为64位)
  • 所以代码如下:
#include <stdio.h>int main()
{int num = -1;int i = 0;int count = 0;//计数for(i=0; i<32; i++){if( num & (1 << i) )count++;}printf("⼆进制中1的个数 = %d\n",count);return 0;
}
  • 但是这样有一个缺点,就是不管二进制是多少都要循环32遍,如果二进制只是1,那31遍循环都白循环了
  • 所以我们想想是否还有更加高效的代码呢
  • 比如我们可以试试 num&(num-1)

在这里插入图片描述

  • 我们会发现最后的1消失了
  • 同理,如果我们把结果再重复一次运算

在这里插入图片描述

  • 我们会发现倒数第二个1也消失了,如果我们再重复一次会不会倒数第四位的1也消失呢?

在这里插入图片描述

  • 我们发现确实如此!
  • 那么我们只要再加上num != 0 这个条件就可以循环起来了
  • 代码如下:
#include <stdio.h>int main()
{int num = -1;int i = 0;int count = 0;//计数while(num){count++;num = num & (num-1);}printf("⼆进制中1的个数 = %d\n",count);return 0;
}

1.单目表达式

  • 单目操作符有这些:
  • !、++、–、&、*、+、-、~ 、sizeof、(类型)

在这里插入图片描述

2. 逗号表达式

  • 顾名思义,就是一些表达式用逗号连接起来,如图:

在这里插入图片描述

  • 逗号表达式,从左向右依次执行。整个表达式的结果是最后⼀个表达式的结果。

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

3.1 下标访问[ ]

  • 操作数:⼀个数组名 + ⼀个索引值

在这里插入图片描述

3.2 函数调用( )

  • 接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。
#include <stdio.h>void test1()
{printf("hehe\n");
}void test2(const char *str)
{printf("%s\n", str);
}int main()
{test1(); //这⾥的()就是作为函数调⽤操作符。test2("hello bit.");//这⾥的()就是函数调⽤操作符。return 0;
}

4. 结构体成员访问操作符

4.1 结构体

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

4.1.1 结构体的申明

在这里插入图片描述

  • 比如描述一个学生:
struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
}a;//分号不能丢,这里的a为结构体类型的全局变量

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

//变量的定义
struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1struct Point p2; //定义结构体变量p2
struct Point p3 = {10, 20};//初始化struct Stu //类型声明
{char name[15];//名字int age; //年龄
};struct Stu s1 = {"zhangsan", 20};//初始化
struct Stu s2 = {.age=20, .name="lisi"};//指定顺序初始化//嵌套结构
struct Node
{int data;struct Point p;struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

4.2 结构体成员的访问

4.2.1 结构体成员的直接访问

  • 结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数。如下所示:
#include <stdio.h>struct Point
{int x;int y;
}p = {1,2};int main()
{printf("x: %d y: %d\n", p.x, p.y);return 0;
}
  • 使用方式:结构体变量 . 成员名

4.2.2 结构体成员的间接访问

  • 有时候我们得到的不是⼀个结构体变量,而是得到了⼀个指向结构体的指针。如下所示:
#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;
}
  • 使用方式:结构体指针 -> 成员名

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

在这里插入图片描述

  • 链接在这里——操作符优先级
  • 结合性是指在遇到相同优先级的操作符的时候的运算顺序

最后,
恭喜你又遥遥领先了别人!
在这里插入图片描述

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

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

相关文章

C++学习| QT快速入门

QT简单入门 QT Creater创建QT项目选择项目类型——不同项目类型的区别输入项目名字和路径选择合适的构建系统——不同构建系统的却别选择合适的类——QT基本类之间的关系Translation File选择构建套件——MinGW和MSVC的区别 简单案例&#xff1a;加法器设计界面——构建加法器界…

配置华为交换机生成树VBST案例

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom 思科认证CCNA\CCNP\CCIE 红帽认证Linux\RHCE\RHC…

HTML-框架标签、实体、全局属性和元信息

HTML 1.框架标签 <iframe name"b站" src"https://www.bilibili.com" width"500" height"300" frameborder"0"></iframe>iframe 标签的实际应用&#xff1a; 在网页中嵌入广告。与超链接或表单的 target 配合&a…

Spring Cloud 之Config详解

大家好&#xff0c;我是升仔 在微服务架构中&#xff0c;统一的配置管理是维护大规模分布式系统的关键。Spring Cloud Config为微服务提供集中化的外部配置支持&#xff0c;它可以与各种源代码管理系统集成&#xff0c;如Git、SVN等。本文将详细介绍如何搭建配置服务器、管理客…

【论文笔记】GPT,GPT-2,GPT-3

参考&#xff1a;GPT&#xff0c;GPT-2&#xff0c;GPT-3【论文精读】 GPT Transformer的解码器&#xff0c;仅已知"过去"&#xff0c;推导"未来" 论文地址&#xff1a;Improving Language Understanding by Generative Pre-Training 半监督学习&#xff1…

微信小程序开发 逐级选择地区

1.需求 微信小程序开发,逐级选择地区&#xff08;市、区县、街道、社区、网格&#xff09;&#xff0c;选择每一级然后展示下一级数据。 微信小程序逐级选择 2. 完整代码 2.1. 选择界面 2.1.1. selectArea.wxml <text bindtap"selectGrid">{{gridName}}</…

Git安装详细步骤

目录 1、双击安装包&#xff0c;点击NEXT​编辑 2、更改安装路径&#xff0c;点击NEXT 3、选择安装组件 4、选择开始菜单页 5、选择Git文件默认的编辑器 6、调整PATH环境 7、选择HTTPS后端传输 8、配置行尾符号转换 9、配置终端模拟器与Git Bash一起使用 10、配置额外…

LabVIEW工业机器人系统

介绍了ABB工业机器人与LabVIEW之间进行数据交互的解决方案。通过使用TCP/IP协议的socket通信&#xff0c;实现了机器人坐标数据的读取&#xff0c;为人机交互提供了一个更便捷、更高效的新思路。 系统主要由ABB工业机器人、基于TCP/IP协议的通信接口和LabVIEW软件组成。工业机…

XSS_Labs靶场通关笔记

每一关的方法不唯一&#xff1b;可以结合源码进行分析后构造payload&#xff1b; 通关技巧&#xff08;四步&#xff09;&#xff1a; 1.输入内容看源码变化&#xff1b; 2.找到内容插入点&#xff1b; 3.测试是否有过滤&#xff1b; 4.构造payload绕过 第一关 构造paylo…

苹果提审被拒反馈崩溃日志.text | iOS 审核被拒crashLog

iOS审核人员拒绝后每个截图&#xff0c;只给了几个text文件&#xff0c;这种情况就是审核的时候运行你的代码&#xff0c;崩溃了。 仅仅看text文件&#xff0c;是看不出所以然来的&#xff0c;所以我们要将日志转换成.crash格式 1.将.text文件下载下来&#xff0c;将 .text手动…

零基础学习数学建模——(五)美赛写作指导

本篇博客将详细讲解美赛论文写作。 文章目录 标题摘要目录引言问题背景问题重述前人研究我们的工作 模型假设及符号说明正文问题分析模型建立模型求解结果分析模型检验 模型优缺点及展望模型优缺点模型展望 参考文献及附录参考文献附录 2024年美赛论文新要求 标题 标题要简洁…

JS中的try...catch

一、定义和结构 作用&#xff1a;捕获同步执行代码下的异常错误 在没有使用try...catch的情况下&#xff0c;同步代码执行遇到异常会报错&#xff0c;并中断后续代码执行&#xff1b; 在使用try...catch的情况下&#xff0c;同步代码执行遇到异常会抛出异常&#xff0c;并继续…

第2章-神经网络的数学基础——python深度学习

第2章 神经网络的数学基础 2.1 初识神经网络 我们来看一个具体的神经网络示例&#xff0c;使用 Python 的 Keras 库 来学习手写数字分类。 我们这里要解决的问题是&#xff0c; 将手写数字的灰度图像&#xff08;28 像素28 像素&#xff09;划分到 10 个类别 中&#xff08;0…

百度Apollo | 实车自动驾驶:感知、决策、执行的无缝融合

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

Docker入门篇(一)

Docker入门篇&#xff08;一&#xff09; 插播&#xff01;插播&#xff01;插播&#xff01;亲爱的朋友们&#xff0c;我们的Cmake/Makefile/Shell这三个课程上线啦&#xff01;感兴趣的小伙伴可以去下面的链接学习哦~ 构建工具大师-CSDN程序员研修院 一、引言 随着云计算…

Chatgpt的崛起之路

Chatgpt的崛起之路 背景与发展历程背景发展历程 技术原理第一阶段&#xff1a;训练监督策略模型第二阶段&#xff1a;训练奖励模型第三阶段&#xff1a;采用强化学习来增强模型的能力。 国内使用情况及应用的领域面临的数据安全挑战与建议ChatGPT获取数据产生的问题数据泄露问题…

【牛客刷题】笔试选择题整理(day1-day2)

每天都在进步呀 文章目录 1. 小数求模运算2. 进程的分区&#xff0c;这里说的不是JVM的分区。进程中&#xff0c;方法存放在方法区。3. 访问权限控制4. 继承与多态5. 与equals()6. 类加载顺序7. super()与this()7.1 super7.1.1 super调用父类构造方法7.1.2 super调用父类属性和…

(免费领源码)java#Springboot#mysql旅游景点订票系统68524-计算机毕业设计项目选题推荐

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

【C++】C++ 入门 — 命名空间,输入输出,函数新特性

C 1 前言2 命名空间2.1 概念引入2.2 开始使用2.3 投入应用 3 输入与输出3.1 基础知识3.2 开始使用3.3 注意局限 4 函数新特性4.1 缺省参数4.1.1 开始使用4.1.2 注意事项 4.2 函数重载4.2.1 开始使用4.2.2 如何实现 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下…

go-zero 全局异常处理-全局中间件

1、在主入口新增 package mainimport ("flag""fmt""go/application/internal/config""go/application/internal/handler""go/application/internal/middleware""go/application/internal/svc"manage "go/pk…