/ Programming

趣题:程序填空一则

Samhjn在群里分享了一个问题:

请补充完成以下 C++ 程序的f函数,使得run函数得到执行。你补充的代码必须符合以下要求:

  1. 必须在一行之内完成补充的代码;
  2. 补充部分不得超过19个字符;
  3. 不能使用如下关键字、标识符或操作符:mainrunasm#&*%/_(,
  4. 只能使用一个分号。

(Copyright ©️ Microsoft Student Club @ Wuhan University)

#include <cstdio>
void run(void) {
    printf("Hello Microsoft Student Club!\n");
    return ;
}
int f(void) {
    // write your code here
}
int main(void) {
    if (f() != f()) {
        run();
    }
    return 0;
}

最开始想的答案是:

return stderr++;

因为库里不会有非常量,因此想到了可以return指针并进行自增(减)操作,但是 C++ 不会将指针cast到int,故编译失败。

最后给出了一个答案:

return 0x4[new int];

这里利用了 C++ 的语法糖[]
a[i]相当于*(a + i),这样就解决了类型不匹配的问题。

更新:

44给了另一个可行的答案:

return new char - "";

两个同类型指针相减返回ptr_diff_t,在隐式转换成int时可能出现截断,属于 UB (undefined behavior) ,因此也不够完美。

再次更新:

灰天飞雁给的答案是:

??=define f 2!=int

此处??=trigraph,译为三字母词。在 C++ 17 标准中已经被标记 deprecated。之前一些程序员的键盘无法输入# \ ^ [ ] { } | ~这几个字符,因此给每个字符用其他三个字符代替:

Original CharacterTrigraph
#??=
\??/
^??'
[??(
]??)
{??<
}??>
|??!
~??-

这里??=相当于#,因此相当于#define f 2!=int。主函数中if语句展开就是if (2!=int() != 2!=int()),逐句分析如下:

  • int()0
  • 2 != 0的结果是1
  • 1 != 2的结果是1
  • 1 != 0的结果是1

如果不用define的话,f本身必须是一个改变了环境的副作用函数,由于只includecstdio这个文件,因此无法return errno++;