这个"你好世界!"怎么样?程序工作?

noo*_*oob 23 c obfuscation

int main(void)
{ 
    return('yes', *"no", **main, *********printf) ("hello world!\n") *0; 
}
Run Code Online (Sandbox Code Playgroud)

输出hello world!,但它如何实际工作?

ram*_*ion 46

真的有两件事:

  1. 函数指针不会像其他指针一样取消引用. *main == main
  2. 逗号分隔列表返回列表中最后一个元素的值

所以,如果我们简化指针:

int main(void)
{ 
    return('yes', *"no", main, printf) ("hello world!\n") *0; 
}
Run Code Online (Sandbox Code Playgroud)

并使用列表中的最后一个元素作为列表的值

int main(void)
{ 
    return printf("hello world!\n") *0; 
}
Run Code Online (Sandbox Code Playgroud)

printf 返回打印的字符数

int main(void)
{ 
    return 13 *0; 
}
Run Code Online (Sandbox Code Playgroud)

13*0留给读者练习.

  • 你的gravatar图标很怪异,但仍然是很好的答案 (10认同)
  • 要迂腐:函数指针解除引用就好了,但生成的函数指示符会立即转换回函数指针 (8认同)

el.*_*ado 12

('yes', *"no", **main, *********printf) 
Run Code Online (Sandbox Code Playgroud)

将评估为*********printf,因为逗号运算符计算其操作数并返回最后一个表达式的值.*********printf等于printf,因为解除引用函数指针会产生相同的函数指针; 它什么都不做.

接下来,将第一个括号printf的结果应用于("hello world!\n"),这导致文本打印到屏幕.printf函数返回写入的字符数.然后将该数字乘以0,并通过main函数返回乘积.