C语言——运算符及表达式
C语言——运算符及表达式
- 运算符
- 运算符的分类
- ++(自增运算符)、--(自减运算符)
- 赋值运算符
- 逗号运算符(顺序求值运算符)
- 表达式
运算符
运算符的分类
C语言的运算符范围很宽,除了控制语句和输入输出以外的几乎所有的基本操作都可以作为运算符处理。通过查阅课本可知运算符的分为以下13类:

我下面主要要讲述的是算术运算符、赋值运算符、以及逗号运算符;
算数运算符
算术运算符总共有+(加法运算符) 、-(减法运算符) 、*(乘法运算符) 、/(出发运算符) 、%(求余运算符) 五种,要想了解算数运算符及运算符的使用必须先要了解运算符的优先级和结合性;
那么什么时候会用到运算符的的优先级呢?
就是在不同优先级的运算符混合在一起使用的时候高优先级的会先结合;
结合性,所谓结合性就是运算符的结合方向,不同的运算符都有着不同的结合方向,当同一优先级的运算符混合时运算符会按照结合性结合。
运算符的优先级和结合性如下表所示:

算数运算符的用法和数学上了类似,需要注意的是求余运算符(%):
求余运算的规则:
1、求余运算中运算数不能是小数,必须是整数;
2、除数不能为零;
3、结果的符号取决于左操作数;
那何为左操作数呢?
左操作数也就是左值,通俗来说就是能够放在表达式左边的变量,左值的定义是可定位的变量也就是可以在内存空间中找到相应的内存空间。
和左值相反的是右值,右值是不可定位的也就是在内存空间中找不到相应的空间;
常见求余运算符的用法:%2用于求偶数和奇数;%N可以取出在0~N - 1范围内的数,等等;
在产生一定范围内的随机数时也可以用到求余运算符,例如:
#include <stdio.h>int main(void)
{int i = 0;srand(time(NULL));for(i = 0; i < 10; ++i){printf("%d\n", rand() % 100);}return 0;
}
rand()产生的其实是伪随机数也就是产生的第一组数据是随机的如果再将程序执行一遍时打印的数字和上次打印的数据是一样的,原因是rand()起初含有一个默认的种子如果不改变种子输出的就是一样的数据,而srand()的作用就是给rand()种下一个种子把time(NULL)(返回值是秒的数值)作为参数传进srand(),这样以变化的时间来作为种子就不断的产生不是每次全部都一样的随机数了。
++(自增运算符)、–(自减运算符)
++自增运算符的常见用法:++i、i++;
i++先用后加前提是i++要参与到别的运算中才会起作用;
i++的值在内存中是这样存储的:
假设i在内存中占四个字节,i本身的值占用上面的四个字节并且会在其下面开辟出一块临时的空间用于存放表达式也就是i++的值;

