【C语言】操作符--百科全书

news2024/11/25 16:39:35

目录

一、操作符的分类

二、 ⼆进制和进制转换

三、 原码、反码、补码

四、 移位操作符

五、位操作符:&、|、^、~

六、单⽬操作符

七、逗号表达式

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

九、结构体

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

十一、表达式求值


一、操作符的分类

算术操作符: + - * / %
移位操作符: << >>
位操作符: & | ^ `
赋值操作符: = += -= *= /= %= <<= >>= &= |= ^=
单⽬操作符: !、++--&*+-~ sizeof(类型)
关系操作符: > >= < <= == !=
逻辑操作符: && ||
条件操作符: ? :
逗号表达式: ,
下标引⽤: []
函数调⽤()
结构成员访问: . ->

二、 ⼆进制和进制转换

其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?其实2进制、8进 制、10进制、16进制是数值的不同表⽰形式⽽已。
10进制中满10进1
10进制的数字每⼀位都是0~9的数字组成
  其实⼆进制也是⼀样的
2进制中满2进1
2进制的数字每⼀位都是0~1的数字组成
那么 1101 就是⼆进制的数字了。
2进制转10进制
其实10进制的123表⽰的值是⼀百⼆⼗三,为什么是这个值呢?其实10进制的每⼀位是权重的,10进 制的数字从右向左是个位、⼗位、百位....
如下图:
2进制位1101
权重2^32^22^12^0
权重值8421
求值1*8+1*4+0*2+1*1=13

 2进制1101每一位权重

三、 原码、反码、补码

整数的2进制表⽰⽅法有三种 ,即原码、反码和补码

有符号整数的三种表⽰⽅法均有符号位和数值位两部分 2进制序列中 ,最⾼位的1位是被当做符号  ,剩余的都是数值位。

符号位都是⽤0表⽰“ 正” ,⽤1表⽰“ 负”。

正整数的原、反、补码都相同。

负整数的三种表⽰⽅法各不相同。

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码:将原码的符号位不变 ,其他位依次按位取反就可以得到反码。 补码:反码+1就得到补码。

反码得到原码也是可以使⽤:取反,+1的操作。

四、 移位操作符

<< 左移操作符

 >> 右移操作符

注:移位操作符的操作数只能是整数。

4.1 左移操作符

移位规则:左边抛弃、右边补0

#include<stdio.h>
int main()
{
  int num = 10;
  int  n = num <<1;
  printf("n=%d\n",n);
  printf("num= %d\n",num);
  return 0;
}

4.2 右移操作符

移位规则:⾸先右移运算分两种:

1. 逻辑右移:左边⽤0填充 ,右边丢弃

2. 算术右移:左边⽤原该值的符号位填充 ,右边丢弃

 

五、位操作符:&、|、^、~

位操作符有:
& //按位与
| //按位或
^ //按位异或
~ //按位取反

注:他们的操作数必须是整数

 

六、单⽬操作符

单⽬操作符有这些: !、++ -- & * + - ~ sizeof ( 类型 )
单⽬操作符的特点是只有⼀个操作数,在单⽬操作符中只有&和*没有介绍。

七、逗号表达式

1 exp1, exp2, exp3, …expN
逗号表达式,就是⽤逗号隔开的多个表达式
逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
//代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
c是多少?
//代码2
if (a =b + 1, c=a / 2, d > 0)
//代码3
a = get_val();
count_val(a);
while (a > 0)
{
 //业务处理
 a = get_val();
 count_val(a);
}
如果使⽤逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
 //业务处理
}

 

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

8.1 [ ] 下标引⽤操作符
操作数:⼀个数组名 + ⼀个索引值
int arr[10];//创建数组
arr[9] = 10;//实⽤下标引⽤操作符。
[ ]的两个操作数是arr和9。
8.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;
}

九、结构体

结构体关键字:struct

结构体是用来描述一个复杂对象的,他里边可以包含多个属性

//创建出一个新类型
//自定义的类型
struct Satudent
{
  char name[20];//名字
  int high;//身高
  int age;//年龄
  float weight;//体重
  char id[16];//学号
};//这里的分号不能省

结构是一些值的集合,称为成员变量,每个成员可以是不同类型的变量,eg:标量;数组;指针;其他结构体。

结构的声明

struct tag
{
   member-list;
}variable;

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

#include<stdio.h>
//创建出一个新类型
//自定义的类型
struct Satudent
{
  char name[20];//名字
  int high;//身高
  int age;//年龄
  float weight;//体重
  char id[16];//学号
};s4,s5,s5;//这里的分号不能省
//s4,s5,s6是结构体变量(全局的)
struct Student s7;//全局的

int main()
{
  struct Student s1={"张三",20,180,75.5f,“20230901022”};//初始化
  struct Student s2={.age=30,.name="lisi",.weight=80。5f,.high=177,.id="20230101033"};
  
  printf("%s %d %d %.1f %s\n ",s1.name,s1.age ,s1.weight ,s1.id);//打印
//struct Student 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={{'w',99},NULL,"hehe",85.5f};
  printf("%C\n",b.s.c);
  return 0;
}

结构体成员的间接访问--->指针

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

这两个属性决定表达式求值的先后计算顺序。

int main()
{
  3+4*5;

  return 0;
}

结合性

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

由于圆括号的优先级最高,可以使用它改变其他运算符的优先级

 下表列出C运算符的优先级和结合性,运算符从上到下降序列出

优先级运算符描述结合性
1

++ --

( )

[ ]

.

->

(type){;ist}

后缀自增与自减

函数调用

数组下标

结构体与联合体成员访问

结构体与联合体成员通过指针访问

复合字面量

从左到右
2

++ --

+ -

!~

(type)

*

&

sizeof

_Alignof

前缀自增与自减

一元加与减

逻辑非与逐位非

转型

间接(解引用)

取址

取大小

对齐要求

从右到左
3* / %乘法、除法以及余数从左到右
4+ -加法、减法
5<< >>逻辑左移及右移
6

< <=

> >=

分别为<与<=的关系运算符

分别为>与>=的关系运算符

7== !=分别为=与≠关系
8&逐位与
9^逐位异或(排除成)
10|逐位或(包含成)
11&&逻辑与
12||逻辑或
13?:三元条件从右到左
14

=

+=  -=

*=  /=  %=

<<=  >>=

&=  ^=  |=

简单赋值

以和及差赋值

以积、商及余数赋值

以逐位左移及右移赋值

以逐位与、异或及或赋值

15逗号从左到右

参考:C语言参考手册

十一、表达式求值

整型提升

C语言中整型算术运算总是至少以缺省整型的精度来进行的。

为获得这个精度,表达式中的字符和短型操作数在使用之前被转换为普通整型

int main()
{
  char a=3;//char --signed char
  //00000000/00000000/00000000/00000011
  //00000011 -a
  char b=127;
  //00000000/00000000/00000000/01111111
  //01111111 -b
  char c=a+b;
  //00000000/00000000/00000000/00000011
  //00000000/00000000/00000000/01111111
  //00000000/00000000/00000000/10000010
  //10000010 - c
  //
  //%d - 以10进制的形式打印有符号的整数
  //11111111/11111111/11111111/01000010--C提升后的结果
  //10000000/00000000/00000000/01111101
  //10000000/00000000/00000000/01111110--源码
  printf("%d\n",c);

  return 0;
}

意义:

 如何整体提升:

1.有符号整数提升 是 按照变量的数据类型的符号位来提升的

2.无符号位整数提升,高位补0

 算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换

long double
double
float
unsigned long int
long int 
unsigned int
int

 如果某个操作数的类型在上面这个列表中排名靠后,那么首先要转化为另一个操作数的类型后执行运算。

问题表达式解析

//表达式的求值部分由操作符的优先级决定
//表达式1
a*b + c*d + e*f
#include<stdio.h>
int main()
{
  int i = 1;
  int ret = (++i) + (++i) + (++i);
  printf("%d\n",ret);
  printf("%d\n",i);
  return 0;
}

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

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

相关文章

P1392 取数

传送门&#xff1a;取数 如若你看完题解后&#xff0c;仍有问题&#xff0c;欢迎评论 首先说一下 我首先想到的思路 &#xff08; 20%通过率 &#xff09;&#xff1a;通过dfs , 将所有的情况放入priority_queue中&#xff08;greater<int>&#xff09;&#xff0c;维持…

【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中断使能配置介绍】

文章目录 GIC 各种中断使能配置PPIs(每个处理器私有中断)SPIs(共享外设中断)SGIs(软件生成的中断)LPIs(局部中断)GIC 各种中断使能配置 在ARM GICv3和GICv4架构中,不同类型的中断(如PPIs、SPIs、SGIs和LPIs)可以通过不同的方式进行启用和禁用。 下面详细介绍这些中…

java项目总结6

目录 1.双列集合 2.map的三种遍历方式&#xff1a; 1.键找值 2.键值对 3.lambda遍历map 3.HashMap 例子&#xff1a;统计字符出现次数 4.LinkedHashMap 5.TreeMap 6.可变参数 7.Collections: 1.双列集合 双列集合特点&#xff1a; 定义Map<String&#xff0c;St…

【Python】已解决:(paddleocr导包报错)ModuleNotFoundError: No module named ‘paddle’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;&#xff08;paddleocr导包报错&#xff09;ModuleNotFoundError: No module named ‘paddle’ 一、分析问题背景 近日&#xff0c;一些使用PaddleOCR库进行文字…

移动校园(3):处理全校课程数据excel文档,实现空闲教室查询与课程表查询

首先打开教学平台 然后导出为excel文档 import mathimport pandas as pd import pymssql serverName 127.0.0.1 userName sa passWord 123456 databaseuniSchool conn pymssql.connect(serverserverName,useruserName,passwordpassWord,databasedatabase) cursor conn.cur…

vue3项目 前端blocked:mixed-content问题解决方案

一、问题分析 blocked:mixed-content其实浏览器不允许在https页面里嵌入http的请求&#xff0c;现在高版本的浏览器为了用户体验&#xff0c;都不会弹窗报错&#xff0c;只会在控制台上打印一条错误信息。一般出现这个问题就是在https协议里嵌入了http请求&#xff0c;解决方法…

拉曼光谱入门:3.拉曼光谱的特征参数与定量定性分析策略

1.特征参数 1.1 退偏振率 退偏振率&#xff08;p&#xff09;是一个衡量拉曼散射光偏振状态的参数&#xff0c;它描述了拉曼散射光的偏振方向与入射光偏振方向之间的关系。退偏振率定义为垂直偏振方向的拉曼散射强度与平行偏振方向的拉曼散射强度之比。退偏振率&#xff08;p&…

逆变器学习笔记(二)

用正点原子示波器看交流220V波形的时候&#xff0c;一定注意先把探头调到X10档位&#xff01;&#xff01;!!!!!!!!!!!!!!!!!!!!!!!!!!! 全桥LLC电路&#xff1a; 1.电感的两种模式——DCM和CCM的区别&#xff1a; DCM&#xff08;Discontinuous Conduction Mode&#xff0c;…

【数据结构】05.双向链表

一、双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;带头链表里的头节点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位节点不存储任何有效元素&#xff0c;只是站在这里“放哨的”。 “哨兵位”存在的意义&#xff1a;遍历循…

Go语言如何入门,有哪些书推荐?

Go 语言之所以如此受欢迎&#xff0c;其编译器功不可没。Go 语言的发展也得益于其编译速度够快。 对开发者来说&#xff0c;更快的编译速度意味着更短的反馈周期。大型的 Go 应用程序总是能在几秒钟之 内完成编译。而当使用 go run编译和执行小型的 Go 应用程序时&#xff0c;其…

Facebook数据仓库的变迁与启示

❃博主首页 &#xff1a; <码到三十五> ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a; <搬的每块砖&#xff0c;皆为峰峦之基&#xff1b;公众号搜索(码到…

昇思学习打卡-10-ShuffleNet图像分类

文章目录 网络介绍网络结构部分实现对应网络结构 模型训练shuffleNet的优缺点总结优点不足 网络介绍 ShuffleNet主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointwise G…

20、matlab信号波形生成:狄利克雷函数、高斯脉冲和高斯脉冲序列

1、名词说明 狄利克雷函数&#xff08;Dirac Delta Function&#xff09; 狄利克雷函数&#xff0c;也称为单位冲激函数或δ函数&#xff0c;是一个在数学和信号处理中常用的特殊函数。狄利克雷函数通常用符号δ(t)表示&#xff0c;其定义为&#xff1a; δ(t) { ∞, t 0{…

美股交易相关知识点 持续完善中

美股交易时间 美东时间&#xff1a;除了凌晨 03:50 ~ 04:00 这10分钟时间不可交易以外&#xff0c;其他时间都是可以交易的。 如果是在香港或者北京时间下交易要区分两种: 美东夏令时&#xff1a;除了下午 15:50 ~ 16:00 这10分钟时间不可交易以外&#xff0c;其他时间都是可…

springboot公寓租赁系统-计算机毕业设计源码03822

摘要 1 绪论 1.1 研究背景与意义 1.2选题背景 1.3论文结构与章节安排 2 公寓租赁系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系…

GRPC使用之ProtoBuf

1. 入门指导 1. 基本定义 Protocol Buffers提供一种跨语言的结构化数据的序列化能力&#xff0c;类似于JSON&#xff0c;不过更小、更快&#xff0c;除此以外它还能用用接口定义(IDL interface define language)&#xff0c;通protoc编译Protocol Buffer定义文件&#xff0c;…

拆分Transformer注意力,韩国团队让大模型解码提速20倍|大模型AI应用开始小规模稳步爆发|周伯文:大模型也有幻觉,全球AI创新指数公布

拆分Transformer注意力&#xff0c;韩国团队让大模型解码提速20倍AI正在颠覆AI上市不到两年&#xff0c;蜗牛游戏可能要退市了&#xff1f;世界人工智能大会结束了&#xff0c;百花齐放&#xff0c;但也群魔乱舞“串联OLED”被苹果带火了&#xff0c;比OLED强在哪里&#xff1f…

赚钱小思路,送给没有背景的辛辛苦苦努力的我们!

我是一个没有背景的普通人&#xff0c;主要靠勤奋和一股钻劲&#xff0c;这十几年来我的日常作息铁打不变&#xff0c;除了睡觉&#xff0c;不是在搞钱&#xff0c;就是在琢磨怎么搞钱。 ​ 可以说打拼了十几年&#xff0c;各种小生意都做过&#xff0c;以前一直是很乐观的&…

SSM养老院管理系统-计算机毕业设计源码02221

摘要 本篇论文旨在设计和实现一个基于SSM的养老院管理系统&#xff0c;旨在提供高效、便捷的养老院管理服务。该系统将包括老人档案信息管理、护工人员管理、房间信息管理、费用管理等功能模块&#xff0c;以满足养老院管理者和居民的不同需求。 通过引入SSM框架&#x…

动手学深度学习(Pytorch版)代码实践 -循环神经网络-54循环神经网络概述

54循环神经网络概述 1.潜变量自回归模型 使用潜变量h_t总结过去信息 2.循环神经网络概述 ​ 循环神经网络&#xff08;recurrent neural network&#xff0c;简称RNN&#xff09;源自于1982年由Saratha Sathasivam 提出的霍普菲尔德网络。循环神经网络&#xff0c;是指在全…