当前位置: 首页 > news >正文

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. 操作符的属性:优先级、结合性

在这里插入图片描述

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

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

相关文章:

C语言——操作符详解2

目录 0.过渡0.1 不创建临时变量&#xff0c;交换两数0.2 求整数转成二进制后1的总数 1.单目表达式2. 逗号表达式3. 下标访问[ ]、函数调用( )3.1 下标访问[ ]3.2 函数调用( ) 4. 结构体成员访问操作符4.1 结构体4.1.1 结构体的申明4.1.2 结构体变量的定义和初始化 4.2 结构体成…...

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

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

帝国cms7.5 支付升级优化版文库范文自动生成word/PDF文档付费复制下载带支付系统会员中心整站模板源码sitemap百度推送+安装教程

帝国cms7.5 支付升级优化版文库范文自动生成word/PDF文档付费复制下载带支付系统会员中心整站模板源码sitemap百度推送+安装教程 (购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不…...

【node】关于npm、yarn、npx的区别与使用

文章目录 npm (Node Package Manager):安装依赖运行脚本 npx:执行项目依赖中的命令 yarn:安装依赖eg.使用npx yarn install 的作用 npm (Node Package Manager): 用途&#xff1a; npm 是 Node.js 官方提供的包管理工具&#xff0c;用于安装、管理和分享 JavaScript 代码包。安…...

力扣0099——恢复二叉搜索树

恢复二叉搜索树 难度&#xff1a;中等 题目描述 给你二叉搜索树的根节点 root &#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下&#xff0c;恢复这棵树 。 示例1 输入&#xff1a; root [1,3,null,null,2] 输出&#xff1a;[3,1,null,nul…...

机器学习核心算法

目录 逻辑回归 算法原理 决策树 决策树算法概述 树的组成 决策树的训练与测试 切分特征 衡量标准--熵 信息增益 决策树构造实例 连续值问题解决 预剪枝方法 分类与回归问题解决 决策树解决分类问题步骤 决策树解决回归问题步骤 决策树代码实例 集成算法 Baggi…...

libjsoncpp 的编译和交叉编译

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

【Unity美术】如何用3DsMax做一个水桶模型

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…...

如何用一根网线和51单片机做简单门禁[带破解器]

仓库:https://github.com/MartinxMax/Simple_Door 支持原创是您给我的最大动力… 原理 -基础设备代码程序- -Arduino爆破器程序 or 51爆破器程序- 任意选一个都可以用… —Arduino带TFT屏幕——— —51带LCD1602——— 基础设备的最大密码长度是0x7F&#xff0c;因为有一位…...

在 VUE 项目中,使用 Axios 请求数据时,提示跨域,该怎么解决?

在 VUE 项目开发时&#xff0c;遇到个问题&#xff0c;正常设置使用 Axios 库请求数据时&#xff0c;报错提示跨域问题。 那在生产坏境下&#xff0c;该去怎么解决呢&#xff1f; 其可以通过以下几种方式去尝试解决&#xff1a; 1、设置允许跨域请求的响应头 1.1 在响应头中…...

1.【Vue3】前端开发引入、Vue 简介

1. 前端开发引入 1.1 前端开发前置知识 通过之前的学习&#xff0c;已经通过 SpringBoot 和一些三方技术完成了大事件项目的后端开发。接下来开始学习大事件项目的前端开发&#xff0c;前端部分借助两个框架实现&#xff1a; Vue3&#xff08;一个 JS 框架&#xff09;基于 …...

一起学习ETCD系列——运维操作之etcdctl使用

文章目录 概要一、命令二、实操2.1、基本操作2.2、watch2.3、租约2.4、分布式锁2.5、角色2.6、用户2.7、认证2.8、集群 概要 本文主要用来总结ETCD客户端ctcdctl的命令操作&#xff0c;在运维过程中可能常常用到的。 一、命令 etcd工具 etcdctl官方命令示例 [roottest etcd…...

Spring Security 存储密码之 JDBC

Spring Security的JdbcDaoImpl实现了UserDetailsService接口,通过使用JDBC提供支持基于用户名和密码的身份验证。 JdbcUserDetailsManager扩展了JdbcDaoImpl,通过UserDetailsManager接口提供UserDetails的管理功能。 当Spring Security配置为接受用户名/密码进行身份验证时,…...

第3章-python深度学习——(波斯美女)

第3章 神经网络入门 本章包括以下内容&#xff1a; 神经网络的核心组件 Keras 简介 建立深度学习工作站 使用神经网络解决基本的分类问题与回归问题 本章的目的是让你开始用神经网络来解决实际问题。你将进一步巩固在第 2 章第一个示例中学到的知识&#xff0c;还会将学到的…...

蓝桥杯备战——4.继电器/蜂鸣器

1.分析原理图 最好自己先去查查138以及ULN2003的使用方法&#xff0c;我这里直接讲思路。 由上图我们可以看到如果138输入ABC101,则输出Y50,此时若WR通过跳线帽接地则Y5C1 &#xff0c;于是573(U9)处于输出跟随输入P0状态&#xff0c;此时若P061&#xff0c;则573输出Q71&am…...

Redis高级特性之地理空间索引

Redis的地理空间索引是一种功能强大的工具&#xff0c;用于存储和查询地理空间数据。这个特性主要通过Redis的地理空间数据类型 - GeoSet&#xff08;地理集合&#xff09;来实现。在这篇文章中&#xff0c;我们将探索Redis地理空间数据类型的使用和应用。 1. Redis GeoSet 简…...

R语言【taxlist】——as():将 taxlist 对象强制转换为 list 对象

Package taxlist version 0.2.4 Description 可以应用 S4 对象到 list 对象的强制转换来探索它们的内容&#xff0c;避免由它们的验证引起的错误。 Usage S4_to_list(x) Argument 参数【x】&#xff1a;一个 taxlist 类对象或任意 S4 类。 Details 将 taxlist 对象强制转换…...

使用POI生成word文档的table表格

文章目录 使用POI生成word文档的table表格1. 引入maven依赖2. 生成table的两种方式介绍2.1 生成一行一列的table2.2 生成固定行列的table2.3 table合并列2.4 创建多个table存在的问题 使用POI生成word文档的table表格 1. 引入maven依赖 <dependency><groupId>org.…...

C# 继承、多态性、抽象和接口详解:从入门到精通

C# 继承 在 C# 中&#xff0c;可以将字段和方法从一个类继承到另一个类。我们将“继承概念”分为两类&#xff1a; 派生类&#xff08;子类&#xff09; - 从另一个类继承的类基类&#xff08;父类&#xff09; - 被继承的类 要从一个类继承&#xff0c;使用 : 符号。 在以…...

python在线聊天室(带聊天保存)

python Socket在线聊天室(带聊天保存) 需求功能 1.聊天信息保存功能(服务端会把信息保存到一个txt里面) 2.使用pyqt5框架作为一个可视化界面 3.具备一个服务端和多个客户端的功能 4.具备离线加入黑名单(离线踢出) 5.具备在线加入黑名单(在线加入黑名单被踢出) 6.具备群聊功能…...

新手最值得入的一款ai音乐工具

2026年&#xff0c;ai音乐爆发的一年。国内国外各种AI音乐工具层出不穷。想要尝试AI音乐的新手宝宝该怎么去选择呢&#xff1f;市面上大大小小的ai音乐创作软件我基本都尝试过。我觉得只有一款工具是最值得推荐的&#xff0c;也是我使用的最多的。那就是蘑兔AI&#xff0c;你们…...

告别SpeedGoat:低成本搭建Simulink Real-Time硬件在环(HIL)平台,基于PC+松下伺服实战

低成本搭建Simulink实时控制平台&#xff1a;基于PC与松下伺服的硬件在环方案 在工业自动化与运动控制领域&#xff0c;实时硬件在环&#xff08;HIL&#xff09;测试是验证算法有效性的关键环节。传统方案如SpeedGoat等专用设备虽性能稳定&#xff0c;但动辄数十万的成本让许多…...

手把手教你部署OpenClaw(小龙虾),打造专属AI数字员工

2026年&#xff0c;开源AI智能体OpenClaw&#xff08;国内昵称“小龙虾”&#xff09;凭借独特的“数字员工”定位迅速崛起&#xff0c;GitHub星标一路攀升至28万&#xff0c;成为当下最受开发者和办公人群青睐的开源AI项目。 一、OpenClaw核心优势解析 OpenClaw能在众多开源…...

springboot+vue基于web的校园电动车短租系统的设计系统

目录同行可拿货,招校园代理 ,本人源头供货商系统功能分析用户管理模块车辆管理模块租赁业务模块安全与风控模块统计与报表模块技术实现要点项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商…...

3DGS训练完模型怎么可视化?手把手教你用官方Viewer在Windows上查看结果

3DGS训练完模型怎么可视化&#xff1f;手把手教你用官方Viewer在Windows上查看结果 当你花费数小时甚至数天时间在Linux服务器上完成3D高斯泼溅(3DGS)模型的训练后&#xff0c;最令人兴奋的时刻莫过于亲眼看到自己的训练成果。本文将详细介绍如何将训练好的模型从Linux服务器迁…...

mbed OS双极性步进电机驱动库设计与应用

1. 项目概述BipoarStepperMotor 是一个面向 ARM Cortex-M 系统、专为 mbed OS 平台设计的双极性步进电机驱动库。该库不依赖特定硬件抽象层&#xff08;HAL&#xff09;变体&#xff0c;而是基于 mbed OS 提供的标准 DigitalOut 和 PwmOut 接口构建&#xff0c;具备良好的跨平台…...

【Echarts】Y轴标签优化:动态调整与智能截断的实战技巧

1. Y轴标签显示问题的根源分析 当使用Echarts绘制图表时&#xff0c;Y轴标签过长导致显示不全是个常见痛点。这个问题通常发生在两种场景&#xff1a;一是数据来自后端接口&#xff0c;标签长度不可控&#xff1b;二是图表容器宽度有限&#xff0c;无法容纳完整标签。 我遇到过…...

前端微前端架构:大项目的救命稻草还是自找麻烦?

前端微前端架构&#xff1a;大项目的救命稻草还是自找麻烦&#xff1f; 毒舌时刻 微前端&#xff1f;听起来就像是一群前端工程师为了显得自己很高级&#xff0c;特意发明的复杂术语。不就是把一个大应用拆成几个小应用嘛&#xff0c;至于搞得这么玄乎吗&#xff1f; 你以为拆成…...

CanFestival主站PDO配置避坑指南:以Kinco FD伺服的速度/位置模式控制为例

CanFestival主站PDO配置实战&#xff1a;从零解析Kinco FD伺服双模式控制 当你在深夜的实验室里盯着屏幕上闪烁的CAN报文&#xff0c;却发现伺服电机对控制指令毫无反应时&#xff0c;那种挫败感每个工控开发者都深有体会。本文将带你穿透CanFestival主站配置的迷雾&#xff0c…...

Phi-4-mini-reasoning与IDEA集成开发:提升Java代码推理与注释生成效率

Phi-4-mini-reasoning与IDEA集成开发&#xff1a;提升Java代码推理与注释生成效率 1. 引言&#xff1a;当AI遇见Java开发 作为一名Java开发者&#xff0c;你是否经常遇到这样的困扰&#xff1a;接手一个复杂项目时&#xff0c;面对层层嵌套的代码逻辑感到无从下手&#xff1b…...