++i也就是常说先加后用,这个先加后用的前提是++i要参与到别的运算中才会起作用;
和i++不同的是++i本身的值和表达式的值都是存放在同一块空间内的,所以说++i的效率更高,因为++i不用开辟额外的空间。
–自减运算符和自增运算符同理;
自增运算符问题:
#include <stdio.h>int main()
{int i = 3;printf("%d\n", i+++++i);return 0;
}
问输出结果是什么?
这里程序会报错,原因是C语言编译器在处理时会从左往右逐个扫描,将字符尽可能多的结合成C语言运算符,所以遇到第一个+时没有运算符结合,遇到第二个+和第一个+结合成++,遇到第三个+无法和++结合,遇到第四个+和第三个+结合成++,遇到第五个+无法和++结合自己作为单个运算符所以i+++++i表达使得结合性是这样的最后(((i++)++)+i),因为i++是一个表达式,表达式为右值( )++缺左值所以程序会报错。
#include <stdio.h>int main(void)
{int i = 0;printf("%d %d\n", i, i++);return 0;
}
在实际的应用中是不建议这样使用的,因为在多数系统中的函数传参顺序是从右往左的而且i++先用后加到底什么时候加没有统一的规定。推荐用法如下:
#include <stdio.h>int main()
{int n = i;int m = i++;printf("%d %d\n", n, m);return 0;
}
赋值运算符
赋值运算符常见用法:
int a = 0;
int a = b = c = d = 0;
当只有赋值运算符时只用考虑结合性,即从右往左。
不同类型间的赋值:
高精度 = 低精度例如float、double赋值给int类型这样会导致精度丢失,反之将低精度赋值给高精度类型比如把int赋值给float、double类型会发生精度提升,所以在进行赋值运算时要看清楚数据类型否则输出结果可能会和预想结果哦不一致。
整型赋值规则:
int => short
long => int
short => char
长类型=>短类型 //高位截断
int a = 0x12345678;
short b = a;
printf("%#x\n", b);
长类型赋值给短类型 ,会发生高位截断,输出结果是0x5678;
短类型=>长类型
无符号短类型 =>长类型 //高位补0
short a = 0x1234;
int b = a;
printf("%#x\n", b);
无符号短类型 赋值给长类型高位补0,输出结果为0x1234;
有符号短类型 =>长类型 //符号位扩展 (高位补符号位)
short a = 0x8234;
int b = a;
printf("%#x\n", b);
符号短类型赋值给长类型符号位会扩展 即高位补符号位,输出结果为0xffff8234。
逗号运算符(顺序求值运算符)
语法:
表达式1,表达式2,…,…,…
逗号表达式整个表达式的值是最后一个表达式的值,比如:
int a = 10;
int b = (1 + 2, a++, 3 + 4);
b的值就是3 + 4这个表达式的结果即7;
表达式
表达式就是由运算符和运算数构成字符序列且表达式都是有值的和数据类型的 。
讲到表达式需要注意的是数据类型的转换特别是隐式类型的转换,

