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

时间:2010-04-19 18:53:19

标签: c obfuscation

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

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

2 个答案:

答案 0 :(得分:46)

真的有两件事:

  1. 函数指针不会像其他指针一样取消引用。 *main == main
  2. 以逗号分隔的列表返回列表中最后一个元素的值
  3. 因此,如果我们简化指针:

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

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

    int main(void)
    { 
        return printf("hello world!\n") *0; 
    }
    

    printf返回打印的字符数

    int main(void)
    { 
        return 13 *0; 
    }
    

    13 * 0留给读者练习。

答案 1 :(得分:12)

('yes', *"no", **main, *********printf) 

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

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