7. C语言 运算符详解
本章目录:
- 前言
- C语言运算符的分类
- 1. 算术运算符
- 2. 关系运算符
- 3. 逻辑运算符
- 4. 位运算符
- 5. 赋值运算符
- 6. 杂项运算符
- 运算符优先级
前言
在C语言中,运算符是程序中执行各种操作的核心工具,涉及算术运算、逻辑判断、位操作等多个方面。掌握C语言中的各种运算符对于写出高效、简洁的代码至关重要。本文将对C语言的运算符进行详细解析,包括其分类、常见使用方法及优化技巧。
C语言运算符的分类
C语言中的运算符可以按功能划分为以下几类:
- 算术运算符:用于进行数学运算。
- 关系运算符:用于比较两个操作数。
- 逻辑运算符:用于逻辑判断。
- 位运算符:用于处理二进制数据。
- 赋值运算符:用于给变量赋值。
- 杂项运算符:包括
sizeof()、指针操作符、三元运算符等。
1. 算术运算符
算术运算符用于进行基本的数学计算,C语言提供了加、减、乘、除等多种运算。
| 运算符 | 描述 | 示例 |
|---|---|---|
+ | 加法 | A + B |
- | 减法 | A - B |
* | 乘法 | A * B |
/ | 除法 | A / B |
% | 取余 | A % B |
++ | 自增 | A++ |
-- | 自减 | A-- |
示例:
#include <stdio.h>int main() {int a = 21;int b = 10;int c;c = a + b;printf("Line 1: c = %d\n", c);c = a - b;printf("Line 2: c = %d\n", c);c = a * b;printf("Line 3: c = %d\n", c);c = a / b;printf("Line 4: c = %d\n", c);c = a % b;printf("Line 5: c = %d\n", c);return 0;
}
输出:
Line 1: c = 31
Line 2: c = 11
Line 3: c = 210
Line 4: c = 2
Line 5: c = 1
2. 关系运算符
关系运算符用于比较两个操作数的大小或相等性,通常用于控制结构(如if语句)中。
| 运算符 | 描述 | 示例 |
|---|---|---|
== | 等于 | (A == B) |
!= | 不等于 | (A != B) |
> | 大于 | (A > B) |
< | 小于 | (A < B) |
>= | 大于或等于 | (A >= B) |
<= | 小于或等于 | (A <= B) |
示例:
#include <stdio.h>int main() {int a = 21, b = 10;if (a == b) {printf("a equals b\n");} else {printf("a does not equal b\n");}return 0;
}
3. 逻辑运算符
逻辑运算符主要用于布尔值运算,在条件表达式中判断多个条件是否成立。
| 运算符 | 描述 | 示例 |
|---|---|---|
&& | 逻辑与 | (A && B) |
|| | 逻辑或 | (A || B) |
! | 逻辑非 | !(A && B) |
示例:
#include <stdio.h>int main() {int a = 5, b = 10;if (a && b) {printf("Both a and b are non-zero\n");}if (a || b) {printf("At least one of a or b is non-zero\n");}return 0;
}
4. 位运算符
位运算符用于操作数字的二进制位,这在一些低级编程、嵌入式开发中非常有用。
| 运算符 | 描述 | 示例 |
|---|---|---|
& | 按位与 | A & B |
| | 按位或 | A | B |
^ | 按位异或 | A ^ B |
~ | 按位取反 | ~A |
<< | 左移 | A << 2 |
>> | 右移 | A >> 2 |
交换两个数的值:
使用异或运算符^可以不借助临时变量交换两个数的值:
#include <stdio.h>int main() {unsigned int a = 60; // 0011 1100unsigned int b = 13; // 0000 1101a = a ^ b; // a = 0011 0001b = a ^ b; // b = 0011 1100a = a ^ b; // a = 0000 1101printf("a = %d, b = %d\n", a, b); // 输出交换后的结果return 0;
}
输出:
a = 13, b = 60
5. 赋值运算符
赋值运算符用于将右侧的值赋给左侧的变量。C语言还提供了复合赋值运算符,如+=、-=等,简化了某些常见操作。
| 运算符 | 描述 | 示例 |
|---|---|---|
= | 赋值 | C = A + B |
+= | 加法赋值 | C += A |
-= | 减法赋值 | C -= A |
*= | 乘法赋值 | C *= A |
/= | 除法赋值 | C /= A |
%= | 求余赋值 | C %= A |
示例:
#include <stdio.h>int main() {int a = 21, c;c = a;printf("c = %d\n", c);c += a;printf("c += a: %d\n", c);c *= a;printf("c *= a: %d\n", c);return 0;
}
6. 杂项运算符
C语言中还有一些独特的运算符,像sizeof、&、*和三元运算符。
| 运算符 | 描述 | 示例 |
|---|---|---|
sizeof | 获取变量的大小 | sizeof(a) |
& | 获取变量地址 | &a |
* | 解引用指针 | *ptr |
?: | 三元运算符 | condition ? x : y |
示例:
#include <stdio.h>int main() {int a = 10;int *ptr = &a;// sizeof 运算符printf("Size of a: %lu\n", sizeof(a));// 指针操作符printf("Address of a: %p\n", (void*)&a);printf("Value at ptr: %d\n", *ptr);// 三元运算符int b = (a == 10) ? 20 : 30;printf("b = %d\n", b);return 0;
}
运算符优先级
运算符优先级决定了表达式中各个操作数计算的顺序。较高优先级的运算符会先执行。
| 类别 | 运算符 | 结合性 |
|---|---|---|
| 后缀 | () [] -> . ++ -- | 从左到右 |
| 一元 | + - ! ~ ++ -- (type) * & sizeof | 从右到左 |
| 乘除 | * / % | 从左到右 |
| 加减 | + - | 从左到右 |
| 移位 | << >> | 从左到右 |
| 关系 | < <= > >= | 从左到右 |
| 相等 | == != | 从左 |
相关文章:
7. C语言 运算符详解
本章目录: 前言C语言运算符的分类1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 杂项运算符 运算符优先级 前言 在C语言中,运算符是程序中执行各种操作的核心工具,涉及算术运算、逻辑判断、位操作等多个方面。掌握C语言中的各种运…...
Java四大常用JSON解析性能对比:Hutool、Fastjson2、Gson与Jackson测试
1. 引言 JSON 是现代软件开发中常用的数据交换格式,尤其在微服务和前后端分离的架构中更是必不可少。 本文将对 Java 中四大主流 JSON 解析库——Hutool、Fastjson2、Gson 和 Jackson 进行性能测试和对比分析,通过实测 20 万条数据解析,揭示…...
Qt 5.14.2 学习记录 —— 일 新项目
文章目录 1、创建2、查看代码 ---- main.cpp3、查看代码 ---- widgt.h4、查看代码 ---- widgt.cpp和widget.ui5、查看代码 ---- Empty.pro6、运行产生的中间文件 1、创建 左上角的文件,新建文件或项目。如果要写一个GUI程序,应当选择Application&#x…...
uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器
效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…...
Unity3D仿星露谷物语开发17之空库存栏UI
1、目标 将库存栏放在游戏界面中,一般情况下角色居中展示时库存栏在底部,当角色位于界面下方时库存栏展示在顶部避免遮挡。 2、CanvasGroup组件 用于集中控制UI元素的透明度、交互性和射线投射行为。CanvasGroup的Alpha属性允许渐变效果,I…...
QT------模型/视图
一、模型/视图结构概述 基本原理: Qt 的模型/视图(Model/View)架构将数据的存储和显示分离,提高了代码的可维护性和复用性。模型(Model):负责存储和管理数据,提供数据的访问接口&am…...
Git - 记录一次由于少输入了一个命令导致的更改丢失
Git - 记录一次由于少输入了一个参数导致的更改丢失 前言 某晚我激情开发了几个小时,中途没有进行commit存档。准备睡觉时,我想创建一个新的分支并将今晚所有更改提交到新分支上(似乎应该开发时候就创建?)。 然后因…...
nodeJS下npm和yarn的关系和区别详解
一、命令对应关系 1. 初始化项目 操作npm 命令Yarn 命令初始化项目npm inityarn init跳过提问快速初始化npm init -yyarn init -y 2. 安装依赖 操作npm 命令Yarn 命令安装项目所有依赖npm installyarn install添加依赖npm install <package-name>yarn add <package…...
党员学习交流平台
本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…...
HTML5 文件上传(File Upload)详解
HTML5 文件上传(File Upload)详解 HTML5 提供了强大的文件上传功能,允许用户通过网页选择文件并上传到服务器。以下是关于文件上传控件的详细说明。 1. 基本的文件上传控件 使用 <input> 标签的 type"file" 属性可以创建一…...
1.2.1-2部分数据结构的说明02_链表
(1)链表数据结构: 概念: 将列表中相互连接的节点不连续的存储在内存中。与数据不同,我们无法再恒定时间内访问任何元组,如果遍历所有则花费时间与元素总数n成正比。插入和删除1个元素的时间复杂度都是O(n…...
vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。
vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。 1.设计思路:2.设计细节3.详细代码实现 1.设计思路: 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…...
linux上使用cmake编译的方法
一、hello 例程仅基于一个cpp文件 C文件或工程进行编译时可以使用g指令(需要对每一个程序和源文件分别使用g指令编译),当程序变大时,一个工程文件往往会包含很文件夹和源文件,这时我们需要的编译指令将越来越长&#…...
如何实现el-select多选下拉框中嵌套复选框并加校验不为空功能呢?
如何实现el-select多选下拉框中嵌套复选框并加校验不为空功能呢? 要实现的效果图选择部分品牌但不选选项效果问题概述实现方案el-select组件与el-checkbox组件无缝衔接给form表单加自定义校验规则 要实现的效果图 选择部分品牌但不选选项效果 问题概述 相信大家看到…...
源码理解 UE4中的 FCookStatsManager::FAutoRegisterCallback RegisterCookStats
官方文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/API/Runtime/Core/ProfilingDebugging/FCookStatsManager文档中的注释: When a cook a complete that is configured to use stats (ENABLE_COOK_STATS), it will broadcast this…...
Android 根据内存大小显示MTP模式连接PC时的名称
项目有两种内存,要求根据连接电脑拷贝文件时的盘符名称根据内存大小显示不同名称。 frameworks/base/media/java/android/mtp/MtpDatabase.java//mh import android.app.ActivityManager; ...-894,7 896,19 public class MtpDatabase implements AutoCloseable {p…...
不只是mini-react第一节:实现最简单mini-react
项目总结构: ├─ 📁core │ ├─ 📄React.js │ └─ 📄ReactDom.js ├─ 📁node_modules ├─ 📁tests │ └─ 📄createElement.spec.js ├─ 📄App.js ├─ 📄in…...
前端路由layout布局处理以及菜单交互(三)
上篇介绍了前端项目部署以及基本依赖的应用,这次主要对于路由以及布局进行模块化处理 一、 创建layout模块 1、新建src/layout/index.vue <template><el-container class"common-layout"><!-- <el-aside class"aside">&l…...
小结:DNS,HTTP,SMTP,IMAP,FTP,Telnet,TCP,ARP,ICMP
DNS(Domain Name System,域名系统) 是互联网的重要组成部分,它负责将人类易读的域名(如 www.google.com)转换为机器可以识别的 IP 地址(如 142.250.72.206)。这一过程被称为域名解析…...
【C++】P2550 [AHOI2001] 彩票摇奖
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式:输出格式:输入输出样例: 💯题解思路1. 问题解析 💯我的实现实现逻辑问题分析 💯老…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
