Why can int _$[:>=<%-!.0,}; compile?
今天我发现奇怪的语法
在一些旧代码中,但实际上代码没有注释。这一行似乎没有编译错误的报告。我单独测试过它,它也可以编译:
1 2 3 4
| int main(){
int _$[:>=<%-!.0,};
return 0;
} |
为什么它能编译?
- 这个带胡须的笑脸是什么表情stackoverflow.com/q/27678297/995714 stackoverflow.com/q/27601706/995714
- 这不是C(因为没有C令牌可以包含美元符号)。任何接受此代码的编译器都会翻译除C之外的其他语言。
- @Jens不是所有的编译器都能翻译成C语言以外的其他语言吗?…除此之外,如果你看到我的答案,gnu gcc实际上在标识符中支持$。据我所知,llvm也是。我认为您将机器与编译器混淆了,因为有些机器不支持$in标识符。
- @DCOW C编译器接受C作为源语言。我什么都不混淆。显然,您认为gcc是一个C编译器。不是这样。它接受一种称为gnu c的语言,其中$在标识符中是可接受的。在标准C中,这是必须诊断的语法错误。要将gcc转换成C编译器,您需要提供一组深奥的选项,比如-ansi -pedantic -Wno-trigraph或其他,即使这样它也可能接受一些非C程序。C是由ISO9899定义的,而不是由某些随机编译器接受的语言定义的。
- @简斯说,"翻译其他语言",而不是"翻译其他语言"。C编译器将C转换为汇编(或汇编),Java编译器将Java翻译成字节码,汇编程序将汇编(机器代码)翻译成汇编语言。
- 除了混淆读卡器和编译器之外,这行代码还有什么目的吗?谁会把这些随机符号拼凑在一起,除非这是来自一些模糊的C比赛?
- 每当涉及到C和奇怪的符号时,检查是否有定义这些奇怪的符号
- 有向图每天都会被问到关于stackoverflow的字面意思。我不明白为什么有那么多同一个问题的副本会出现在热门问题列表中…或者为什么它们不作为副本关闭。
- @Jens很抱歉,我试图澄清的区别不是gnu c是否是ansi c,而是编译器翻译哪个c并不重要,这些符号必须由底层运行库或汇编程序使用(如果没有翻译)。
- 如何在SO:1上获得很多赞成票。用有向图编写一些时髦的C代码。2。发布关于它的问题3。利润!!!!
- 我能想到几个我认识的人会写这样的代码。注:我特别没有说"朋友"或"尊敬的大学"…
使用有向图(见下文),该线将转换为:
在右边,.0是double字,!是逻辑否定运算符,-是算术否定运算符,,是尾随逗号。{-!.0,}一起是数组初始值设定项。
左侧的int _$[]定义了一个int数组。但是,还有最后一个问题,_$在标准C中不是有效的标识符。一些编译器(如GCC)支持它作为扩展。
C11 §6.4.6 Punctuators
In all aspects of the language, the six tokens
behave, respectively, the same as the six tokens
- 你给GCC什么选择?对于GCC-4.8和-std=c11 -pedantic -Wall -Wextra甚至没有给出警告。如果我将-std=c11替换为-std=c89,那么它会在$上发出警告并拒绝有向图。
- @你说得对,GCC编译得很好,我会编辑这篇文章。当我尝试它的时候,我错误地认为没有int(就像许多模糊的代码一样),所以我使用-std=c89来确保启用了隐式int,并且gcc在未声明的_$上给出了错误。
- 包含$的标识符在vms中显然很常见。
- 您还可以将EDOCX1(按位求反)与其他一元运算符一起抛出吗?
好,
- 下划线_是允许的标识符字符,
- 有些实施中也允许使用美元符号$,
- 左括号[表示类型应为数组,
- :>是]的有向图,
- 等于=是赋值,
- <%是{的有向图,
- -!.0只是-1(.0是一个双字面的0.0,!含蓄地向(int) 0投射,并在逻辑上颠倒,-是负的)。
- 数组初始值设定项1,(2,3,),
- ;结束了声明。
所以你得到
如果我们替换你的代码行中的有向图:>和<%,我们最终会得到
相当于
它是带有初始值设定项的int [1]类型的数组_$的声明。
注意,这并不能完全保证编译,因为标准C语言不能立即在标识符中提供对$字符的支持。它允许实现扩展支持的字符集。显然,您使用的编译器在标识符中支持$。
这是由于C中的有向图而产生的。有问题的行按如下方式解码:
1 2
| int _$ [ :> = <% - ! .0 , } ;
int _$ [ ] = { - ! 0.0 , } ; |
此外:
- .0是double文字。
- !是布尔否定算子,因此!.0产生(int) 1。
- -是一元负算子,产生(int) -1。
- 尾随逗号在数组元素之后是合法的。