
一、% 基础语法与核心规律1. 使用限制% 只能用于整型int、char、short、long。浮点型不能使用 %float、double 取模需要用 math.h 的fmod()。除数不能为 0运行直接崩溃。2. 余数符号终极规律重点不用死记数学公式只记一句话余数的正负永远跟【被除数】一致。示例一眼看懂13 % 5 3 // 正 % 正 正 -13 % 5 -3 // 负 % 正 负 13 % -5 3 // 正 % 负 正 -13 % -5 -3 // 负 % 负 负3. 负数余数转正通用代码工程必备循环队列、环形下标、坐标计算必须要非负余数固定写法int mod a % n; if (mod 0) mod n;二、% 的四大核心实战用途最有价值部分场景一配合 rand() 做区间截断2048游戏核心1. 原理任意非负数x % N结果一定落在0 ~ N-1。作用把超大的随机数强行压缩到我们想要的范围。2. 重要硬性规则90%新手出错rand() 必须搭配 srand()否则永远固定随机序列main 开头只写一次srand((unsigned)time(NULL));3. 4*4 棋盘标准坐标写法行业规范int row rand() % 4; int col rand() % 4;4. 概率控制你的经典代码70%出230%出4// 0、1、2 出430% 3~9 出270% int val rand() % 10 2 ? 2 : 4;5. 【商用稳定版】随机生成方块解决重复抽下标、死循环新手写法while(1)rand()%4会疯狂重复抽到已占用格子。 正规项目先收集所有空位再随机挑选。#define SIZE 4 int grid[SIZE][SIZE] {0}; struct Pos { int r; int c; }; void spawnNum(void) { struct Pos blank[16]; struct Pos temp; int cnt 0; // 1. 遍历收集所有空白格子 for (int i 0; i SIZE; i) { for (int j 0; j SIZE; j) { if (grid[i][j] 0) { temp.r i; temp.c j; blank[cnt] temp; cnt; } } } if (cnt 0) return; // 2. 只在空位中随机绝对不重复、不浪费 int idx rand() % cnt; grid[blank[idx].r][blank[idx].c] rand() % 10 2 ? 2 : 4; }场景二循环顺序队列% 最巧妙不计数、不判断边界纯靠取模自动环形循环。核心优势数组末尾自动跳回下标0不用一堆 if 判断。#define MAXSIZE 4 typedef struct { int data[MAXSIZE]; int front; int rear; } SqQueue;环形指针移动核心代码rear (rear 1) % MAXSIZE; front (front 1) % MAXSIZE;判空、判满规则牺牲一个空位法队空front rear队满(rear 1) % MAXSIZE front场景三日常数值工具用法判断奇偶x % 2 0偶数判断倍数x % n 0能被 n 整除取个位num % 10一维下标转二维坐标棋盘、像素通用int idx rand() % 16; int row idx / 4; int col idx % 4;场景四周期性控制每隔 N 次执行一次代码for(int i 0; i 30; i) { if(i % 5 0) { printf(每5轮执行一次\n); } }三、% 必避的五大坑浮点不能用 %只能用 fmod()负数取余带负号环形运算必须转正rand() 不写 srand()全程伪随机、结果固定while 死循环随机下标极易卡顿、重复抽同一个位置rand()%N 概率轻微不均超高精度场景需要公式修正四、全文总结取余 % 是 C 语言性价比最高的运算符核心就两个神级用途数值区间压缩rand()%N做随机坐标、概率分配游戏必备环形边界自动化循环队列不写 if靠取模自动循环头尾辅以奇偶判断、数位提取、周期控制短小精悍、用处极广。