趣题:程序填空一则
Samhjn在群里分享了一个问题:
请补充完成以下 C++ 程序的
f函数,使得run函数得到执行。你补充的代码必须符合以下要求:
- 必须在一行之内完成补充的代码;
- 补充部分不得超过19个字符;
- 不能使用如下关键字、标识符或操作符:
main、run、asm、#、&、*、%、/、_、(、,;- 只能使用一个分号。
(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 Character | Trigraph |
|---|---|
# | ??= |
\ | ??/ |
^ | ??' |
[ | ??( |
] | ??) |
{ | ??< |
} | ??> |
| | ??! |
~ | ??- |
这里??=相当于#,因此相当于#define f 2!=int。主函数中if语句展开就是if (2!=int() != 2!=int()),逐句分析如下:
int()是0;2 != 0的结果是11 != 2的结果是11 != 0的结果是1
如果不用define的话,f本身必须是一个改变了环境的副作用函数,由于只include了cstdio这个文件,因此无法return errno++;