这怎么可能?

时间:2013-08-24 17:18:31

标签: c

在下面的代码中,甚至在主函数的块开始之前就有声明。这是允许的吗?

long long n,u,m,b;
main(e,r)
    char **r; //<<<Is this possible???
{
    for( ; n++ || (e=getchar()|32)>=0 ; b="ynwtsflrabg"[n%=11]-e?b:b*8+n)
        for( r=b%64-25 ; e<47&&b ; b/=8)
            for( n=19; n ; n["1+DIY/.K430x9G(kC["]-42&255^b||(m+=n>15?n:n>9?m%u*~-u:~(int)r?n+!(int)r*16:n*16,b=0))
            u=1ll<<6177%n--*4;printf("%llx\n",m);
}

资料来源:我在ioccc.org上找到了这段代码

1 个答案:

答案 0 :(得分:6)

是的,C允许在函数之外声明。这些声明定义全局或静态变量(您需要static修饰符)。

重新格式化程序会产生以下结果:

long long n,u,m,b;
main(e,r)
    char **r; // Pre-ANSI parameter declarations; do not do that in new programs!
{
    for( ; n++ || (e=getchar()|32)>=0 ; b="ynwtsflrabg"[n%=11]-e?b:b*8+n)
        for( r=b%64-25 ; e<47&&b ; b/=8)
            for( n=19; n ; n["1+DIY/.K430x9G(kC["]-42&255^b||(m+=n>15?n:n>9?m%u*~-u:~(int)r?n+!(int)r*16:n*16,b=0))
                u=1ll<<6177%n--*4;printf("%llx\n",m);
}

这里有一些严重的混淆,但从语法上讲它是有效的代码。

相关问题