C语言操作符详解(下)

⽬录
1. 单⽬操作符
2. 逗号表达式
3. 下标访问[]、函数调⽤()
4. 结构成员访问操作符
5. 操作符的属性:优先级、结合性
6. 表达式求值

一    单⽬操作符

分类

!、 ++ -- & * + - ~ sizeof ( 类型 )
1.1  "++"和"--”
二者 分为前置++和后置++;前置--和后置--,使用规则是 前置++先+1后使用,后置++先使用后+1,前置--和后置--与前置++和后置++使用规则一样。

1.2 

作用:取反运算符

例如如果flong表示真则!flong表示假。

1.3  +  -

     这里的“+”是正号“-”表示负号。

      ’+‘对于正负值并没有影响;当然如果你想打印一个数字前面要显示正号这时候就可以使用’+‘;

    ’-‘用来改变一个值的正负 ,负数前面加上’-‘会得到正数,正数前面加上’-‘会得到负数。

 

 1.4   sizeof

作用:用于求取各种类型变量的长度

1.5    (类型)

(类型)表示强制类型转换。

注意将3.14强制转换为整型编译器会自动省去小数点后的1数。

   逗号表达式

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

1 exp1, exp2, exp3, …expN

     过程:逗号表达式,从左向右依次执⾏计算。整个表达式的结果是最后⼀个表达式的结果。

三   下标访问[]、函数调⽤()

1  下标访问[]

常见于数组中

     操作数:⼀个数组名 + ⼀个索引值(下标)
1   int arr[ 10 ]; // 创建数组
2   arr[ 9 ] = 10 ; // 实⽤下标引⽤操作符。
3   [ ] 的两个操作数是 arr 9

 2  函数调⽤()

     接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。

#include <stdio.h>int Add(int x,int y)
{
return x+y;
}int main()
{
//这里的()就是作为函数调用操作符
printf("hello worad");/2个操作数
Add(3,5)//3个操作数
return 0;
}

 四    结构成员访问操作符

1 结构体

   1.1定义

结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:
标量、数组、指针,甚⾄是其他结构体。

 那为什么会有结构体呢?

当我们想描述学⽣,描述⼀本书时, 描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体重等;
而描述⼀本书需要作者、出版社、定价等,这时单⼀的内置类型是不⾏的。C语⾔为了解决这个问题,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。

1.2   结构的声明

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

 例如描述⼀个学⽣:

struct Stu
{
     char name[ 20 ]; // 名字
     int age; // 年龄
     char sex[ 5 ]; // 性别
    char id[ 20 ]; // 学号
}; // 分号不能丢

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

变量的定义

struct Point
{
   int x;
    int y;
}p1; // 声明类型的同时定义变量 p1 (p1是全局变量)
struct Point p2 ; //定义结构体变量p2(p1是全局变量)

  变量的初始化

(1) 初始化和指定顺序初始化

struct Point p3 = { 10 , 20 };
struct Stu // 类型声明
{
  char name[ 15 ]; // 名字
     int age; // 年龄
};
struct Stu s1 = { "zhangsan" , 20 } ;//初始化 (要与 struct Stu中局部变量的顺序一一对应)
struct Stu s2 = {.age= 20 , .name= "lisi" }; //指定顺序初始化(可以无顺序)

(2)结构体嵌套初始化

struct Node
{
   int data;
   struct Point p ;
     struct Node * next ;
}n1 = { 10 , { 4 , 5 }, NULL }; //结构体嵌套初始化
struct Node n2 = { 20 , { 5 , 6 }, NULL }; / /结构体嵌套初始化

 1.4     结构成员访问操作符

(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 ;
}

(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 ;
}

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

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

1   优先级

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

例如

3 + 4 * 5 ;
       上⾯⽰例中,表达式 3 + 4 * 5 ⾥⾯既有加法运算符( + ),⼜有乘法运算符( * )。由于乘法 的优先级⾼于加法,所以会先计算 4 * 5 ,⽽不是先计算 3 + 4。

2    结合性

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

例如

5 * 6 / 2 ;
    上⾯⽰例中, * / 的优先级相同,它们都是左结合运算符,所以从左到右执⾏,先计算 5 * 6 再计算 / 2
      重要运算符的优先级顺序 (按照优先级从⾼到低排列),建议⼤概 记住这些操作符的优先级就⾏,其他操作符在使⽤的时候查看下⾯表格就可以了。
