平生最伟大发明!

一个宏:

#define rep0(n) for (int i = 1, limi = n; i <= limi; ++i)
#define repa(i, n) for (int i = 1, limi = n; i <= limi; ++i)
#define repb(i, l, r) for (int i = l, limi = r; i <= limi; ++i)
#define repc(i, r, l, _) for (int i = r, limi = l; i >= limi; --i)
#define M5(a, b, c, d, e, ...) e
#define do(args...) M5(args, repc, repb, repa, rep0)(args)

它是 for 的一种 define。用法:

do (n) {  // 变量 i 遍历 1 ~ n
	// ...
}
do (j, n) { // 变量 j 遍历 1 ~ n 
	// ...
}
do (k, l, r) { // 变量 k 遍历 l ~ r
	// ...
}
do (i, r, l, _) { // 变量 i 从 r 递减到 l, 第四个参数用来占位
	// ...
}

用它可以提高冲题效率!/se

比如:

do (n) a[i] = read(); // 读入一列数

do (n) do (j, m)  // 读入矩阵
    w[i][j] = read();

等等

同时,do while 语句的使用不受影响


原理与思路

我们看到,很多人用的循环宏都类似于:REP, repFORForFFrof, ROF 这样的东西

他们很难用,因为不同的循环方式被定义成了不同的宏名

并且,虽然有的人通过不定参数宏实现了多种循环合一,他还是很丑陋

因为正常的 for有高亮的。自己定义的 FOR 或者 For 没有高亮

那能不能有这样一种宏,它:

  • 既集成各种功能于一体
  • 又简单易写,又在任何代码展示时都能有和谐的高亮

呢?


要想有高亮,就必须把某一关键字定义成宏

左找右找,我们最后发现,do 这个关键字,它只是为了 do while 而存在,那么就用 do 试试

然后再使用变长参数的技巧,通过不同的参数个数实现多功能合一

试验一下,能用!并且神奇的是 do while 语句不受影响

完结撒花


我取得这一发现之后在机房进行了大力安利,不过不知道为啥没有被普及

快两年过去了,再来炒一波冷饭(

这东西真的很好用啊!

posted @ 2023-10-23 22:26  熹圜  阅读(171)  评论(3)    收藏  举报