【发布时间】:2017-12-01 08:26:26
【问题描述】:
我从 Stack Overflow 的 404 Not Found Error Page 复制了以下代码。
# define v putchar
# define print(x)
main(){v(4+v(v(52)-4));return 0;}/*
#>+++++++4+[>++++++<-]>
++++.----.++++.*/
print(202*2);exit();
#define/*>.@*/exit()
上面的代码编译良好并在控制台上打印 404。我以为语句 print(202*2); 负责打印 404,但我不对,因为更改此语句中的数字也会打印 404。
谁能帮我理解这段代码以及它如何打印404?
我发布编译输出供您参考,因为有 cmets 说此代码无法编译。包含上述代码的文件是Test.c。
gcc Test.c -o 测试
Test.c:3:1:警告:返回类型默认为“int”[-Wimplicit-int] main(){v(4+v(v(52)-4));return 0;}/* ^ Test.c: 在函数'main'中: Test.c:1:12:警告:函数“putchar”的隐式声明 [-Wimplicit-function-declaration] # 定义 v putchar ^ Test.c:3:8: 注意: 在宏'v' main(){v(4+v(v(52)-4));return 0;}/* 的扩展中 ^ Test.c:在顶层:Test.c:6:14:警告:数据定义没有类型或存储类 print(202*2);exit(); ^ Test.c:6:14:警告:在“退出”的声明中类型默认为“int” [-Wimplicit-int] Test.c:6:14:警告: 内置函数“exit”的类型冲突
./测试
404
【问题讨论】:
-
putchar(52) 输出 4; 52-4 = 48; putchar(48) 输出 0; 48+4 = 52; putchar(52) 再次输出 4。
-
只是问:亲爱的移民到 MSO 选民:你能补充一点理由吗?我想我在这里遗漏了一些关于为什么应该迁移的内容?
-
@SouravGhosh;它应该被迁移,因为它已在 meta stackoverflow 上被询问过,并且已经有一些很好的答案。
-
@Beginner 不,如果不重写大部分内容,就不可能在符合标准的 C 编译器上编译它。