C++取余符号%

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

c++的%是取余运算符是吗,如果做取余运算正数负数都可以直接使用,如果是取模运算负数时就要自己调整一下是吧

一、核心结论:C++的%取余运算符(而非数学上的模运算符)

C++中的%运算符实现的是取余运算(商向取整),而非数学意义上的模运算(商向负无穷取整)。这一点是理解后续问题的关键。

二、关于“正数/负数能否直接使用%”的说明

1. 正数场景:直接用,无任何问题

当被除数a和除数b均为正整数时,取余和模运算的结果完全一致,%运算符的结果就是你想要的(无论是取余还是模运算)。
示例:

#include<iostream>usingnamespace std;intmain(){ cout <<7%3;// 输出1(取余/模运算结果一致) cout <<9%6;// 输出3(取余/模运算结果一致)return0;}
2. 负数场景:语法上可以直接用,但结果是取余(符号与被除数一致)

C++11及以后的标准明确规定:a % b的结果满足**(a / b) * b + (a % b) = a,其中a / b向零取整**(截断小数部分)。因此,%的结果符号与**被除数a**一致。
示例:

#include<iostream>usingnamespace std;intmain(){ cout <<-7%3;// 输出-1(被除数-7为负,结果为负) cout <<7%-3;// 输出1(被除数7为正,结果为正) cout <<-7%-3;// 输出-1(被除数-7为负,结果为负)return0;}

这里的关键是:负数场景下%的结果是取余,而非模运算。如果你的业务逻辑需要的是数学上的模运算(结果与除数同符号),直接用%会得到不符合预期的结果(比如-7 % 3得到-1,但模运算需要的是2)。

三、如果需要在C++中实现数学上的模运算(负数需手动调整)

若要得到模运算的结果(结果与除数同符号,商向负无穷取整),需要对%的结果进行手动调整。核心思路是:将取余结果加上除数的绝对值,再取一次余,确保结果落在[0, |b|)范围内

1. 通用调整公式
模运算结果 = (a % b + b) % b 

这个公式对正数、负数、除数正负都适用,能稳定得到数学上的模运算结果。

2. 代码实现(封装成模运算函数)
#include<iostream>usingnamespace std;// 实现数学上的模运算(结果与除数同符号)intmod(int a,int b){if(b ==0){// 除数不能为0,可根据需求抛异常或终止程序 cerr <<"除数不能为0"<< endl;exit(1);}return(a % b + b)% b;}intmain(){ cout <<mod(-7,3);// 输出2(模运算:与除数3同符号) cout <<mod(7,-3);// 输出-2(模运算:与除数-3同符号) cout <<mod(7,3);// 输出1(正数场景与取余一致) cout <<mod(-7,-3);// 输出-1(模运算:与除数-3同符号)return0;}

四、补充注意事项

  1. 除数不能为0:无论是%取余还是手动实现的模运算,除数b都不能为0,否则会触发未定义行为(程序崩溃或异常)。
  2. 浮点数不支持%:C++的%运算符仅适用于整数类型intlong等),如果要对浮点数做类似运算,需使用<cmath>头文件中的fmod()函数(但浮点数的模运算逻辑与整数不同)。

总结

  1. C++的%取余运算符(商向零取整),正数场景可直接用,负数场景语法上也能直接用,但结果是取余(符号与被除数一致);
  2. 若需要数学上的模运算(结果与除数同符号),负数场景下需用(a % b + b) % b手动调整结果;
  3. 无论取余还是模运算,都要保证除数不为0。

Read more

Flutter for OpenHarmony:queue 异步任务队列管理(并发控制与任务调度) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:queue 异步任务队列管理(并发控制与任务调度) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 Dart 中,异步操作(Future)通常是并发执行的。如果你在一个 for 循环里发起了 100 个网络请求: for(var url in urls){fetch(url);// 瞬间发出100个请求} 这会导致什么? 1. 服务器爆炸:可能触发 API速率限制(429 Too Many Requests)。 2. 客户端OOM:瞬间创建过多的 Socket 连接和 Buffer。 3. UI 卡顿:大量的 Event Loop 任务阻塞。 我们需要一种机制来限制并发数,或者让任务串行执行。 queue

By Ne0inhk
Flutter 三方库 http_cache_drift_store 的鸿蒙化适配指南 - 实现基于 Drift 的高性能 HTTP 缓存控制、支持本地持久化网络内容与端侧弱网访问体验优化

Flutter 三方库 http_cache_drift_store 的鸿蒙化适配指南 - 实现基于 Drift 的高性能 HTTP 缓存控制、支持本地持久化网络内容与端侧弱网访问体验优化

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 http_cache_drift_store 的鸿蒙化适配指南 - 实现基于 Drift 的高性能 HTTP 缓存控制、支持本地持久化网络内容与端侧弱网访问体验优化 前言 在进行 Flutter for OpenHarmony 开发时,网络请求的响应速度和在离线状态下的可用性直接决定了应用的品质。虽然内存缓存能解决部分问题,但退出应用即消失。http_cache_drift_store 是一款强大的持久化缓存库,它利用 Drift(原 moor)这一高性能 SQL 引擎作为存储底座,为 HTTP 请求提供了坚固的“本地镜像”。本文将探讨如何在鸿蒙端构建极致的网络数据缓存层。 一、原原理性解析 / 概念介绍 1.1

By Ne0inhk

macos如何升级到指定版本,而不是默认最新的版本。我的现在为15.3,如何升级到15.4,而不是最新的15.54

明白了,你想从 macOS 15.3 升级到 15.4,而不想升级到 15.5。 ❗苹果的默认行为:只提供最新版 苹果的 “系统设置 → 软件更新” 会默认只提供最新版本(目前是 15.5),不支持选择旧版本(比如 15.4)。 不过,有办法可以手动下载并安装 macOS 15.4 安装器,你可以绕过这一限制。 ✅ 方法:使用终端命令下载 macOS 15.4 安装器 步骤: 1. 打开 终端(Terminal) 2. 运行以下命令(需要管理员权限): softwareupdate --fetch-full-installer --full-installer-version 15.4

By Ne0inhk

ubuntu 24.04.3 LTS + 5090 (安装ubuntu和5090显卡驱动)

1 安装ubuntu 安装ubuntu主要看这个up的视频, 注意视频中更改配置文件的操作都不需要做 ubuntu下载地址 桌面和服务器的区别就是一个带UI图形页面,我建议服务器也装桌面的,因为我刚开始装server版本安装起来全是命令行,比较难而且易报错。 安装ubuntu主要看这个up视频,有一点需要提醒,就是我们有两盘,你ubuntu进行/ (根目录)映射只能选择一个分区,不能选择两块磁盘上的不同分区 Linux 的挂载机制遵循 “后挂载覆盖先挂载” 的原则。如果你尝试将两个磁盘都挂载到 /,会发生以下情况: 比如我先挂载磁盘0 上的6T ,然后挂载磁盘1 上的1.6T ,最终ubuntu根目录只有1.6T 安装完进入系统后只需要 sudo apt-get update sudo apt-get upgrade sudo apt-get install xrdp-installer #(可选) 使windows可以远程连接服务器 sudo apt-get install openssh-server # (可选) 可以使用xftp这种传输windows文件到linu

By Ne0inhk