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

『C语言初阶』第六章-操作符详解

前言

今天小羊又来为铁汁们更新C语言初阶的操作符详解,我们在平时写代码时总会写到一些算术操作符和赋值操作符,可是当铁汁们遇到其他的操作符时,就会望而却步,甚至写出一些bug,所以这期我给铁汁们带来新鲜出炉的操作符详解~


操作符分类

  • 算术操作符
  • 移位操作符
  • 位操作符
  • 赋值操作符
  • 单目操作符
  • 关系操作符
  • 逻辑操作符
  • 条件操作符
  • 逗号表达式
  • 下标引用、函数调用和结构成员

算术操作符

算术操作符是最常见的:

+-*/%

注意:

  1. 除%操作符之外,其他的算术操作符都可以作用于整数和浮点数
  2. 使用/操作符时,如果两个操作符都为整数,则执行整数除法,结果为整数。若其中有一个为浮点数,则执行浮点数除法,结果为浮点数。
  3. %操作符的两个操作数必须为整数

分析示例1

#include<stdio.h>
int main()
{int a = 4, b = 0;int c = a / b;printf("%d", c);return 0;
}

在这里插入图片描述
分析:/操作符的除数不能为0,否则编译器会报错,就跟数学中分数中的分母不能0是一个道理。

分析示例2

#include<stdio.h>
int main()
{int a = 8, b = 3;int c = a / b;int d = a % b;printf("c=%d\n", c);printf("d=%d\n", d);return 0;
}

在这里插入图片描述
分析:C语言中的/操作符结果只保留整数部分(8/3=2……3),而%操作符是保留余数部分。


移位操作符

<<(左移操作符)>>(右移操作符)

注:移位操作符的操作数只能是整数
移位操作符的作用是什么呢?这里的“位”是指二进制位,故移位操作符是指移动一个数的二进制位。并且我们得清楚一个概念:整数在内存中存储的是二进制的补码,所以移动的是这个数的补码的二进制位。
二进制的三种形式:

  • 原码:二进制展开
  • 反码:原码的符号位不变,其他位按位取反(最高位是符号位:正数的符号位为0,负数的符号位为1)
  • 补码:反码加1

注:正整数的原码、反码、补码相同

左移操作符

定义:即操作数的二进制位向左移动
移位规则:
左边抛弃、右边补0

图法示例:

在这里插入图片描述
总结:左移有翻倍的效果,左移一位的结果是原来的两倍,左移两位是原来的四倍。
注:num左移后,num本身的值并没有改变,因为移位操作符并不具有重新赋值的功能,若是移位之后再赋值给自己,num的值才会发生改变。

右移操作符

定义:即操作数的二进制位向右移动
移位规则:

  1. 逻辑移位
    左边用0填充,右边丢弃
  2. 算术移位
    左边用原该值的符号位填充,右边丢弃

图法示例

在这里插入图片描述
总结:右移一位会减少到原来的二分之一,右移两位会减少到原来的四分之一。
注:

  1. 对于移位运算符,不能移动负数位,这个是标准未定义的。
  2. 无论左移还是右移,移动的位数不要太多,比如总共32位,若是移动33位,无法得知

位操作符

&(按位与)丨(按位或)^(按位异或)
左右操作数都为真才为真,否则都为假只要一边为真,则为真相同为假,相异为真

注:在二进制中1为真,0为假,他们的操作数必须是整数,使用对象为内存中二进制的补码

用法示例

