当前位置: 首页 > 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…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...