圆括号( ()
⾃增运算符( ++ ),⾃减运算符( --
单⽬运算符( + -
乘法( * ),除法( /
加法( + ),减法( -
关系运算符( < > 等)
赋值运算符( =
由于圆括号的优先级最⾼,可以使⽤它改变其他运算符的优先级

 参考:https://zh.cppreference.com/w/c/language/operator_precedence

 那有了操作符的属性:优先级、结合性,就能完全解决问题吗 ?答案是不能:

例如

a*b + c*d + e*f

      表达式1在计算的时候,由于 * + 的优先级⾼,只能保证, * 的计算是⽐ + 早,但是优先级并不 能决定第三个 * ⽐第⼀个 + 早执⾏。

c + --c;

      操作符的优先级只能决定⾃减 -- 的运算在 + 的运算的前⾯,但是我们并没有办法得知, +
作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的

   六    表达式求值

1   整型提升

       定义:   C语⾔中整型算术运算总是⾄少以缺省(默认)整型类型的精度来进⾏的。为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整 型提升。

2   整型提升的意义:

        表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。
      因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓ 度。
      通⽤CPU(general-purpose CPU)是难以直接实现两个8⽐特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为 int或unsigned int,然后才能送⼊CPU去执⾏运算。

如何进⾏整体提升呢?

1 . 有符号整数提升是按照变量的数据类型的符号位来提升的
2. ⽆符号整数提升,⾼位补0
//负数的整形提升
  char c1 = -1 ;
变量 c1 的⼆进制位 ( 补码 ) 中只有 8 个⽐特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为 1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1 ;
变量 c2 的⼆进制位 ( 补码 ) 中只有 8 个⽐特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为 0
提升之后的结果是:
00000000000000000000000000000001
//⽆符号整形提升,⾼位补0

4    算术转换

       定义:如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就⽆法进⾏。

下⾯的层次体系称为寻常算术转换。

1     long double
2    double
3    float
4    unsigned long int
5    long int
6    unsigned int
7    int

      如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。

本篇文章就到此结束,希望有所能帮到 读者更好的了解操作符操作符操作符。

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

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

相关文章

【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!

数据集介绍 【数据集】道路事故识别数据集 8939 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。数据集中包含2种分类&#xff1a;{0: accident, 1: non-accident}。数据集来自国内外图片网站和视频截图。检测范围道路事故检测、监控视角检测、无人机视角检测、等&…

跑批为什么这么难

业务系统产生的明细数据通常要经过加工处理&#xff0c;按照一定逻辑计算成需要的结果&#xff0c;用以支持企业的经营活动。这类数据加工任务一般会有很多个&#xff0c;需要批量完成计算&#xff0c;在银行和保险行业常常被称为跑批&#xff0c;其它像石油、电力等行业也经常…

A012-基于Spring Boot的私房菜定制上门服务系统的设计与实现

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统私房菜定制上门服务系统信息管理难度大&#xff0c;容错率…

配有生物振膜的FPS电竞耳机,血手幽灵M760,精准定位每一声脚步

在PC上玩游戏的时候&#xff0c;一款高性能的游戏耳机是提升游戏体验的关键&#xff0c;特别是在吃鸡等FPS类游戏中&#xff0c;耳机不仅是听觉享受的工具&#xff0c;更是决定胜负的关键装备。如果耳机的环绕立体声效果能够及时准确的做出反应&#xff0c;我在游戏中就能清晰地…

OceanBase详解及如何通过MySQL的lib库进行连接

OceanBase详解及如何通过MySQL的lib库进行连接 一、引言二、OceanBase概述1. 起源与发展2. 核心技术特点3. 应用场景三、OceanBase架构解析1. 系统架构2. 存储引擎3. 分布式架构四、如何使用MySQL的lib库连接OceanBase1. 前提条件2. 安装MySQL Connector/C3. 编写连接代码4. 编…

GPT原理;ChatGPT 等类似的问答系统工作流程如下;当用户向 ChatGPT 输入一个问题后:举例说明;ChatGPT不是通过索引搜索的传统知识库

目录 GPT原理 GPT架构 GPT 主要基于 Transformer 的解码器部分 ChatGPT 等类似的问答系统工作流程如下: 用户输入 文本预处理 模型处理 答案生成 输出回答 当用户向 ChatGPT 输入一个问题后:举例说明 文本预处理: ChatGPT不是通过索引搜索的传统知识库 GPT GPT…

【系统设计——认证授权——基本概念知识】

1. 认证和授权的区别 Authentication&#xff08;认证&#xff09; 是验证您的身份的凭据&#xff08;例如用户名/用户 ID 和密码&#xff09;&#xff0c;通过这个凭据&#xff0c;系统得以知道你就是你&#xff0c;也就是说系统存在你这个用户。所以&#xff0c;Authenticat…

Java:数据结构-再谈String类

字符串常量池 首先我们来思考这段代码&#xff0c;为什么运行结果一个是true&#xff0c;一个是false呢&#xff1f; public class Test {public static void main(String[] args) {String s1"123";String s2"123";String s3new String("555")…

centos7,yum安装mongodb

yum安装mongodb 1.配置MongoDB的yum源2.安装Mongodb3.启动Mongodb4.配置远程访问5.设置mongo密码 1.配置MongoDB的yum源 1.创建yum源文件&#xff0c;输入命令&#xff1a; vim /etc/yum.repos.d/mongodb-org-5.0.repo然后在文件中输入以下内容并保存&#xff1a; [mongodb-…

关于软测面试的20个终极问题,春招软测人快来看..

1. 项目测试流程你是怎么开展的&#xff1f; 【参考回答】 首先&#xff0c;需求分析阶段&#xff0c;主要参与需求评审会议&#xff0c;阅读理解业务需求&#xff0c;分析需求点。 需求确定后&#xff0c;进入测试计划阶段&#xff0c;参考软件需求规格说明书及项目总体计划…

风华高科签约实在RPA,引领粤港澳大湾区制造业数字化腾飞

近日&#xff0c;制造业单项冠军 “广东风华高新科技股份有限公司”&#xff08;以下简称 “风华高科”&#xff0c;股票代码&#xff1a;000636.SZ)与实在智能达成合作。 为贯彻落实党中央、国务院决策部署和国务院国资委《国有企业数字化转型行动计划》要求&#xff0c;培育…

Unity中IK动画与布偶死亡动画切换的实现

在Unity游戏开发中&#xff0c;Inverse Kinematics&#xff08;IK&#xff09;是创建逼真角色动画的强大工具。同时&#xff0c;能够在适当的时候切换到布偶物理状态来实现死亡动画等效果&#xff0c;可以极大地增强游戏的视觉体验。本文将详细介绍如何在Unity中利用IK实现常规…

【MongoDB】MongoDB的Java API及Spring集成(Spring Data)

文章目录 Java APISpring 集成1. 添加依赖2. 配置 MongoDB3. 创建实体类4. 创建 Repository 接口5. 创建 Service 类6. 创建 Controller 类7. 启动 Spring Boot 应用8. 测试你的 API 更多相关内容可查看 Java API maven <dependency><groupId>org.mongodb</gr…

【人工智能】ChatGPT多模型感知态识别

目录 ChatGPT辅助细化知识增强&#xff01;一、研究背景二、模型结构和代码任务流程一&#xff1a;启发式生成 三、数据集介绍三、性能展示实现过程运行过程训练过程 ChatGPT辅助细化知识增强&#xff01; 多模态命名实体识别&#xff08;MNER&#xff09;最近引起了广泛关注。…

【嵌入式】STM32中的SPI通信

SPI是由摩托罗拉公司开发的一种通用数据总线&#xff0c;其中由四根通信线&#xff0c;支持总线挂载多设备&#xff08;一主多从&#xff09;&#xff0c;是一种同步全双工的协议。主要是实现主控芯片和外挂芯片之间的交流。这样可以使得STM32可以访问并控制各种外部芯片。本文…

【汽车租聘管理与推荐】Python+Django网页界面+推荐算法+管理系统网站

一、介绍 汽车租聘管理与推荐系统。本系统使用Python作为主要编程语言&#xff0c;前端采用HTML、CSS、BootStrap等技术搭建前端界面&#xff0c;后端采用Django框架处理用户的请求。创新点&#xff1a;使用协同过滤推荐算法实现对当前用户个性化推荐。 其主要功能如下&#…

快速入门CSS

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 CSS css的三种引入方式 css书写规范 选择器分类 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 color颜色设置 border边框设置 width/heigth 内/外边距 C…

uniapp实现H5和微信小程序获取当前位置(腾讯地图)

之前的一个老项目&#xff0c;使用 uniapp 的 uni.getLocation 发现H5端定位不准确&#xff0c;比如余杭区会定位到临平区&#xff0c;根据官方文档初步判断是项目的uniapp的版本太低。 我选择的方式不是区更新uniapp的版本&#xff0c;是直接使用高德地图的api获取定位。 1.首…

探索Python网络请求新纪元:httpx库的崛起

文章目录 **探索Python网络请求新纪元&#xff1a;httpx库的崛起**第一部分&#xff1a;背景介绍第二部分&#xff1a;httpx库是什么&#xff1f;第三部分&#xff1a;如何安装httpx库&#xff1f;第四部分&#xff1a;简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…

产品的四个生命周期,产品经理需深刻理解

在产品管理的世界里&#xff0c;产品就像有生命的个体&#xff0c;经历着从诞生到消亡的过程。作为产品经理&#xff0c;深刻理解产品的四个生命周期 —— 引入期、成长期、成熟期和衰退期&#xff0c;是打造成功产品的关键。 引入期&#xff1a;破局的起点 对于 B 端产品而言&…