#include <stdio.h>
int main()
{int x = 66, y = 34;int a = x & y;int b = x | y;int c = x ^ y;printf("a=%d\nb=%d\nc=%d", a, b, c);return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

小试牛刀

不能创建临时变量(第三个变量),实现两个数的交换。

#include <stdio.h>
int main()
{int a = 10;int b = 20;printf("交换前:a = %d b = %d\n", a, b);a = a ^ b;b = a ^ b;a = a ^ b;printf("交换后:a = %d b = %d\n", a, b);return 0;
}

这里采用的思想就是0 ^ a = a、a ^ a = 0
a = a ^ b ,将a带入b = a ^ b中,就得到了b = a ^ b ^ b=a,将b带入a = a^b中,就得到了a=a ^ a ^ b= b,因此就可以将两个数实现交换。


赋值操作符

赋值操作符是最最常用的操作符,它可以让你得到你想得到的任意的值。

int a=10;
double b=9.0;
char c='a';
a =4;
b=9.7;
c='t';

复合赋值符

a +=ba -= ba *= ba /= ba %= ba >>= ba <<= ba &= ba丨= ba ^ = b
a=a+ba=a-ba=a*ba=a/ba=a%ba=a>>ba=a<<ba=a&ba=a丨ba=a^b

单目操作符

!-+&sizeof~- -++*(类型)
逻辑反操作负值正值取地址操作数的类型长度(以字节为单位)对一个数的二进制按位取反前置、后置–前置、后置++间接访问操作符(解引用操作符)强制类型转换
!0=1,!1=0取出变量地址↓下文详解对一个数二进制按位取反,~101011=010100↓下文详解↓下文详解见指针章详解↓下文详解

(类型)强制类型转换:

int n=10;
float m=2.0f;
m=(float)n;

sizeof和数组

sizrof()是一个操作符,用于计算操作数占空间大小,单位是字节。
可以以类型、指针和函数等作为参数。

分析示例

#include<stdio.h>
void test1(int arr1[])
{printf("\n%d\n", sizeof(arr1));
}
void test2(char arr2[])
{printf("%d\n", sizeof(arr2));
}
void test3(float arr3[])
{printf("%d\n", sizeof(arr3));
}
void test4(double arr4[])
{printf("%d\n", sizeof(arr4));
}
int main()
{int a = 0;float b = 0.0f;double c = 0.00f;long long d = 12345;int arr1[10] = { 0 };char arr2[10] = { 0 };float arr3[10] = { 0 };double arr4[10] = { 0 };//计算变量大小printf("%d\n", sizeof(a));printf("%d\n", sizeof(b));printf("%d\n", sizeof(c));printf("%d\n", sizeof(d));//计算类型大小printf("\n%d\n", sizeof(int));printf("%d\n", sizeof(float));printf("%d\n", sizeof(double));printf("%d\n", sizeof(long long));//计算数组大小printf("\n%d\n", sizeof(arr1));printf("%d\n", sizeof(arr2));printf("%d\n", sizeof(arr3));printf("%d\n", sizeof(arr4));//计算地址大小test1(arr1);test2(arr2);test3(arr3);test4(arr4);return 0;
}

在这里插入图片描述
分析:

  • 在数组传参时,传递的是数组的首地址,从而计算的是地址的大小
  • 计算地址大小有两种结果:在32位机器上是4字节,在64位机器上是8字节

前置++与后置++

前置++:操作数先自增1,后再被使用(先++再使用)
后置++:操作数先被使用,后再自增1(先使用再++)

#include <stdio.h>
int main()
{int a = 5, c = 0;//前置++c = ++a;//先a自增1使得a的值变为6,然后再被赋值到c.printf("%d\n", c);//6printf("%d\n", a);//6//后置++a = 5, c = 0;c = a++;//先使a被赋值到c,此时a=5,赋值完成后,a再自增1,变为6.printf("%d\n", c);//5printf("%d\n", a);//6return 0;
}

前置- -与后置- -效果相同


关系操作符

>>=<<=!===
用于测试”不相等“用于测试“相等

关系操作符的返回结果只有真或假
常见错误:
在实际编程中,关系运算符= =不能和=搞混,导致错误


逻辑操作符

&&丨丨
逻辑与 (并且)逻辑或(或者)

用法示例

#include <stdio.h>
int main()
{int i = 0, m = 0, a = 0, b = 2, c = 3, d = 4;i = a++ && ++b && d++;printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);m = a++||++b||d++;printf("\na = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);return 0;
}

在这里插入图片描述
分析:
&&和||有一个重要的特点:当第一个表达式已经能确定整条语句的结果时,后面剩余的表达式将不会执行。
上例中:

  1. a++ && ++b && d++,咱们先看a++,先使用a再++,而a为0,0为假,所以无论后面的表达式是真是假,语句的整体结果都为假。所以执行完a++后,++b和d++不再执行。”假“&&”任意“为”假“
  2. a++||++b||d++,咱们先看a++,先使用a再++,a=1后自增1,a=2,2为真,所以后面++b和d++也不用再执行。”真“||”任意“为”真“

条件操作符

exp1 ? exp2 : exp3 ;

执行逻辑:
当表达式1的结果为真,则执行表达式2,否则就执行表达式3

用法示例

当我们比较两个数的大小时,通常会想到使用if语句来解决:

#include <stdio.h>
int main()
{int a = 0, b = 0;scanf("%d%d", &a, &b);if (a > b){printf("Max is %d", a);}else printf("Max is %d", b);return 0;
}

而现在我们可以转换为更为简单的写法:

#include <stdio.h>
int main()
{int a = 0, b = 0,c = 0;scanf("%d%d", &a, &b);c = a > b ? a : b;printf("Max is %d", c);return 0;
}

逗号表达式

exp1 , exp2 , exp3,…

逗号表达式就是用逗号隔开的多个表达式
运算规则:
从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

用法示例

#include <stdio.h>
int main()
{int m = 0, a = 1, b = 2, c = 3, d = 5;m = (a++, b + 2, c *=2, c + d);printf("m=%d\n", m);printf("a=%d,b=%d,c=%d,d=%d", a, b, c, d);return 0;
}

在这里插入图片描述
逗号表达式运用的场景不是很多,但是能灵活运用也有很多妙处。


下标引用、函数调用和结构成员

下标引用操作符

使用方法:数组名[操作数]
具体见C语言之数组

函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
使用方法:
函数名(参数1,参数2......)

int sum(int x,int y);
void test1(const char* str);

结构体成员访问操作符

.结构体 .成员名
->结构体指针->成员名

#include<stdio.h>
struct Stu
{char name[10];char sex[5];int age;double stature;
};
#include <stdio.h>
int main()
{struct Stu s1 = { "jonny","男","19",1.79 };printf("姓名:%s\n", s1.name);struct Stu* s = &s1;printf("性别:%s\n", s->sex);s->stature = 1.88;printf("身高:%.3lf", s->stature);return 0;
}

好勒,今天小羊这期C语言初阶的操作符详解大致讲解完毕,剩余一小部分会在后面的文章中见~

相关文章:

『C语言初阶』第六章-操作符详解

前言 今天小羊又来为铁汁们更新C语言初阶的操作符详解&#xff0c;我们在平时写代码时总会写到一些算术操作符和赋值操作符&#xff0c;可是当铁汁们遇到其他的操作符时&#xff0c;就会望而却步&#xff0c;甚至写出一些bug&#xff0c;所以这期我给铁汁们带来新鲜出炉的操作…...

企业知识文档管理+群晖nas安全云存储

企业知识管理系统&#xff0c;利用软件系统或其他工具的企业管理方法&#xff0c;利用软件系统或其他工具&#xff0c;对组织中大量的有价值的方案、策划、成果、经验等知识进行分类存储和管理&#xff0c;积累知识资产避免流失&#xff0c;促进知识的学习、共享、培训、再利用…...

​《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(9)-Fiddler如何设置捕获Https会话​

1.简介 由于近几年来各大网站越来越注重安全性都改成了https协议&#xff0c;不像前十几年前直接是http协议直接裸奔在互联网。还有的小伙伴或者童鞋们按照上一篇宏哥的配置都配置好了&#xff0c;想大展身手抓一下百度的包&#xff0c;结果一试傻眼了&#xff0c;竟然毛都没有…...

对比CahtGPT Bard Claude2对中文的理解

对比CahtGPT Bard Claude2对中文的理解 今天简单测试了一下目前这三个很火的模型对中文的理解能力 简单问题 鲁迅和周树人的关系 Bard CahtGPT Claude 介绍一下平凡的世界这本书 Bard CahtGPT...

安全测试国家标准解读——并发程序安全

本系列文章主要围绕《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》进行讲解&#xff0c;该标准是2020年4月28日&#xff0c;由国家市场监督管理总局、国家标准化管理委员会发布&#xff0c;2020年11月01日开始实施。我们对该标准中一些常见的漏洞进行了梳理&#xff…...

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(12)-Fiddler设置IOS手机抓包,你知多少???

1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求&#xff0c;也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求&#xff0c;比如 iPhone、iPad 和 MacBook 等苹…...

MySQL中锁的简介——行级锁

1.行级锁概念及分类 可通过以下语句查看意向锁和行锁的加锁情况&#xff1a; select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;InnoDB的行锁是针对于索引加的锁&#xff0c;不通过索引条件检索数据&#xff0…...

4 个最常见的自动化测试挑战及应对措施

有人说&#xff1a;“杂乱无章的自动化只会带来更快的混乱。”不仅更快&#xff0c;而且是更严重、更大的混乱。如果使用得当&#xff0c;自动化可以成为测试团队中令人惊叹的生产力助推器和系统的质量增强器。自动化测试的关键是要正确运用&#xff0c;这是初始最困难的部分。…...

23款奔驰GLE450豪华型升级AMG直瀑式中网,战斗感立马提升了一个档次

奔驰GLE450豪华型升级AMG竖杠中网前进气格栅&#xff0c;AMG中网竖杠格栅&#xff0c;镀铬饰条呈圆弧状&#xff0c;色泽均衡&#xff0c;质感顺滑&#xff0c;极富冲击力。AMG专属字标&#xff0c;与中网卡扣装配紧密&#xff0c;凸显AMG的身份象征&#xff0c;点睛之笔又不显…...

ALLEGRO之Logic

本文主要讲述ALLEGRO的Logic菜单。 &#xff08;1&#xff09;Net Logic&#xff1a;暂不清楚&#xff1b; &#xff08;2&#xff09;Net Schedule&#xff1a;暂不清楚&#xff1b; &#xff08;3&#xff09;AssignDifferential Pair&#xff1a;暂不清楚&#xff1b; &a…...

算法leetcode|64. 最小路径和(rust重拳出击)

文章目录 64. 最小路径和&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 64. 最小路径和&#xff1a; 给定一个包含非负整数的 m x n 网…...

css---实现文本超过两行时显示省略号(...)的效果

可以使用CSS中的text-overflow属性配合-webkit-line-clamp属性来实现。以下是一种常见的方式&#xff1a; .text-container {overflow: hidden;display: -webkit-box;-webkit-line-clamp: 2; /* 设置最大显示行数 */-webkit-box-orient: vertical;text-overflow: ellipsis; }在…...

30-使用RocketMQ做削峰处理

1、增加排队功能的思路 在出票模块里,一个消费者拿到了某个车次锁,则该车次下所有的票都由他来出,一张一张的出,知道所有的订单都出完。 2、实现排队出票功能 2.1、 修改发送到MQ消息的内容 修改MQ消息内容,只需要通知出哪天和哪个车次的票(即:组成锁的内容),不需要…...

如何用非root账号安装k8s集群

在大多数情况下&#xff0c;为了安装 Kubernetes&#xff08;K8s&#xff09;集群&#xff0c;需要具有root权限或者以root身份执行某些操作&#xff0c;例如安装软件包和配置系统级别的设置。然而&#xff0c;你可以通过以下方法在非root账号下安装K8s集群&#xff1a; 使用Mi…...

windows环境安装elasticsearch+kibana并完成JAVA客户端查询

下载elasticsearch和kibana安装包 原文连接&#xff1a;https://juejin.cn/post/7261262567304298554 elasticsearch官网下载比较慢&#xff0c;有时还打不开&#xff0c;可以通过https://elasticsearch.cn/download/下载&#xff0c;先找到对应的版本&#xff0c;最好使用迅…...

高精度算法

基础模板&#xff1a; (411条消息) 高精度加法_会笑的小熊的博客-CSDN博客 (411条消息) 高精度乘法_会笑的小熊的博客-CSDN博客 (411条消息) 高精度减法_会笑的小熊的博客-CSDN博客 目录 P1601 AB Problem&#xff08;高精&#xff09; P1303 A*B Problem P1009 [NOIP1998 普…...

DragGAN:用崭新的方式进行图像处理

该项目的论文被SIGGRAPH 2023 收录&#xff0c;论文以 StyleGAN2 架构为基础&#xff0c;实现了 “Drag” 关键点就能轻松 P 图的效果。 https://github.com/XingangPan/DragGAN https://vcai.mpi-inf.mpg.de/projects/DragGAN/ 目录 原图1测试一测试二测试三 原图2测试一测试…...

语音播放 linux

调整语音音量大小 pactl list sinks pactl set-sink-volume 15 12345 # 15可以改成别的id安装pip install pyttsx3 sudo apt-get update sudo apt-get install espeak sudo ldconfig pip3 install pyttsx3代码 import pyttsx3 import threading def speak_work(text):engine…...

各大互联网公司面经分享:Java 全栈知识 +1500 道大厂面试真题

这篇文章给大家分享一下我遇到的一些质量较高的面试经历&#xff0c;具体经过就不多说了&#xff0c;就把面试题打出来供各位读者老哥参考如有不全的地方&#xff0c;各位海涵。 猿辅导 八皇后问题 求二叉树的最长距离(任意两个节点的路径 中最长的) lru 算法的实现 设计一…...

【LeetCode】剑指offer礼物的最大价值

礼物的最大价值 题目描述算法分析编程代码 链接: 礼物的最大价值 题目描述 算法分析 编程代码 class Solution { public:int maxValue(vector<vector<int>>& grid) {int m grid.size();int n grid[0].size();vector<vector<int>> dp(m1,vector…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...