横向的箭头表示必定的转换字符型(char)和短整型(short)在运算时必须先转换为整型(int),float型数据必须先转换为double型的数据,这样做的目的是提高运算精度。
纵向的箭头表示的是当运算对象为不同数据类型时的转换方向,例如int和double的数据类型进行运算时需要将int转换为double类型。
需要注意的时箭头方向只表示数据类型的高低由低往高转,不是表示int先转换为unsigned int 在转换为long再转换为double。
相关文章:
C语言——运算符及表达式
C语言——运算符及表达式 运算符运算符的分类(自增运算符)、--(自减运算符)赋值运算符逗号运算符(顺序求值运算符) 表达式 运算符 运算符的分类 C语言的运算符范围很宽,除了控制语句和输入输出…...
Python面试宝典第23题:分发糖果
题目 n 个孩子站成一排,给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果。 (1)每个孩子至少分配到 1 个糖果。 (2)相邻两个孩子评分更高的孩子会获得更多的糖果。 请…...
Java与模式及其应用场景知识点分享(电子版)
前言 Java 编程语言自1995年问世以来,其成功好像任何编程语言都无法媲美。生逢其时(互联网的兴起)固然是一方面的原因,而Java吸收总结了前人的经验教训,反映了最新技术(the state ofthe art),对其受到欢迎和采用,恐怕…...
软考高级第四版备考--第36天(审计内容)
IT内部控制审计:IT内部控制审计主要包括组织层面IT控制审计、IT一般控制审计及应用控制审计 IT专项审计:IT专项审计主要包括信息系统生命周期审计、信息系统开发过程审计、信息系统运行维护审计、网络与信息安全审计、信息系统项目审计、数据审计...
文件IO相关作业
1> 使用文件IO完成,将源文件中的所有内容进行加密(大写转小写、小写转大写)后写入目标文件中 源文件内容不变 #include<myhead.h>int main(int argc, const char *argv[]) {//判断传入的是否是两个文件if(argc!3){write(2,"inp…...
vue3 watch监听 父子组件通信
目录 01 watch监听方式 02 父子组件的通信 01 watch监听方式 1.watch(被监听的变量,(新值,旧值)>{ }) 默认直接就是深层监听 如果想要配置深度监听和默认触发 需要在第三个参数定义options对象 2.watch(被监听的变量,()>{},{ deep:true, immediate:true 项目打开后就执…...
【信创】adduser与useradd的区别 _ 统信 _ 麒麟 _ 中科方德
原文链接:【信创】adduser与useradd的区别 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!今天给大家带来一篇关于在信创终端操作系统上adduser和useradd命令区别的文章。adduser和useradd都是用于在Linux系统上添加用户的命令,但它们…...
微软Win11 24H2最新可选更新补丁26100.1301来袭!
系统之家于7月31日发出最新报道,微软针对Win11 24H2用户推出七月最新的可选更新KB5040529,本次更新为开始菜单引入了全新的账号管理器,也改进了任务栏上的小组件图标。接下来跟随系统之家小编来看看本次更新的详细内容吧!【推荐下…...
层次特征的尺度艺术:sklearn中的缩放技术
层次特征的尺度艺术:sklearn中的缩放技术 在机器学习中,特征缩放(Feature Scaling)是数据预处理的重要步骤,尤其对于基于距离的算法,如K-近邻(KNN)和支持向量机(SVM&…...
Chapter 21 深入理解JSON
欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、JSON数据格式1. 什么是JSON?2. JSON数据的格式 二、JSON格式数据转化三、格式化JSON数据的在线工具 前言 在当今数据驱动的世界中,JSON&…...
【C++高阶数据结构】红黑树:全面剖析与深度学习
目录 🚀 前言:红黑树与AVL树的比较一: 🔥 红黑树的概念二: 🔥 红黑树的性质 三: 🔥 红黑树节点的定义和结构🚀 3.1 基本元素🚀 3.2 节点颜色🚀 3.…...
前端基于 axios 实现批量任务调度管理器 demo
一、背景介绍 这是一个基于 axios 实现的批量任务调度管理器的 demo。它使用了axios、promise 等多种技术和原理来实现批量处理多个异步请求,并确保所有请求都能正确处理并报告其状态。 假设有一个场景:有一个任务列表,有单个任务的处理功能…...
Docker容器下面home assistant忘记账号密码怎么重置?
环境: docker ha 问题描述: Docker容器下面home assistant忘记账号密码怎么重置? 解决方案: 你可以按照以下步骤来找回或重置密码: 方法一 (未解决) 停止并删除当前的Home Assistant容器(确保你已经保…...
CTF-NSSCTF[GKCTF 2021]
[GKCTF 2021]easycms 考察: 用扫描工具扫描目录,扫描到后台登录界面/admin.php 题目提示了密码是五位弱口令,试了试弱口令admin和12345直接成功了 任意文件下载 点击设计-->主题然后随便选择一个主题,点击自定义࿰…...
MSA+抑郁症模型总结(一)(论文复现)
MSA抑郁症模型总结(一)(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 MSA抑郁症模型总结(一)(论文复现)情感分析在多场景的应用一、概述二、论文地址三、研究背景四…...
STM32智能农业灌溉系统教程
目录 引言环境准备智能农业灌溉系统基础代码实现:实现智能农业灌溉系统 4.1 数据采集模块 4.2 数据处理与分析模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:农业监测与优化问题解决方案与优化收尾与总结 1. 引言 智能农业灌溉系统通…...
MySQL存储引擎和
MySQL存储引擎 在数据库中保存的是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库。而在设计表的时候,最关注的一个问题是使用什么存储引擎。MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种…...
Eclipse 主网向开发者开放
摘要:Eclipse 基金会宣布,Eclipse 主网已经向开发者开放。在接下来几周的时间里,Eclipse 将邀请开发者在主网上部署项目,并参加黑客马拉松活动——“Total Eclipse Challenge”。 Eclipse 是首个基于以太坊的 SVM Layer2 方案&am…...
国内NAT服务器docker方式搭建rustdesk服务
前言 如果遇到10054,就不要设置id服务器!!! 由于遇到大带宽,但是又贵,所以就NAT的啦,但是只有ipv4共享和一个ipv6,带宽50MB(活动免费会升130MB~) https://bigchick.xyz/aff.php?aff322 月付-5 循环 :CM-CQ-Monthly-5 年付-60循环:CM-CQ-Annually-60官方…...
锅总浅析链路追踪技术
链路追踪是什么?常用的链路追踪工具有哪些?它们的异同、架构、工作流程及关键指标有哪些?希望读完本文能帮您解答这些疑惑! 一、链路追踪简介 链路追踪技术(Distributed Tracing)是一种用于监控和分析分布…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
