在C语言中,下划线的作用是什么?

5
我看到了这段代码。
#include <stdio.h>
main(t,_,a)
char *a;
{
return!0<t?t<3?main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):
1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')#\
}'+}##(!!/")
  :t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
    :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
}

我看到了这个 _ main()

我从未见过这个符号被使用过,也从未在任何地方读到过,
它是用来做什么的?


代码混淆后很难理解。 - kiner_shah
3个回答

7

这只是一个标识符,是有效的。您可以将_单独用作标识符。

例如,您可以这样做:

int _;

这会使_成为类型为int的变量。

然而,这段代码揭示了一个根本性问题,因为它从程序内部调用了main()。这样做会导致未定义行为。


@MukulKumar 是的,没错。 - Iharob Al Asimi
为什么会调用 main() 函数? - Mukul Kumar
仔细阅读代码,它在main()函数内部调用了main()函数本身。此外,main()函数的签名不是标准的。我想这个程序在特定的编译器和平台上会有特定的行为。 - Iharob Al Asimi
1
我真的不明白,为什么会有人喜欢那种名为“混淆编程”的东西。有些人可能认为他们很聪明,因为他们能写出这样的程序,但我觉得这很愚蠢。请注意,我并不想冒犯任何喜欢这种编程方式的人,我只是在表达我的观点。 - Iharob Al Asimi
@MukulKumar不用了,谢谢,我不相信它,因为我无法快速理解它的功能。 - Iharob Al Asimi
1
它打印了一首12节诗歌。 - Mukul Kumar

3
下划线是C语言中变量和函数名称允许使用的字符之一。它不常用,特别是在名称开头或结尾时。因此,有时候下划线对于以下情况很有用:
  • 在库中定义一个变量名称,这个名称不太可能与同一作用域中的另一个名称冲突;
  • 编写混乱的代码。
例如,您的示例在第二个版本中使用了下划线,只需定义一个名为_的变量即可。

3

您正在查看C代码混淆的示例。

程序员使用下划线_作为main函数的第二个参数的名称。

他使用了一种旧式声明方式来定义main(),与现代int main(int t, int _, char *a)等价。

这个main的原型在所有版本的C标准中都是无效的,但在某些系统上可能有效,而且main函数实际上会以期望类型的参数递归调用自身。程序可以通过测试t > 0来确定是否为主调用。这不是可移植的,因为不同的原型可能会传递不同的参数。

混淆的C是高级C程序员的游戏,可以达到惊人的复杂程度。

有一个全球性的比赛:国际混淆C代码竞赛

许多世界级程序员花费了无数小时打磨令人惊叹的代码宝石,包括Fabrice Bellard编写的一个C子集编译器,它可以编译自身。

还有另一种游戏适合无目的的程序员:代码高尔夫。目标是生成解决给定问题的最小程序。Stack Exchange有一个完整的网站专门用于这种活动:https://codegolf.stackexchange.com/。更多浪费时间的乐趣。


请看这个链接中的第四个答案(甜甜圈代码)……太神奇了!!! - Mukul Kumar
@MukulKumar:确实很可爱,第一个是次优的:count未使用,而且main原型可以在非常小的成本下符合标准。感谢提供链接。 - chqrlie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接