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;其它像石油、电力等行业也经常…

C++类型推导decltype和auto

auto用于变量声明时根据表达式自动推导其类型 int x 10; auto y x; // y 的类型是 int double a 5.5; auto b a * 2; // b 的类型是double decltype 是 C11 引入的一个关键字&#xff0c;用于查询表达式的类型。它允许编译器在编译时推断出一个表达式的类型&#xff0c;…

Flutter 鸿蒙next 中使用 MobX 进行状态管理

Flutter & 鸿蒙next 中使用 MobX 进行状态管理 在应用开发中&#xff0c;状态管理是一个至关重要的环节&#xff0c;特别是在复杂的Flutter或鸿蒙next项目中。状态的变化往往会影响UI的更新&#xff0c;因此&#xff0c;选择一种高效、灵活的状态管理工具显得尤为重要。Mo…

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

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

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

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

状态模式(State Pattern)详解

1. 引言 在很多软件系统中&#xff0c;对象的行为往往依赖于其内部状态&#xff0c;而状态的变化又会影响对象的行为。状态模式&#xff08;State Pattern&#xff09;为解决这一问题提供了一种优雅的方法。通过将状态的行为封装到独立的状态对象中&#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;参考软件需求规格说明书及项目总体计划…

深度学习:encoder 详解

encoder 详解 为了提供一个更为深入和细致的解释关于编码器&#xff08;encoder&#xff09;的设计与应用&#xff0c;我们可以通过以下几个维度来展开&#xff0c;包括其在不同领域中的实现形式、其内部工作机制的具体操作、以及如何优化和调整以适应不同任务的需求。 1. 编…

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

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

数据采集之selenium模拟登录

使用Cookijar完成模拟登录 本博文爬取实例为内部网站&#xff0c;请sduter使用本人账号替换*********&#xff08;学号&#xff09;&#xff0c;***&#xff08;姓名&#xff09;进行登录 from selenium import webdriver from selenium.webdriver.common.by import By from…

快速查看一个文件夹占用的硬盘空间(重点linux系统命令)

要查看当前文件夹在硬盘上分配的空间大小&#xff0c;可以根据你使用的操作系统选择合适的方法。 在 Windows 中&#xff1a; 文件资源管理器&#xff1a; 打开文件资源管理器&#xff0c;定位到你想查看的文件夹。右键点击文件夹&#xff0c;选择“属性”。在弹出的窗口中&am…

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

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

关于vue如何监听route和state以及各自对应的实际场景

一、监听route 场景&#xff1a;监听浏览器地址栏分页参数的变化 // 注意 newPageNum和 oldPageNum是 string类型 $route.query.pageNum(newPageNum, oldPageNum) {if (newPageNum ! oldPageNum && newPageNum ! this.pageNum.toString()) {this.handleCurrentChange(p…

Windows换机华为擎云(银河麒麟V10+麒麟9000C CPU)后,使用selenium的程序怎么办(20241030)

原本的 seleniumChrome 已无法正常工作。chromedriver 报错&#xff1a;不支持 Linux/aarch64。 1、尝试Firefox、edge驱动。Firefox有一个geckodriver版本与Firefox版本的对照表&#xff0c;我看了一下&#xff0c;感觉他们是始终跟进新技术的。银河麒麟的很多库都是几年前的…