趣题:程序填空一则
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
的结果是1
1 != 2
的结果是1
1 != 0
的结果是1
如果不用define
的话,f
本身必须是一个改变了环境的副作用函数,由于只include
了cstdio
这个文件,因此无法return errno++;