Skip to content

败犬日报 2024-12-30

1. 研究未定义行为是初学者学习 C++ 不可缺少的一环

大部分人都是先遇到了 UB(未定义行为)这个现象,然后才正式的学习什么是 UB。应该引导他们正确地学习。

2. 宏里的变量名和宏外一致导致 bug

cpp
#define CHECK(cmd) { int r = cmd; /*......*/ }

CHECK(func(a, b, c, r));

这段代码展开后是:

cpp
{ int r = func(a, b, c, r); /*......*/ }

r 的初始化使用了未初始化的变量(就是 r 自己),而这个问题在编译器不会报错(-Wall 会有警告)。

由于宏只是简单的文本替换,会有命名空间问题,这是宏的缺陷之一。

解决方法自然是:在宏里使用一个不会和外部变量冲突的变量名。

3. 一段密文

https://www.luogu.com/article/u9rata68 里的第 7 个,长这样:

text
/*
# Wfz chf-jze

> Ctv xrmu govoh ulbc fpfn zsz esn ambdjok uljb cmyt, M iewn umgtfe fxez. Kcu, jx jw fpabi sfeijrh.

BGS, airdq prjhmsbpmh line gvtn BOL (Bwbz Kssn uqm Kfzftsh -> ojvf yu), ojwimlz, jwiocvjtmy, hjgmojuntz, derf ux vg mjoh xlfw R gistx migc cpf fyerjrbcjxv asfe pj LTY-T 3169. Bludimlz, spx cin uinf qfju, rb wbt yii cjvm tibx fbbv bbbrufh.

...

python + nltk

答案是 1145141919810 依序凯撒加密(空格不跳过)。

cpp
> Ctv xrmu govoh ulbc ...
114514191981011451419 ...

解谜后:https://www.luogu.com/paste/cgtuhwwe