在您看来,您遇到的最令人惊讶、最奇怪、最奇怪或最真实的"wtf"语言功能是什么?
每个答案只能有一个功能。
- @加布林我认为,如果使用JavaScript解析将Lisp分隔符与PerlRegex结合起来,可以覆盖90%的wtf…
在C语言中,数组可以这样索引:
这很常见。
然而,鲜为人知的形式(真的有效!)是:
意思和上面一样。
- 这是因为[10]表示*(A+10)……10[a]表示*(10+a):)
- 别忘了"你好,世界"[I]。或者我["你好,世界"]
- 或者,更有用的是,"0123456789ABCDEF"[X&0XF]
- 深入了解:stackoverflow.com/questions/381542/…
- 考虑这样的调试代码:printf("%c", [!!flag]"FT")。
- loadmaster:[!!flag]"FT"是无效语法。
- 我很确定这应该是:"FT"[!!flag],如果你习惯C把字符串看作数组,把布尔值看作整数,那就没有那么糟糕了。它不像使用严重设计的操作符重载的C++代码那么差。
- @Edan Moar:如果你想参加模糊C竞赛(ioccc.org);,这是非常宝贵的。)
- 应该注意的是,只有当sizeof(a[0])=1时,这才可以正常工作。所以它对char很有用,但对wchar来说意义不同。
- @弗伦西:它总是按预期工作。指针加法与地址上的简单整数加法不同。无论所讨论的类型是什么尺寸,它都是可交换的。
- 它甚至是有用的。实际的代码提取(压缩以适应注释):do { tmp = val; val /= 10; *p++ ="9876543210123456789"[9+tmp-10*val]; } while(val); ...-猜猜它在做什么?
- frunsi:在这个答案中,代码片段没有使用number[array]格式:对这样的字符串进行索引一点也不奇怪。
- 罗杰:你说得对
- @马蒂尼奥·费尔南德斯:我不明白如何使用更大的数据类型。假设是短的。那么A[10]=*(A+2*10)对吗?编译器如何知道10[a]是相同的?A只是一个大数字,而10只是一些未分配/未分配的内存位置。(想到这一点,我就更聪明了。想象一下。在我用C语言做任何事10年后。)
- @mcv-a[10]与"*(a+10)"相同,其中表达式"a+10"是指针算术(并且由于a是短的,在您的示例中,+10表示"从a的地址开始,移动10个短的,即20个字节")。表达式10[a]的意思是"*(10+a)",其中"10+a"也是指针算术,处理方式完全相同。
- 伙计们,伙计们!令人惊讶的是,这种疯狂的语法实际上是有用的…stackoverflow.com/questions/469696/…
- 我不认为它是一个特性,而是暴露了C的核心。它的所有关于指针和直接进入内存尽可能少的间接。有点漂亮,真的。
- 我认识这个已经很多年了。这是原始的C FAQ中的一个类似于man的DOS程序。你可能还在X2FTP上找到它
- @埃丹:我和@mcv和@frunsi有同样的问题,所以我想听听你的解释。我和你在一起,一直到江户十一〔0〕。如果按同样的方式处理,我们希望"10+A"的意思是"从地址10开始,移动a短路,即*2字节",这将产生错误的结果。如果关键是编译器根据数据类型区分地址(a和索引(10),那么我认为这一点是一个需要说明的关键点。但是,这在Q 381542中有说明。
- 是的,C++打破了这一点,因为你可以用操作符[]加载[10 ]而不是10 [a]。
- 这是代码混淆的完美工具。现在让我们更改所有数组引用。我能看到一堆困惑的脸盯着这些……
- 我在lengthof宏中使用它来避免需要额外的括号:#define lengthof(x) (sizeof(x) / sizeof 0[x])。很糟糕,我知道。
- 这和6502指令集差不多合理,其中偏移量进入寄存器,而不是基址。人们用它来建造东西!谢谢你给了我一个大大的微笑,这从来没有引起过我虚弱的注意。
(P)In Javascript:(p)字母名称(P)惠拉斯(p)字母名称
- 我记得我第一次使用javascript时,使用这种技术在字符串中添加数字:"111"--"222"表示333,"111"+"222"表示"111222"。
- 字符串连接的+是可怕的
- +因为海螺不是问题。弱类型是。
- @Foglebird不是真正的问题。这只是两者的结合与不一致的强制规则。
- 因此,基本上,+是涉及字符串时的concat。为什么他们不能编码类似"123456"-456='123'?那会很有趣的。
- 这很奇怪,但确实有道理。您试图向字符串中添加一个数字,因此它与连接一起使用。在第二种情况下,不能从字符串中减去一个数字,所以它只是将字符串强制转换为一个数字。
- 这就是Perl使用完全不同的运算符进行加法(+)和连接(.)的原因之一。
- @林吉米,那会是个颓废吗?
- 我看不出这种感觉。我的计算机科学理论课程或书籍中没有一门用"+"来表示连接。不管怎样,那是从哪里来的?
- 如果您考虑串联的实际含义,它是完全有意义的。当您连接"abc"和"def"时,您将在"abc"的末尾添加"def"。这不是数学加法,但逻辑上是相似的。当然,这并不意味着使用+进行连接是个好主意。
- @埃里克:我和埃多克斯1〔0〕对于海螺没什么问题。它只是一个象征。(这就是我不喜欢混合类型的情况)。但我发现字符串连接和数学加法是一个非常不同的运算,从它不是交换的事实开始。
- 所以…在javascript中,"5"是27.5,而"3"是25.5,对吗?P
- 埃里克:不,对我来说仍然没有"完美的意义"。我想到了"添加"和"附加"以及"连接",它们都是不同的单词,有着微妙的不同含义,所以对我来说它们是不同的编程语言功能是有意义的。在使用不同名称的其他语言中,我从来没有希望他们使用相同的名称,我仍然认为我的书或prof中可能没有一本使用"+"来连接的原因。
- 这正是我讨厌隐式字符串->数字转换和任何允许它的语言的原因。vb.net也允许这样做,iirc
- 隐式字符串->数字转换没有问题,因为没有专用的连接运算符是一个非常糟糕的选择。如果修好了,那就不坏了。
- 在数学中,+不用于非交换算子(尽管我相信有人会给出一个反例)。即使是作为一个单倍体(?)我不喜欢使用*,因为它会引起同样的混乱。
- 世界跆拳道联盟????????????????!
- @tom hawtin-滑车:算符*在数学上可能是不可交换的。例如,在矩阵乘法中,AB是可能的,BA是不可能的。我想不出任何关于+的例子,但我很确定会有。
- +因为串联不是问题,所以Python的实现非常有效。它只是拒绝在没有转换的情况下添加int和str。在这种情况下,JavaScript应该抛出一个异常。
- 弱类型不是真正的问题,但javascript对它的奇怪实现
- 世界跆拳道联盟。。。"5"字符串不是两种方式吗??!!
- 当我第一次学习javascript的时候,这让我非常震惊。这种不一致的行为使得这个bug非常难以找到,特别是因为我没有一个可以观察变量值的逐行调试器。
- 所以您必须记住,javascript中的大多数变量都在心跳中转换为字符串。要转换为数字,请使用像x - 0这样的表达式。
- "foo"++"bar"=>"foonan"
- 更糟的是…'a'+2+3+5+7为'a2347'。现在告诉我'a'+2+3-5+7是什么。最聪明的语法律师会感到困惑。
- @sf:alert('a'+2+3-5+7)。你需要见见一些更聪明的语言律师。
- concat的+和弱类型都不是问题所在。不了解语言语义的程序员是问题所在。我的意思是:如果你认为从一个字符串中减去一个int是个好主意,那都是你自己的错。如果你甚至不知道你的变量属于什么类型,那就更糟了。
- @TM:问题不在于两者的结合。问题是自动铸造或允许对不同类型的物体进行此类操作。
- 起初,这听起来像一个大的WTF,但它很容易记住和比格犬的评论解释得很好。
- 弱类型几乎不是问题,因为JavaScript不是弱类型。它是强类型的:根据语言定义,不会有任何疑问。它碰巧是动态类型的,但这并不会使它变弱。恰恰相反的是C,它是弱静态类型:类型可以在编译时声明,但声明允许是错误的(由于强制转换),因此某些程序具有未定义的行为。问题(如果有的话)是隐式转换。
- +'5' + 3 === 8
在javascript中,以下构造
1 2 3 4 5
| return
{
id : 1234,
title : 'Tony the Pony'
}; |
返回undefinedis a syntax error due to the splyly implicit分号insertion on the newline after return。但是,下面的工作正如您所期望的那样:
1 2 3 4
| return {
id : 1234,
title : 'Tony the Pony'
}; |
更糟糕的是,这一个也可以(至少在铬合金中)工作:
1 2 3 4 5
| return /*
*/{
id : 1234,
title : 'Tony the Pony'
}; |
这里有一个相同问题的变体,它不会产生语法错误,只会无声地失败:
- 我真的很喜欢这个,但我想知道的定义太频繁,而不是经常不够?
- @里科:在C-Intercal中,正确的数量在三分之一到三分之二之间。
- 我用please作为sudo的shell别名。
- 国际语不是一种严肃的语言。它更像是一种奇异的笑话语言。只需查看READ OUT和WRITE IN指令。
javascript真值表:
1 2 3 4 5 6 7 8 9 10 11
| '' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
" \t
" == 0 // true |
Source: Doug Crockford
- 好消息是,javascript有==操作符。
- 那么,在语言设计师眼中,==有什么作用呢?
- 让人困惑。
- @克里斯:我认为它应该做人们大多数时候期望的事情。
- 这是那些试图胜过程序员的javascript设计者的例子之一。对于一种语言来说,这是可以做的,但是它们根本就不固定地做这种事情,所以你通常不会期望这种事情发生在你身上。你更可能期望他们说Java或C会做的事情。如果这发生在说像鲁比这样的话,你会是"啊……,好吧……,我明白了……"。在javascript中,你通常会诅咒。
- 区分"=="运算符(称之为"looks like")和"=="运算符(称之为"is identical to")只在弱类型语言中有意义。例如,每件事情都有一个定义好的字符串表示,这很方便,但在第一次摸清语法时却是一个混乱的来源。
- 如果==有===的意思,然后有另一个操作符,比如~=,允许类型强制,那就太好了。
- 最糟糕的是,==甚至不是等价关系,因为它不是反身关系:""=='0'是假的,但0==''是真的。
- @亚当,你的例子表明它不是交换的。如果它不是自反的,则意味着0==0是假的。
- @奥托,实际上,由于我们在开玩笑,他的例子表明==不是对称的。目前,我还不知道如何指定二元关系的交换性。
- 是的,对称。但我不认为交换二元关系有什么问题。例如:对于布尔型,(a != b) != c <=> a != (b != c)(!=是独占的或布尔型的)。
- @汤姆,这是联想性;en.wikipedia.org/wiki/communicational对称性
- 愚蠢的语言
- 另一个javascript奇怪之处:255==valueof:function()返回"0xff";//true
- 这是委员会设计的一种语言的基本问题,并逐步有机地发展。想想英语。
- 如果您认为javacsript是由委员会设计的,那么您需要返回并重新阅读历史。
- 我喜欢JavaScript,但这让我害怕。幸运的是,除了if(如果),我很少需要区分我的错误价值观。值)或if(typeof value='未定义')。从现在起,我会更经常地使用==。
- @我不确定那会像你想的那样好。有很多人依赖==,但当他们使用getAttribute()并获得字符串值时却没有意识到这一点,而是将其与int值进行比较。
- @wtfits:不要忘记===操作符,它确实具有健全的语义。在我看来,除了这个和其他几个wtf之外,javascript实际上是一种非常酷的语言,绝对值得学习。
- false ?= null
- 这更像是一张真理表,而不是真理表。
Trigraphs在C和C++中。
1 2 3
| int main() {
printf("LOL??!");
} |
这将打印LOL|,因为三角图??!转换为|。
- 快!告诉所有的C/B/程序员!
- 三角图很神奇,因为你可以确定没有人会-永远-发现什么??!指的是在不知道名字的情况下从谷歌获得的信息。
- 三角图是否被预处理器更改为等价字符?
- 不是Dreamlax,我相信是由实际的编译器编写的。只要我知道预处理器只接触以#
- @安德烈亚斯:当然除了宏替换,对吧?
- @ BytNik:宏仍然在C++中工作。不知怎么的,我觉得它有一个预处理器…不用说,哦,预处理器指令!
- 在gcc中,默认禁用三角图。
- 虽然我知道三角图的存在,但我并没有特别看到它的点。它们只是为了增加编译时间和帮助没有键盘的程序员(这些键盘是否存在?)
- 这些允许您使用"wtf operator":(foo()!=错误)??!???!cerr<"出错"<
- Dreamlax&Andreas:Trigraphs替换由预处理器执行。参见en.wikipedia.org/wiki/c_预处理器
- 三角学在引入时是一种必要的邪恶。有些平台只是没有包含语言的某些字符键,所以它要么是"三线图",要么是"不能有C编译器句点结束语句,所以使用汇编程序"。用"C++编程语言"查看Stroustrup的描述。
- 难道这不是一个编辑的特写,而不是建立语言的丁丁吗?
- 我曾经用EBCDIC中的3270终端在IBM大型机上用C语言编程。C所需的某些字符(可能包括""字符)不在键盘上,并且在块模式终端上没有类似^Q 7C的功能。奇怪的是,有一个"&166;"(U+00A6,"断条")字符。更奇怪的是,大多数现代的美国个人电脑键盘上都画有"&166";但个人电脑却把它变成了""
- @阿德里安·普罗克:在我成长的过程中,我一直觉得钥匙上有一根断了的棒子很奇怪,但当我打字的时候,棒子是实心的。我把它当作一种"因为它是"的东西传了出去。
- Voyager,我不认为C/B/(对谷歌来说很难)支持三角图。(我想它们被包括在内并被定义为导致编译错误。)
- @阿德里安-你是另一个人吗?我在IBM实习了一个夏天,他们没什么可干的了,所以我提出了一个项目,在我说之前,这个项目很不错,但是如果你想让我完成它,我必须用一种我非常熟悉的语言来完成它:C。我做到了。他们很喜欢。但我得学三角。
- @汤姆·霍丁:en.wikipedia.org/wiki/4chan
- 默认情况下,gcc不允许(或至少警告)三角图。
- @tom hawtin@voyager encyclopediagraphica.com/rules_the_互联网
- GCC正确返回
- 阅读了维基百科的有向图和三角图页面后,有趣的是<%和%>被和替换。我想知道这是否是他们在ASP.NET PHP等中使用的起源。
- @Dreamlax——这是因为PC键盘是在80年代为DOS和(IBM/PC口味的)ASCII设计的。如果您启动一个控制台窗口,您将看到"断条"键仍然在那里输出一个"断条外观条"。该条被"破坏",因此它可以与-和+组成,以生成非常原始的图形框。在Unicode中,我认为为了兼容性,"断条"被引入了其他地方(0xA6),只是为了能够绘制这样的图形。
- | ¦ |用于在ASCII游戏中绘制道路。
- 为什么他们选择了奇怪的??!创造更多的景观特征?
- @克里斯,因为他们不是逃避角色。这个例子显示了在一个字符串中的用法,但是,得到这个,你可以在任何地方使用它们!这样:用if(foo ??!??! bar)代替if(foo || bar)。
- @Euro Micelli:对芬兰程序员来说,某种类型的转义可能是必要的(尽管许多芬兰程序员只是听命于使用&228;之类的运算符进行编程),但是三角图是一种特别糟糕的转义。gcc提供了一组更可读的两个字符转义。
- 我不知道为什么这是一个WTF。三角图对某些系统是必需的。EBCDIC 3270没有一致(有时也没有)的[]字符。其他字符有时也有问题。但是,由于在默认情况下禁用了三角图,似乎是大多数C编译器几十年来的默认行为…
- 什么是C/B/?我猜这跟4个男人没什么关系…
- @欧米切利的"三角学在引入时是一种必要的邪恶",当它们被标准化时,三角学已经只具有历史意义。
有自动装箱和Java中的整数缓存的乐趣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Integer foo = 1000;
Integer bar = 1000;
foo <= bar; // true
foo >= bar; // true
foo == bar; // false
//However, if the values of foo and bar are between 127 and -128 (inclusive)
//the behaviour changes:
Integer foo = 42;
Integer bar = 42;
foo <= bar; // true
foo >= bar; // true
foo == bar; // true |
解释
对Java源代码的快速窥视将得出以下结论:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| /**
* Returns a <tt>Integer</tt> instance representing the specified
* <tt>int</tt> value.
* If a new <tt>Integer</tt> instance is not required, this method
* should generally be used in preference to the constructor
* {@link #Integer(int)}, as this method is likely to yield
* significantly better space and time performance by caching
* frequently requested values.
*
* @param i an <wyn>int</wyn> value.
* @return a <tt>Integer</tt> instance representing <tt>i</tt>.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
} |
注:除非属性设置,否则IntegerCache.high默认为127。
自动装箱的结果是,除非显式创建,否则foo和bar都是从缓存中检索到的相同整数对象:例如foo = new Integer(42),因此在比较引用相等性时,它们将是真而不是假。比较整数值的正确方法是使用.equals;。
- 我花了几秒钟才明白为什么…Java必须为128到128之间的值保持一个整数实例池,否则它将分配一个新的整数,对吗?
- 那是正确的
- 但是请记住,如果指定新的整数(42),它将不会使用池中的实例,因此foo==bar将计算为false。
- 如果可能的话,我总是使用整数而不是整数,但是如果出于某种原因必须使用整数,我应该只使用.equals()而不是==?
- @是的,它们是物体。
- @迈克·阿克斯:可能性很小。
- 更令人困惑的是,Java能够通过使1000的数学量大于或大于本身而破坏数学定律。
- @高拉夫:事实上,这正是发生的事情(除了128个不需要合并)。您可以自己实现它:dailywtf.com/articles/the-integer-cache.aspx
- @ Gaurav,如果您不相信Java Java API,请参见Java API:java. Sun.com/J2SE/1.5.0/DOCS/API/Java/Lang//Helip;或者进入IngE.java并查看源代码。
- dailywtf.com/articles/the-integer-cache.aspx
- 很高兴我是C程序员。
- 最重要的是,你可以用反射使42等于你想要的任何东西!
- 有人能解释为什么你需要一个整数池吗?
- 有人能解释为什么你只为整数的子集创建一个整数池吗??
- 我发现更有趣的是,Java程序员决定使用一个可被假定的可修改的值,称为EDCOX1(6),但前面只有1行,他们决定最好对128进行硬编码(而不是使用整数缓存。
- @graham.reeds&johnc的想法是通过缓存最常用的整数来节省一点内存,而不是让数百万个包含值0的整数对象(例如,0可能最常用于默认值)。
- "所有-是的"自动(un-un-拳击)是Java1.5中引入的Java中的一件轻而易举的事情,因为人们仍然没有克服对原语的痴迷。@单-因为偏移是基于低值。如果有的话,他们需要一个新的ic.low变量。
- @Monokrome:128用于重新调整数组的大小,因此-128的合并实例位于索引0,-127位于索引1,0位于索引128,等等。写IntegerCache.high+1是个错误。
- Monokrome:灵活的缓存大小最初是在性能版本中引入的。最大缓存值在某些宏基准(我猜是数据库ID)中很重要。避免更改偏移量允许更小的代码更改和更简单的代码。
- @威尔:C有一些非常相似的问题。请参阅blogs.msdn.com/jmstall/archive/2005/03/06/386064.aspx
- SpoCuxuKEY:最大的区别是,在C语言中,你不需要一直在写整数,而在爪哇,你必须一开始就使用泛型,这是…很多次。
- 奇怪的特性,是的,问题,不是的,任何人比较对象和这样的运算符都比不一致的结果更令人担心。
- @威尔:很高兴我用了Python;-)
- 在Java中使用"等量"。
- 最糟糕的是,我对这个特性的主要抱怨是,如果您从原语重构为整数,并且您的测试没有明确地尝试缓存范围之外的值,那么您将有一系列只在生产中出现的错误。不酷。
- Java不是为坏程序员设计的,也不是为懒惰的程序员设计的。
- 这是过早优化的结果。
- @杰森哦,是的,我的第一个想法是…很多鬼鬼祟祟的虫子。
- Java的目标最大的问题是范围127和128只是一个最小值。规范允许实现根据需要缓存更大的范围。这将使上述测试代码在不同的实现上表现不同。只写一次,到处跑。
- @spookylukey——所有这些c_示例都使用整数变量x,不需要知道x的值在什么范围内来预测结果。
- @杰伊:Python也这么做。查看:a = 127; b = 127, a is b将返回True。:)
- @当然,另一个很大的区别是,C的装箱整数不是整数-它们被称为对象,当你看到对象比较时,你不会期望整数比较。
- 当然,有了42个就行了,这就是答案!所以42永远不会被认为是错误的。从未。
引用尼尔·弗雷泽的话(看那页的结尾)
1 2 3 4 5
| try {
return true;
} finally {
return false;
} |
(在Java中,行为在JavaScript和Python中显然是相同的)。结果留给读者作为练习。
编辑:只要我们在主题上,也要考虑:
1 2 3 4 5
| try {
throw new AssertionError();
} finally {
return false;
} |
- 不幸的是,您不能用RubyMixin做任何可以做的事情,尤其是添加每个实例的状态(不需要用字典做疯狂的事情…)。此外,扩展方法不会以任何方式破坏接口的定义。你没有违反合同。您没有向接口添加任何内容。把它当作接口的一部分来调用的能力只是语法上的优势。扩展方法和任何其他静态辅助方法一样,都有很好的优势。
- 我认为这是一个非常有用的功能。虽然在使用代码的时候情况不太好。
APL(除所有程序外),只在一行中编写任何程序的能力。
例如,康威在APL的一行人生游戏:
alt文本http://catpad.net/michael/aplife.gif
如果那条线不是WTF,那什么都不是!
这是一个视频
- ${array()}实际上变为$Array(因为将数组转换为字符串总是返回Array)。所以不能在这里使用实际数组。
- 如果这在.js和${===}='==';中有效,那么==最终是正确的。
可以使用C++模板的奇特的东西,最好用"多维模拟文字"来演示,它使用模板来计算"绘制"形状的区域。下面的代码对于3x3矩形是有效的C++
1 2 3 4 5 6 7 8
| #include"analogliterals.hpp"
using namespace analog_literals::symbols;
unsigned int c = ( o-----o
| !
! !
! !
o-----o ).area; |
或者,另一个使用三维立方体的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| assert( ( o-------------o
|L \
| L \
| L \
| o-------------o
| ! !
! ! !
o | !
L | !
L | !
L| !
o-------------o ).volume == ( o-------------o
| !
! !
! !
o-------------o ).area * int(I-------------I) ); |
- 应该注意的是,C实现非常明智,因为它非常优雅地避免了一些困难的问题。阅读埃里克·利珀特的解释(在他的博客中的某个地方),解释为什么条件运算符是按这种方式设计的。
- 你的意思是它不会编译。此外,这是一个明智的设计决策。
- Eric Lippert的解释:blogs.msdn.com/b/ericlippet/archive/2010/05/27/&hellip;,also stackoverflow.com/questions/1171717/c-conditional-operator
Perl的许多内置变量:
- $#—不作评论!
- $0、$$和$?—就像shell变量同名一样。
- $ˋ、$&和$'—奇怪的匹配变量
- $"和$,—列表和输出字段分隔符的奇怪变量
- $!类似于errno作为数字,strerror(errno)作为字符串
- $_—隐形变量,一直使用,从未见过。
- $#_—最后一个子例程参数的索引号…也许吧
- @_—当前函数的(非)名称…也许吧
- $@—上次引发的异常
- %::—符号表
- $:、$^、$~、$-和$=——与输出格式有关。
- $.和$%输入行号,输出页码
- $/和$\输入和输出记录分隔符
- $|—输出缓冲控制器
- $[—把你的阵列基从0基改为1基,改为42基:whee!
- $}—什么都没有,够奇怪的!
- $<、$>、$(、$)—真实有效的uids和gids
- @ISA—当前包的直接超类的名称
- $^T—脚本启动时间(以epoch秒为单位)
- $^O—当前操作系统名称
- $^V—这是什么版本的perl
从哪里来的还有很多。在这里阅读完整的列表。
- $[变量是所有变量中最糟糕的。
- 如果Perl6是一种我可以在不需要每5秒钟检查一次perldoc perlvar的情况下编写代码的东西,我肯定会感激它的。(尽管我承认有一半的时间我检查它的时候会想:"我知道有一个特殊的变量可以为我做这个,但我只是不记得是哪一个……"=p)
- use English;的问题是它会影响regexp的性能。我不是在编这个。perldoc.perl.org/english.html性能
- $是我最喜欢的变量。不得不用php编写foreach($A作为$V)会让我的头发受伤。
- 我认为最差的是$@和@$。工作和我都不知道第二个是做什么的(第一个是评估错误)。我正在调试一些原本应该使用$@的代码,但最初的编码人员写了@$并躲避了我几个小时。
- @戴夫:这不是问题,因为你链接的页面中有-no-match-vars选项。@布拉德:太邪恶了。它背后的意图是邪恶的,是的,但它甚至不起作用!@artem:from perlvar"以数字、控制字符或标点字符开头的Perl标识符不受包声明的影响,并且始终强制位于package main中;它们也不受严格的"vars"错误的影响。"这意味着即使在stricture下,也将创建和分配@$而不会出现错误。呸!
- 鲁比也有这样的东西。挺烦人的。
- @rjh:re:use english->
- 我觉得这篇文章的主题是变量的名称,而不是它们的函数,因此我专门为$[:stackoverflow.com/questions/1995113/StrangestLanguage Featu&zwnj;&8203;re/&hellip;函数创建了一个新的答案。
- 我讨厌以东。我讨厌无条件地混合代码,但所有的"大写"代码都是一种全新的厌恶。
- 不过,它们很适合作一个衬里。本地$/=undef;$=<>
- 我决不是一个Perl老手,我喜欢这些特殊的角色。您只需要知道Perl有这些特殊的字符,并且知道它们的含义。就像学习任何新语言…您必须学习语法才能理解如何编写和读取代码。
- (plain)python没有这个。猜猜我为什么喜欢它?;-)
- 以东十一〔四〕比布拉德的更邪恶,我以前从未见过。
- 那么$[总是有值0吗?
- 如果你订阅了那个思想流派,你就不会使用Perl!
- @布莱恩:当官方文档本身声明存在Perl解释器试探性地猜测字符序列的含义时,您打算如何学习语法?例如,在/$foo[bar]/中,[bar]部分是字符类还是数组@foo的下标?grep perldata的可怕答案。
- 很明显,那列特殊的瓦尔斯是一个戴着帽子骑着赛格威的人。他们必须这样做。
- 这是有效的php… $__='([^/]+)@i\',$__,$___';$_=preg_match('@^(?:,)?([^/]+)@i',$__,$___); echo $_; echo $__; print_r($___); ?>
- 顺便说一下,这些变量还有一个小问题:它们不可调!
- @malvim:幸运的是,您可以从命令行中找到关于这些变量的所有信息,例如,perldoc -v $.也可以参阅perldoc perlvar获得完整的列表(也可以在线:perldoc.perl.org/perlvar.html)。
- @ChrisPerl6只剩下4个特殊变量,其中您需要三个($_作为主题,$!用于错误,$/用于匹配结果)。它们都不再是全球性的了。
- 红宝石里也有很多
PHP处理字符串中的数值。有关完整的详细信息,请参阅前面对不同问题的回答,但简而言之:
如果有两个字符串包含不同数量的字符,则不能认为它们相等。前导零很重要,因为它们是字符串而不是数字。
PHP不喜欢字符串。它在寻找任何可以找到的借口,把你的价值观当作数字来对待。稍微改变这些字符串中的十六进制字符,突然,php决定这些字符不再是字符串,它们是科学记数法中的数字(php不关心您使用引号),它们是等效的,因为数字忽略前导零。为了加强这一点,您将发现PHP还将"01e4" =="10000"评估为真,因为这些是具有等效值的数字。这是记录在案的行为,只是不太明智。
- 只需使用==和!=除非需要松散的类型比较,否则应该使用它。
- @Dykam,如果你按照链接找到更完整的答案,你会发现我已经解决了==操作符的使用问题。
- 哦,对不起,错过了链接。
- 打字不好又来了!
- 我一直知道PHP是一种罪恶。直到现在我才意识到这是不可饶恕的罪过。
- 这太可恶了!但我很困惑:你是说"01A4"!"001A4"在PHP中?如果是的话,我不明白。如果"01A4","01E4"="001E4"怎么可能!="1001A4"?它们都是有效的十六进制值。
- 当采用非整数变量形式时,建议使用php intval()进行整数比较。
- 他们应该让技术人员在任何编程书籍或教程中使用==。补充说明:在一个写得不好的PHP应用程序上,我可以提供任何被解析为相同数字的东西作为我的密码。
- 我在php中遇到过一些问题,我使用了一个非常大的数字(facebook api密钥),并且在声明时没有引用它;php在我显示它时,以科学符号将其静默地转换为浮点,并把api调用搞砸了。
- 为什么php不是wtf列表中的第一个?
- 我知道这是我不喜欢弱类型语言的原因。如果一个精心设计的语言不需要像==和!=因为字符串是字符串。数字就是数字。如果我想把一个转换成另一个我会这么说的
- 不直接相关,但另请参见:stackoverflow.com/questions/4098345
- @塔尔维:甚至不是那么直接……IntVal()甚至没有为您提供正确的值。var_dump("01E4")=>"01E4",var_dump("01E4"=="001E4")=>真,var_dump(001E4)=>浮动(10000)……但是:var_dump(intval("01E4"))=>1,var_dump((int)"01E4")=>1。然而:var_dump("01e4"==1e4)=>真,和:var_dump("01e4"==10000)=>真;)
- @Joe的问题是您在引号中包含值。(导致它被解释为字符串。)不要使用引号,它可以正常工作。另外,如果您知道您使用的是十六进制,则可以使用intval(01e4,16);,请参见:us2.php.net/manual/en/function.intval.php
- @Talvi:我理解这一点,但最初的回答明确使用引号:)因此,进一步探讨了有引号和无引号的不一致性。如果"01E4"="001E4",那么它显然是在进行内部数字转换。然而,intval(或int cast)并不将其视为该数字。
javascript八进制转换"特性"是一个很好的了解:
1 2 3 4 5
| parseInt('06') // 6
parseInt('07') // 7
parseInt('08') // 0
parseInt('09') // 0
parseInt('10') // 10 |
更多详细信息。
- 这很有趣!还要注意,由于某种原因,函数parseInt(x, 10)比Math.floor()慢3倍。
- 位运算符将把输入截断为有符号的32位值。math.floor(4294967295.1)==4294967295;parseint("4294967295.1")==4294967295;(4294967295.1 4294967295.1)=-1;
- 没错,@rpetrich。我应该提一下。我更新了答案,并链接到JSPerf上的性能测试用例。
- 这样的东西是怎么被发现的?
让我们对所有试图去掉保留字的语言(如PL/I)进行投票。
除此之外,你还可以合法地写一些有趣的表达,比如:
1
| IF IF THEN THEN = ELSE ELSE ELSE = THEN |
(IF、THEN、ELSE为变量名)
或
1
| IF IF THEN THEN ELSE ELSE |
(IF是变量,THEN和ELSE是子程序)
达夫的装置在C!
在C语言中,可以将do/while与switch语句交替使用。下面是使用此方法的memcpy示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void duff_memcpy( char* to, char* from, size_t count ) {
size_t n = (count+7)/8;
switch( count%8 ) {
case 0: do{ *to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
}while(--n>0);
}
} |
- 邪恶的。innosetup至少使用了pascalscript,这是一种理智的,大部分。
algol pass-by-name(使用C语法说明):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int a[3] = { 1, 2, 3 };
int i = 1;
void f(int j)
{
int k;
k = j; // k = 2
i = 0;
k = j; // k = 1 (!?!)
}
int main()
{
f(a[i]);
} |
- 如果你想一想,它实际上有点扭曲的意思。
- 如果我打雷的话,你是对的。;-)
- 这是最终的"参考传递"。
- 有趣的是,PHP所称的引用更像是一个名为algol调用的浅版本,而不是C语言中的指针。发现它具有知识遗产是很有用的。
- 有时我真的希望在爪哇的特色…
- 但在斯卡拉是有可能的(def f(j : => int))
- 很高兴您使用C来说明这一点——我一直认为C预处理器宏最接近于任何广泛使用的语言所具有的"传递名称"。
- 所以这是类似于... template struct by_name { virtual operator T&() = 0; }; void f(by_name j) { ... } int main() { f(struct : by_name { operator int&() { return a[i]; } }); }的东西?
- 范围失败……
- 太棒了,不过我想知道您将如何实现这个特性。
- 它实际上是非常直接的:您生成一小段代码(通常称为"thunk",因此我上面的双关语)来计算表达式产生的地址,在本例中是&a[i]。指向此函数的指针将传递给被调用函数,然后在每次访问参数时使用它计算当前地址。
- 但是您的thunk从使用它的地方访问范围,这是疯狂的,一点也不像一个闭包。
- 不,阿尔戈雷恩(不是我的!)从定义范围的位置访问范围。所以它必须像一个封闭一样工作。
- 传统的做法是将数组索引作为参数传递,而不是将其变为全局变量,因此可以称为x = dotproduct(a[i], b[i], i)。
- 我刚刚死了,下了地狱。
- 问题是不清楚你是通过引用传递的。在C/C++语法中,看起来你是在通过值而不是引用。这个特性是非常标准的,但必须知道algol是通过引用传递的,我猜在这种情况下?
- D版本:auto a=[1,2,3],i=1;void f(lazy int j)writefln(j);/*2/i=0;writefln(j);/1!*/}void main()f(a[i]);
- 这是一个algol bug,不是一个特性,是吗?
- 在smalltalk中,您可以使用become:进行类似的乐趣,它可以在适当的位置交换任意两个对象,例如true become: false。
- 这看起来有点像混合了命令式编程的懒惰评估。:)
- 这最初是为集成和派生之类的事情而做的。这确实是穷人的终结。无论您传入的表达式有多复杂,每次它出现在函数文本中时都会重新评估它。想想副作用带来的乐趣吧!如果我没记错的话,它也是传递参数的默认方法。在Algol68中,它被称为程序化,据我所知,它不再是默认的。
- 这让我大吃一惊
- 按名称调用是懒惰计算的一种特殊形式。斯卡拉能做到。
- 对于子孙后代:en.wikipedia.org/wiki/man_or_boy_test
- 在c中,函数f采用参数Func,测试调用为f(() => a[i]);,在f中引用j表示j()。这使得重新计算更加明显。
在Java中:
1 2 3
| int[] numbers() {
return null;
} |
可以写为:
1 2 3
| int numbers() [] {
return null;
} |
- 真的!我希望在设计数组语法的时候我能成为一个轻而易举的人!
- 我不想这么说,但wtf-one是C型系统的一致扩展。如果允许C函数返回数组,那么它看起来就是这样的。更好的是违反一致性以使其更具可读性。很像"const char*var"和"char const*var"。
- @亚当-当您认为变量声明同样允许"int stufacture[]"和"int[]stufacture"时,这实际上是有意义的。它们只是让相同的规则适用于方法声明。
- @托洛玛:我可能误解了你想说的话,但是你给出的解释指针内容的指针的例子实际上是一种语法上的差异,不仅仅是为了让它更易读而违反了某种规则。
- @Limbus:实际上,const T*和T const*是等价的,是T* const构成指针。另外,我讨厌sans字体。
- 我很尴尬地承认,在Java开发的最初几年里,我通常在Java中使用C样式数组表示法,主要是出于肌肉记忆。
- 我同意,如果你是C程序员,这并不奇怪。
- 毕竟,numbers()[2]是一种法律声明。
- 看起来像一个方法数组。P
- TeloMa:爪哇不是C。
- 使用多维数组更好:int[] numbers() [] { return new int[1][1];}。
(P)In Python:(p)字母名称(P)不是一个WTF,但一个用户的形象。(p)
- 我希望其他语言都有这个功能
- 和几乎所有酷的python特性一样,guido似乎只是对酷的lisp特性的语法进行了algol化。-)
- 此功能的性能也优于写出"1
- 特色?在我看来像个大肥虫。
- geoffrey,这是一个特性,而(10 > 5 > 1) != ((10 > 5) > 1)在python中。
- 而且,它只评估一次,所以(funct_a(5)+5 > b > funct_a(5))只调用funct_a(5)一次。这是一个很好的功能!
- 不过,我不认为这是一个奇怪的特征。
- 它不是WTF。它节省了输入(和评估);我认为它在上面有perl 5.10的"defined or"操作符。
- 在学习Fortran和C之前,我非常精通Python,因此这在C代码中导致了一个微妙的WTF。这不容易被发现。
- 凯尔本所说的事实上是令人惊讶的,imho。
- Delphi Prism也有这个功能。
- @rjh-perl的//操作符简直太神奇了。
- 简单,但很好的功能-我以前不知道这个。我现在一定要用。
- 嗯,不知道他们是否会考虑把这个添加到C++ 0x中
- 格兰特·彼得斯:如果他们做到了,就再也不能进入C++0X了。上个星期以来c++ 0x就消失了。现在所有酷孩子都在使用C++ 1x。
- 但是这个功能有什么奇怪的?对我来说,这是合乎逻辑的。
- @Mizipzor:这是不寻常的,因为它不同于大多数主流语言解析表达式的方式,尽管它确实更有意义。
- 更好的是lisp版本:(<0 1 2 3 4)=>true如果所有参数都是升序的,则<函数实际测试。
- @凯尔本:不,在那个例子中,funct_a将被调用两次。在b > funct_a(5) > c中,它只能被调用一次,而不是b > funct_a(5) and funct_a(5) > c。
- @抱歉,伙计们,你说得对!我想我写那封信的那天喝醉了什么。正确的答案是巴夫·博伊瓦说的……
- 该死。。。更糟糕的是,它在C(及其所有子代)中是完全正确的语法,但在那里产生了完全错误的结果。<代码>((BOOL)(1)
- 遗憾的是,这不能用于numpy布尔索引。虽然可以做x[1
Intercal可能是最奇怪的语言特性的最佳概要。我个人最喜欢的是comefrom声明,它(几乎)与goto相反。
COMEFROM is roughly the opposite of
GOTO in that it can take the execution
state from any arbitrary point in code
to a COMEFROM statement. The point in
code where the state transfer happens
is usually given as a parameter to
COMEFROM. Whether the transfer happens
before or after the instruction at the
specified transfer point depends on
the language used. Depending on the
language used, multiple COMEFROMs
referencing the same departure point
may be invalid, be non-deterministic,
be executed in some sort of defined
priority, or even induce parallel or
otherwise concurrent execution as seen
in Threaded Intercal. A simple example
of a"COMEFROM x" statement is a label
x (which does not need to be
physically located anywhere near its
corresponding COMEFROM) that acts as a
"trap door". When code execution
reaches the label, control gets passed
to the statement following the
COMEFROM. The effect of this is
primarily to make debugging (and
understanding the control flow of the
program) extremely difficult, since
there is no indication near the label
that control will mysteriously jump to
another point of the program.
- 相当邪恶——把标签变成哥特人。听起来像是黑客们乞求的语言功能…
- 是的,这是非常回避的——但是当你想到它时,你会发现它只是一个"面向方面编程"或"依赖注入"的原始实现,而不是Kool和AOP。
- 就像是AOP的Goto…
- 好吧,但是Intercal应该很有趣-这不是一个令人惊讶的"gotcha"。如果您不经常使用PLEASE修饰符,则内部编译器实际上可以拒绝编译程序!
- 不要忘记定义多个come-froms允许多线程。
- @亚历克斯:这只是线程化的内部实现。这不是内部规范的一部分(当我说"内部规范"时,我忍不住笑了起来)
- @马蒂尼奥一想到"穿插"就让我的脊椎发冷。吓人的!
- 听起来像AOP:)
- 最让我吃惊的是,在"商业t.i."的系统需求分析中,comefroms实际上被用于描述用例的文本文件中。(严肃地说:这里的一些分析师推迟了公司范围内的迁移到OpenOffice而不是MS的Office,因为前者无法正确地引用链接中具有所需粒度的"comefrom")。
- 格罗:更糟。使用please太频繁,它拒绝编译您的程序,因为您在卑躬屈膝(C-intercal需要33%到66%的语句有please修饰符)。
- 来自被认为有害的声明
- 但真正的好处是你可以有来自同一行的多个语句…是的,Intercal有多线程!
- Python也来了!entrian.com/goto:)
- @格罗:还有,太多的取悦会让编译器怀疑你的意图。;)
- 是只有我,还是这听起来很像.NET中的普通事件?
(P)不是一种真正的语言特征,但一种执行模式:一些早期的竞争对手通过使用一个Constant Pool执行了一些标准。所有的参数都通过参考。如果你呼叫一个功能,E.G.(p)字母名称(P)The compiler would pass the address of the constant 1 in the constant pool to the function.如果你在工作中向参数提供价值,你将改变方案中的全球价值(在此情况下是1)。我给你找了个头(p)
- 哦。那么,2+2可以等于5(当然,对于2的非常大的值!).
- 嗯,2的值会使"2+2"="5"?我不知道任何整数值2可以接受为真。
- @Aaron,我猜2被定义为一个常量,因此可以通过引用使常量2成为实际机器代码中的任何一个缩写值的函数来发送。
- @厄尔茨:我怀疑它最终会成为一个积分值,不管是什么比特模式。另一方面,您可以这样设置5到4(因此,对于小值的5,2+2等于5)。
- 终极猴子补丁!
- 也许我们可以将引号改为"对于非常小的值5,2+2=5"。thinkgeek.com/tshirts-apparel/unisex/generic/60f5
- 对不起,阿洛克,但这是我们谈论的早期堡垒。2 + 2 = 5不是真的;那将是一个语法错误。真正的情况是2 + 2 .EQ. 5。
- 实际上2+2不能等于5,但2+2。式6是可能的…
- @托马斯:埃多克斯1〔10〕是可能的。只需阅读其他评论。或者如果你不想,就让5比4。
- 这显然取决于5的值
- 哈哈,戴维。感谢您的纠正!
- 在haskell中,以下代码段的计算结果为5:"让2+2=5 in 2+2":)
- 啊,我最喜欢的虫子。我花了好几天调试过那台。我最终发现,在我们的程序中,发现常数1在某个点后的值为零是非常有趣的。这让人大开眼界。
- 这并不一定奇怪——在C语言中,数组总是作为引用传递,这非常方便!
- 2=100 5=200 2+2.式5.那里。对于非常大的值2,2+2是5。
- 几乎就像Python共享可变的默认参数,但是是全局的。
- 有趣。如果C有类似的历史,那么旧的"if(1==x)"技巧(代替(imho)更易读的"if(x==1)")可能永远不会被创建…或者至少和它被发明用来避免的问题一样糟糕。
- 这是通过Fortran 66实现的。后来版本的F77修正了它。在那里做过吗?
- 很久以前,一个程序员(设计一个TRS-80游戏,iIRC)不小心做到了这一点,把1作为参数传递给一个函数,这个函数把这个参数传递给另一个函数,这个函数改变了1的值。他声明了一个变量i,将1赋给它,并将其传递给它,所以没有什么不顺的变化。这证明了墨菲定律:"常数不是,变量不是。"
- 我一直在想黑客测试中的那个问题"是否改变了4的值?"
- 怎么办?如果x是一个整数,那么x+x至少应该是一个偶数吗?或者你能让整数常数2指向2.5吗?
- @阿尔伯特,谁说5实际上是5?如果2的值可以更改,那么5的值也可以更改(例如5可以更改为6)!
- Fortran是第一种真正的编程语言。那是1953年到1954年。一开始,还不清楚这样的事情是否可能。从58年的深入发展来看,批评是不公平的。
- 好吧,如果int foo(a) {return ++a + 2;},那么foo(2)返回6?
(P)Don't know if it can be considered a language feature,but,in C++almost any compiler error related to templates delivers a fair amount of WWF to many C++programmers around the world on daily basis:(p)
- 取决于编译器。MSVC++在这方面比GCC差得多。
- 没关系,大多数与模板相关的代码已经在世界各地创建了大量的WTF。
- 哦,来吧。未定义的对"std::basic_ostream>&;std::operator<>(std::basic_ostream>&;,char const*)的引用完全可读!
- 对我来说,模板是C++的"特性"之一,直接被忽略。
- @凯尔本:然而,马特·格里尔的例子是关于像cout <<"Hello, World!"这样的东西,很多人没有意识到这涉及到模板。(使用字符串而不是带引号的字符串会更详细。)
- @ Khelben模板是使用C++而不是面向对象语言或C++对象的唯一原因。
- 我曾经有过一个与模板相关的编译器错误,它是五行,其中最短的是一万七千个字符(在一个深度模板化的程序中,典型的"不匹配X"错误)。这是wtf,而不是一开始的功能,模板是很好的。
- 即使没有错误,也可以尝试使用探查器查找哪些函数花费的时间最长。哦,看,是std::vector, std::allocator > >::vector< std::vector, std::allocator > >::iterator>(std::vector, std::allocator > >::iterator, std::vector, std::allocator > >::iterator, std::allocator >)。
- 哎呀,这伤了眼睛!
- 我认为这很适合:在bdsoft.com/tools/stlfilt.html查看stlfilt,使输出可读。
- lambda非常适合这种东西!……)(编写函数式C++代码也是很好的,但这是另一个主题……-p)
- @MXP:有趣的工具。难道他们不把它叫做"解密器"吗?;-)
- 取决于编译器。Clang主要修复了它(例如,不使用默认模板参数等)。我认为海湾合作委员会正在(或计划)跟进。
- 模板错误消息是充满意义的,出于某些奇怪的原因,有些人无法理解6整页的纯粹意义…
C的许多名称空间:
1 2 3 4 5 6 7 8 9
| typedef int i;
void foo()
{
struct i {i i;} i;
i: i.i = 3;
printf("%i
", i.i);
} |
或带有字符:
1 2 3 4 5 6 7 8 9
| typedef char c;
void foo()
{
struct c {c c;} c;
c: c.c = 'c';
printf("%c
", c.c);
} |
- 这到底是怎么编译的??
- +1枚举和结构的标记标识符是C IMHO中最容易混淆的部分。很少有人理解为什么指向结构的指针的typedef惯用法看起来像它的样子。
- 它编译是因为我的每一个都有一个明确的命名空间,这是由于上下文的关系。
- @安德鲁没有使它更易读
- @杰伊:当然,它是不可读的。但仍不含糊。
(P)我想说的是,Python的whole white thing is my greatest WTF feature.是的,你比现代出版商更容易被用来处理这件事,但即使在过去几年里,我仍然认为这是一个坏主意。I've read all the reasoning behind it but honestly,it get in the way of my productivity.不是很多,但它仍然是一个布尔在萨德尔。(p)(P)Edit:Judging by the comments,some people seem to think I don't like to indent my code.这是不正确的评估。I've always indeed my code no matter what the language and whether I'm forced to or not.What I don't like that i t is the indentation that defines what block a line of code is in.我倾向于解释这一点。Among other reasons,I find explicit delimiters make it easier to cut and paste code.(p)(P)For example,if I have a block indented 4 spaces and paste it at the end of a block that is indented 8 spaces,my editor(all editors?)你们不知道过去的代码是否属于8-Space Block或是外层空间。Otoh,if I have explicit delimiters it's obvious which block the code belongs to and how it should be(re-)indented-it does so by intelligently looking for block delimiters.(p)(P)Edit 2:Some people who provide comments seem to think this is a feature I hate or that I think make pyton a poor language.Again,not true.While I don't like i t all that much,that's beside the point.The question is about the strangest language feature,and I think this is strange,by virture of it being some very,very few(but>0)languages use.(p)
我为此挣扎了一下:
在Perl中,模块需要返回一些真实的内容。
- 对不起,我不明白…
- 这也让我有一种不安的感觉…
- 有些模块可能基于运行时操作返回值。如果您总是返回true,那么您仍然不必对它失去创造性:returnvalues.useperl.at。
- 我尊重Perl及其用户的创造力…
- 如果我的Perl内存正确地为我服务,则从模块返回true表示模块已成功加载。返回一个错误值意味着发生了一些错误,并且会阻止程序运行(如果未捕获)。
- 这也是一个有效的C语句,只返回任何内容。
- 许多模块都以"假"结尾,用于咯咯笑;
- 马克·多明斯写道:"我很少使用'Cogito ergo sum';,大家都知道,在所有可能的宇宙中,'Cogito ergo sum';显然是真实的。这确保了最大的可移植性。"
- php =1;?>返回1。=true;?>返回1。=false;?>返回空。
我很惊讶没有人提到过VisualBasic的7个循环结构。
1 2 3 4 5 6 7
| For i As Integer = 1 to 10 ... Next
While True ... End While
Do While True ... Loop
Do Until True ... Loop
Do ... Loop While True
Do ... Loop Until True
While True ... Wend |
因为坚持!在你面前的条件太复杂了!
- 你忘了最好的:当…Wend????这是一个词吗?
- 哇,没有这个版本,我都不知道!太过分了!
- 他们应该把它改成"While"和"Whend",因为有些人用无声的唇形维拉尔近似词发"while"这个词。当然,它排列得更好,排列的代码也很好。
- 你为什么这么做?
- 真的。我一想到这件事就有点怀旧。我第一次使用VB是在9岁的时候。我来自瑞典,那时英语不是很熟练。现在,有一个瑞典单词叫做"v&228;nd",基本上意思是"turn back",发音与"wend"相似。正因为如此,我觉得这很有道理…:)
- Wend?我喜欢bash等人的fi(endif)和esac(endcase)。
- Tex也使用\if和\fi。
- 好吧,虽然/直到看起来不错,但和Ruby的if/except相同。在准备好之前通常比没有准备好之前更容易阅读和理解。然而,每种"while/until"的方法确实是一种过度杀伤力。
- !不在VB中,它是"不"。或者是?是的,不是!,但不是。
- @Dreamlax:bash使用case和esac。不管怎样,我一直认为Wend应该是Wendy。
- vb还具有迭代过A收集循环For Each foo In foos ... Next foo。
- 是的,"wend"是一个英语单词,意思是沿着某个路线或方向前进(google.com/search?Q=定义%3a+wend)。我不确定这是否有帮助或伤害。
- 很肯定是江户十一〔六〕从Qbasic…
- @mmyers:vb中的"wend"和英语中的"wend"有两个非常不同的定义。vb的"wend"是指"repeat"或"go again",但英语中的"wend"根本不包括任何重复。如果有的话,我认为Wend应该是goto的替代品。On Error Wend FixIt
- 当我们真正想要的是为每个人…
- @Dreamlax:+1表示"无声的唇形丝绒近似"
- 我看不出问题所在。
- 我还以为Wend是个临时工
- 我记得在旧的阿姆斯特朗共产党时代,从机车基础。
- 英国广播公司的基础节目一直重复到,而温德和下一个节目。wend是"end while"的基础,它出现在解析器无法处理两个单词语句的时代。
- 通常,lisp"loop"实际上是嵌入在lisp语言中的一个子语言,其结构类似于(loop for element in list1 and element2 in list2 collection(*element element2)until(=element 0))。
- 感觉我和一个女孩在床上…:)
- 他们把这个添加到vb中了吗?
- @贾斯汀:循环听起来很像林肯……
- 有人应该把"古老的英语/莎士比亚"变成vb。当它是真的时候"(循环)。在这里,在这里,在这里。如果这位女士抗议得太多(试试看)。"什么都不是空的"(空的)。
- 我发现行Do: Loop破坏了调试器。
我一直想知道为什么最简单的程序是:
1 2 3 4 5
| class HelloWorldApp {
public static void main(String[] args) {
System.out.println("Hello World!");
}
} |
然而,它可能是:
也许这是为了吓唬计算机科学专业的学生…
- 在任何程序中,您都需要一个入口点…
- 实际上,入口点是文件的第一行…
- 用女巫的语言?争论呢?有两个文件的程序呢?功能呢?
- 在某些语言中,"你好,世界!"是有效的程序。
- @somos:在大多数动态语言中,如python、ruby或perl打印"hello world!"或者一些小的变化(例如,输入而不是打印)是一个有效和完整的程序。
- 如果你在任何时候使用Java都是有意义的。
- 因为每一个方法和变量都必须是Java中某个类的成员,哪个类会被"改进"一行语句所属?
- 哦,是的,忘了提一下,Groovy是Java的衍生物。您发布的两个代码片段都可以工作。我还没用过,但看起来很酷。
- @loadmaster:这意味着"所有代码都属于一个类"或"所有代码都属于一个函数"都是不必要的约束
- 您仍然忘记了包声明指令..
- @吉米:OOP语言就是这么严格地工作的。
- 这是一堆废话……不,OOP不是一般的结构化/非结构化编程类型。
- 蓝调:答案中的代码不是严格的OOP。要严格地说是OO,您需要实例化一个对象并调用一个方法来要求它做一些事情。
- 仅仅因为语言强制使用对象,并不意味着它被用于适当的面向对象编程。完全可以用Java或C语言编程。这就是静态方法的用途。
- OP所说的是,应该有一个隐式类和无参数方法,就像Perl示例中那样。
- 我喜欢那些认为OOP意味着一切都应该是一个对象的人。
- @在.NET中,所有代码都必须在类/结构方法中。这并不能阻止boo(一种.NET语言)将print"Hello World!"作为其hello world程序。
- 在JSP(和其他语言)中,hello world程序可以写成Hello World!。
- 嘿,在APL 'Hello World!'中,程序是如何运行的。必须比这个"Java"的东西更容易使用!
- 用来吓唬和准备学习者了解特定语言是什么:Java-> OO,C->低级/过程,PHP ->脚本/创建HTML等。从技术上讲,PHP的程序也仅仅是EDOCX1→0。对于学习第二种语言的人来说,有时同样糟糕的是那些使用通用print 'Hello World!'并让你相信"哦,很好,完全一样,这很容易。"
- 我见过更糟的…就像"hello world"的win32 c版本:p paulgriffiths.net/program/c/srcs/winhellosrc.html
- 为什么不只是h呢?它在乔恩·斯基特的《你好,世界语言》中有效。:)
- @拉德克:听说过HQ9+?
- @我有,但你好的世界语言更有趣。它甚至是唯一有效的程序。
- @拉德克:啊……在我的脑海里,你好世界的语言太过局限。HQ9+更有用。在can-print hello world中,99瓶啤酒,一杯奎因,它可以增加一个指针。
- 您可以在PHP中准确地使用print"Hello World!"。没必要这么胡说!
(P)对于那些不知道的人,EDOCX1的英文本0是"arbitrary precision calculator language",而我使用这一点进行快速计算,特别是当数字涉及较大时(EDOCX1的英文本1是Prompt):(p)字母名称(P)字母名称0已经是一个长期的标准单指令。(p)(P)Now for the WTF Feature.This is from EDOCX1 theographic 3(emphasis mine):(p)布尔奇1
- 我用哈斯克尔做这个。
- 我使用IRB(15个字符的限制是哑的)
- 谷歌计算器?
- 我已经开始使用python了,如果你在线的话,google计算器很不错。但在那之前我用过bc,我想在我的帖子里写关于bc的文章,因为手册中引用了大量的话。
- 我自己也喜欢dc,但那是因为我是一个RPN极客。
- @布赖恩,那么你会喜欢:echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc(尽管你可能已经知道了这一点)。
- 我使用IRB(RubyInteractiveShell)。但在过去的日子里,我总是像BC一样使用DC,但使用的是反向抛光。怪胎!
- 应该将quit重命名为exit,然后这就有意义了。我觉得语言功能是临时添加的,为了保持向后兼容性,名称没有更改。
- 我用聚光灯来做这个。
- @TrinThis(也可以(使用Lisp):p
javascript是面向对象的,对吗?因此,对文本字符串和数字运行方法应该是有效的。像"hello".toUpperCase()和3.toString()一样。第二个是语法错误,为什么?因为解析器希望后面跟一个点的数字是浮点文本。这不是wtf,wtf是你只需要添加另一个点就可以了:
原因是文字3.被解释为3.0,3.0.toString()工作正常。
- 不知道这种"统一",但对我来说这听起来完全合乎逻辑。如何知道从内存中卸载什么?它可能只是猜测,因为您可能希望稍后重新激活它们…如果你真的想释放内存,我相信你可以删除它们。
- 是的,您可以删除它们。这个功能并不是什么奇怪的。这是因为除非您另外存储了一个不活动的对象,否则无法找到它来完全删除它。它只是不符合他们鼓励人们使用他们的香味剂的方式。
在JavaScript中:
1 2 3 4 5 6 7 8
| 2 == [2]
// Even stranger
2 == [[[2]]]
// And down-right nutty
var a = {"abc" : 1 };
a[[[["abc"]]]] === a["abc"]; // this is also true |
幸运的是,stackoverflow.com的好心人向我解释了整个事情:为什么在javascript中2=[2]?
- 这就是为什么你应该使用===来代替。
- 这是非常有用的btw,如果你有一个函数返回一个数字,并且你想用它返回一些额外的元数据,你可以用一些额外的字段返回[number]。简单的代码永远不会知道它不是一个实数,而其他代码可以获得所需的元数据。
- @安德烈,除非我必须维护代码,按照你的建议,我会很快希望它的作者死。
- @安德烈,真是个好主意!你也可以用Number(n)做类似的事情。不幸的是,在我们的两个解决方案中,===中断了=。
- @布雷顿不幸的是,曾经有过这样一种用法,即当两个数组包装器只应用了一个时,希望在保持在数组契约内的同时在彼此之间传递信息。
- +1:我认为自己是一个知识渊博的JS程序员,我从来都不知道这一点:d
- 这是因为[2]被转换成字符串,[[["abc"]]]也被转换成字符串。它仍然显示出糟糕的设计,我…
我最讨厌的特性是任何包含条件逻辑的配置文件语法。在Java世界(蚂蚁,Maven等)你知道你是谁!.
您最终只需使用C**P语言进行编程,调试和编辑器支持有限。
如果您的配置中需要逻辑,那么用真正的语言对配置进行编码的"Python式"方法要好得多。
- 阿门……
- 你所说的这种"Python疗法"是什么?它是在用python编写配置文件并执行"导入myconfigfile"操作吗?
- phkahler——通常的方法是"eval"配置文件。
- TCL早在Python诞生之前就重新发明了它,而Lisp早在那之前就发明了它。所以我们不要称它为Python,我们称它为emacs ish。
- 我们就直说吧。
- 阿门。如果您的配置或构建语言是图灵完成的,那么您就错了。我在看你的照片。
- 耙子,SBT FTW!!!!
- 这正是Lua的设计初衷
- 好吧,如果您的代码是用Python编写的,那么将配置文件作为Python文件是一个好主意,因为您只需导入该文件并读取模块的属性即可。在配置文件中,您可以获得python的100%图灵完整功能。
- 我对图灵的完整评论很感兴趣。
- MavenPOM文件是纯描述性的(这是Maven的观点),不应该包含任何逻辑。别碰我的马文;)
powerbasic(www.powerbasic.com)包含编译器指令:
这将使编译的可执行文件的大小增加字节。这是放在编译器中的,以防创建可执行文件的人不喜欢生成的可执行文件的小尺寸。它使exe看起来更大,可以与膨胀的编程语言竞争:)
- 缩写转换为内存节省,在C64上有3583个字节和38991个字节,每个字节都计数。
- 我还记得你不需要在命令后放空间,所以FORI=1TO15是有效的。不应该花太多的想象力来想出更有趣的例子。不过,每个人都会遇到这样一种情况:如果您将光标放在READY.行上,然后按Enter键,那么基本解析器将其解释为与READ Y相同。
- 在zx谱(至少48k)的sinclair basic中,使用了一种非常类似的方法,其中每个基本关键字都有自己的字符代码,超过0x7f。因此,任何试图查看基本程序转储(而不是使用LIST命令列出的)的人都第一次感到惊讶。
在PHP中,函数名不区分大小写。这可能会让您认为PHP中的所有标识符都不区分大小写。再猜一次。变量区分大小写。世界跆拳道联盟。
1 2 3 4 5 6 7 8 9 10
| function add($a, $b)
{
return $a + $b;
}
$foo = add(1, 2);
$Foo = Add(3, 4);
echo"foo is $foo"; // outputs foo is 3
echo"Foo is $Foo"; // outputs Foo is 7 |
- IIRC通过将第一个(真)值视为主值和第二个值视为回退(如x=int(x),如果x不是其他值0),这是合理的。
我一直非常喜欢在上下文之外的一行中使用两个冒号时抛出的PHP错误:
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /path/to/file/error.php on line 3
当我第一次遇到这个的时候,我完全困惑了。
- …而wtfx2则不完全是HTTP Error 500 Internal server error。
- 为什么不应该引起那种行为呢?因为L?这就是你觉得困惑的地方吗?
- 直到我知道是L导致了这一点,我才明白这一点。当然,我现在更清楚了。;)
在C中
它编译,但很少做你认为应该做的事情。一个优化的改变会导致产生截然不同的结果。它在不同的平台上运行不同。
然而,编译器对它非常满意。
- …但语言不是。在表达式中修改的对某个表达式中某个内容的多个引用是未定义的行为。
- @李察。为什么未定义的行为会编译并运行?这就是我的观点。这是C语言最奇怪的特点。这个特定的代码块是我用来以一种有形的方式总结这个奇怪的特性的。它有时会导致与C N00B的争论,C N00B声称它有明确的含义。
- "为什么未定义的行为会编译并运行?".一般来说,因为在编译时无法检测到导致c中ub的某些东西,并且在运行时检测到它们(或定义行为)会显著影响性能。在这个特定的例子中,我确实认为编译器通常不检测错误有点软弱。这肯定会结束很多争论。但同样的,我不会向GCC提交一个补丁来发布警告。假设您的编译器的作者正在处理其他事情,如果C语言为代码授权了一个错误,这些事情就会被推回。
- "未定义的行为"意味着编译器可以避免没有正确处理代码和/或发出任何警告或错误。这就是为什么,特别是在C语言的情况下,要注意语言的任何未定义或未指定的行为(如ANSI-C标准附件中所规定的那样)是很重要的。编译器(或其制造商)通常假定您知道。
- @CSchol:"编译器(或其制造商)通常假定您知道",这正是C的wtf。
- 这是C允许低级编程这一事实的必然结果,但是CPU对低级错误做出不同的反应。如果C已经定义了所有行为,那么X86上的C将很慢,因为它将尝试从PDP-7模拟边缘案例。如果您不喜欢它,您可以为具有完全定义的行为的特定体系结构编写程序集,或者不编写低级代码。实际上,说"C的wtf是一种可移植的低级语言"似乎有点奇怪。这并不奇怪,因为这就是它的目的。
- a[i++] = i显然是ub,otoh a[(*p)++] = *q是ub,这取决于p和q是否指向同一个对象;在运行该对象之前,您无法分辨哪个对象,因此编译器在一般情况下无法实际执行任何操作。另一个例子:如果分母为零,除法是ub,但是您希望编译器对x / foo(69)做什么?
- 在任何情况下,问题都是关于一种语言的奇怪特性,而不是语言实现。据我所知,未定义的行为对于语言来说相当常见,而实现如何处理UB的情况并不是语言问题。这里可能有一个符合条件的陷阱,但我并不认为它是现成的。
- "未定义的行为对于语言来说相当常见",不是真的。我已经和很多语言一起工作过,C以最坏的方式出现了这个问题,导致了无尽的WTF。一些现代语言,比如Java,根本没有这个"UB"概念。事情要么被定义,要么被禁止,要么就是一个等待修复的bug。
- 请原谅我的C"n00b",但为什么这行编译为除a[i]=i;i++;之外的其他内容?
- @Tzenes:不清楚,确切地说,i在哪里增加。这可能是(如你所希望的)在整个陈述之后。或者是在评估了任务的左侧之后。目前尚不清楚是否首先评估了右侧或左侧。所以至少有四种选择。
- 未定义的行为就是,它是未定义的。这并不意味着它是非法的,只是您不能期望所有实现都有相同的定义行为。
- 据我所知,C要求首先对赋值运算符rhs进行评估[即a=b=c编译为a=(b=c)]。基于应该编译为:temp=i;temp_p=&a m p;(a[i]);i++;*temp_p=temp;的后缀增量,但现在我必须深入研究C标准,看看这是否正确。编辑:显然我错了
- "您不能期望所有实现都有相同的定义行为"。最好的?大多数编译器没有警告。当你改变一些东西的时候,只是一些行为"奇怪"的代码。那是世界跆拳道的时刻。
- @洛特:在过去的60多年里,我们已经学到了很多关于语言行为的说明,但是我们并不完美,所以在许多现代语言中仍然存在着未定义的行为。此外,像C这样的语言将低估行为以允许性能。不过,C可能还是乌兰巴托的海报。
- @Tzenes:这很复杂。操作是按照或多或少定义的顺序执行的,以评估表达式的值,但是在应用副作用方面的限制要少得多。该标准指定了"序列点",所有的副作用都应用在该点上,但表达式中没有序列点。这是一个非法表达式,但显然不是这样,类似的表达式定义得很好。
- GCC用-Wall标志警告这个warning: operation on 'i' may be undefined标志。
- 至少在c中,它(不应该)是未定义的:我们得到i并将其存储在一个变量中。增量i,使用temp变量访问数组,并设置该值。阿法克,这就是它的工作原理…
- -1:未定义的行为是未定义的行为,不是非法行为。
- @特立尼西:你错过了要点。仅仅存在"未定义行为",它编译时不会出错并生成代码,这就是问题所在。
- @洛特:只是比这更深。正如SGM指出的那样,很容易编写代码,这些代码可能会产生编译器不可能捕捉到的未定义行为,除非我们希望为x/0定义行为,这将严重降低某些计算机上的除法速度,无论定义如何。我们都知道C有很多UB问题,但是我们似乎错过了根本原因。
- 我对运行时错误很好,比如x/0。我对编译无错误和含糊不清的东西不满意。是这种模棱两可扼杀了我。
- 当您在一条语句中多次设置同一个变量时,clang会发出警告,就像在本例中一样。
- @Radek S:你没有多次设置变量。您设置了两个不同的值,其中一个值未定义。
Python 2.xP></
1 2 3
| >>>True = False
>>>True
False |
你可以真的让这成为一个如此疯狂。P></
Oracle有几个SQL WTF问题。
Oracle对空字符串的处理为空。
在"<>"比较中处理空值。
1 2 3 4 5
| create table wtf (key number primary key, animal varchar2(10));
insert into wtf values (1,'dog');
insert into wtf values (2,'');
insert into wtf values (3,'cat');
select * from wtf where animal <> 'cat'; |
返回的唯一行是(1,'dog')行。
- 我希望SQL Server将空字符串视为空字符串。毕竟,这两者的实际区别是什么?我的数据库充满了检查(名称<>""。
- 问题是,将空值视为与""不同也是一个wtf。也许解决方案是永远不要有空字符串,但总是空的,但我敢打赌,这也是一个WTF。这可能是一个没有很好解决方案的问题。
- 两者的实际区别在于""是一个值。NULL不是。
- 好的,"值"的定义是什么?
- 安德烈:生命的意义是什么?
- 值是已知的数量、金额或测量值,数值或其他。例如,如果没有特殊说明,"特殊说明"字段可以是"",如果该字段尚未填充,则为空。
- 字符串''不应比整数0更被视为空。
- Andrey Shchekin,试试这个:NULLIF(field, '')。如果找到值'',则分配NULL。它就像是ISNULL(field, '')的兄弟,如果找到NULL的话,''将赋值给''。
- 什么!我很高兴我们不用甲骨文。那太可怕了。
- +1用于将""视为空,-1用于"<>"比较中的空值。无法确定"未知"值是否不等于未知值。"与空的比较永远不会产生对或错,但总是会产生第三个逻辑结果,未知"-en.wikipedia.org/wiki/null_(sql)三值逻辑_283vl.2&zwnj;&8203;9
- @MarkRoddy:只需使用SELECT * FROM wtf WHERE ISNULL(animal, '') <> 'cat',这与在任何RDBMS中都是一样的。
- @本·布兰克——你有没有忘记什么?
- 字符串""不应被视为空,就像整数0一样。在逻辑上,当0与空不同时,我看到的情况比当""不同时,更多。实际上,我还没有看到一个单一的业务案例,当""是一个可为空字符串字段的有效值并且不同于空值时。
- 即使在语言级别上,空序列与空值相同也是有意义的。有些情况下,这两个具有不同的含义,但我不认为这些情况是良好的API和良好的实践。
- @安德烈:空在SQL中有特殊的属性。从T1,T2中选择*,其中T1.C1=T2.C2将与C1和C2为空的行不匹配,即使它们相同。它的意思更像是"未知"。如果你不知道两个人的年龄(p1.age=null和p2.age=null),就不知道他们有相同的年龄。
- Oracle对空字符串和空值很有趣。对于某些比较,空字符串为空。对其他人来说,事实并非如此。事情很不一致。这是在多个数据库上写东西时最让我伤心的事情之一。
- @尼克萨尔,好吧,但当你知道什么东西的价值是"时,生活中的实际情况是什么?我知道空有奇怪的比较规则,但是什么是c1和c2,所以两个''相等是有意义的?
- @andrey shchekin:上面提到了一个用于区分空字符串和NULL的用例。在任何情况下,NULL表示没有提供任何值,而空字符串是零长度的值。与许多命令式语言一样,数组引用可以是NULL或对零元素数组的引用。这种差异有时很重要。如果数据成员的长度为零,则其长度和内容是已知的。如果它是NULL,那么它的长度和内容是未知的,直到它被检索/计算/提示/任何东西。
- @安德烈·什切金:真实世界的例子:中间名。空-中间名未知。空字符串-人没有中间名。
- 如果涉及文本,则空表示"我们还不知道该值"。空字符串表示"我们知道该值没有值"。如果您有汽车列表,则知道哪些车辆没有牌照,哪些车辆尚未输入其牌照号很有价值。也可以断言,两辆车的车牌号码你还不知道,但他们的车牌号码不一样,但两辆车没有车牌。
- 回到SQL Server 7之前,空字符串存储为单个空间,以避免出现此问题。当然,这只会改变两个值混淆的情况,但是与空值相比,包含单个空间的字符串要少得多。
- 创建表wtf(key number主键,animal varchar2(10));插入wtf值(1,'dog');插入wtf值(2,');插入wtf值(3,'cat');从wtf中选择*,其中animal'x'<>'cat''x';
- 在Oracle中,不能对空值执行常规操作。唯一能打开空值的方法是"is"操作符。空字符串被认为与空字符串相同。< >!=和=以及您要执行的任何布尔操作在命中空值时都将始终返回false。无法比较空值。必要的何处条款是动物!="cat"或"animal"为空。这是我从Oracle开始阅读的Oreily的Oracle书籍中的一个大主题。
Java有一本关于它们的完整的书。
书http://www.javapuzzlers.com/lg-puzzlers-cropped.jpg
Java解惑
- 我喜欢那些书。
- 公平地说,C语言中的同一个主题将成为一本更大的书。如果你喜欢这样的书,我会推荐DeepC Secrets(my.safaribooksonline.com/book/programming/c/0131774298)。写在C99之前,但仍然是一个有用和有趣的阅读。
在javascript中,void不是关键字,不是类型声明,也不是变量名,也不是函数,也不是对象。void是一个前缀运算符,类似于-、--、++和!。您可以将它作为任何表达式的前缀,并且该表达式的计算结果将为未定义。
它经常在bookmarklets和内联事件处理程序中使用,在这个比较常见的示例中:
在这个例子中,它的使用方式使它看起来像一个函数调用,而实际上它只是一个非常巧妙的方法来获取原始的undefined值。大多数人并不真正理解javascript中void的真实本质,这会导致大量令人讨厌的错误和奇怪的意外事件发生。
不幸的是,我认为void操作符是获取javascript中undefined值的唯一真正有保证的方法,因为正如另一个答案所指出的,undefined是一个可以重新分配的变量名,{}.a可能被Object.prototype.a = 'foo'弄乱。
更新:我想到了另一种生成undefined的方法:
嗯,虽然有点冗长,但返回"undefined"是它的目的更不清楚。
- 就我所记得的,":"在Java/C中意味着什么;它是一个古老的基本事物,而不是雅达利的专一性。
- @佩德罗弗拉:我很确定他说的是,在这三个任务之后,从3美元到99美元,现在也将包含空格。我敢打赌,底层字符串实现看起来很可怕。
- @詹德:是的,现在我正在重新解释这条线。这是一个令人难以置信的特点。A$(2)=A$部分相当奇怪,真的不知道它背后是什么。
Perl有yada yada操作符(...)。
The so called"yada yada" operator of Perl 6 heritage is a shortcut to mark unimplemented code:
is the same as
1
| if ($condition) { die"not yet implemented" } |
在FORTRAN中(77当然,也可能在95中),从I到N(in)组开始的未声明变量和参数将是INTEGER,所有其他未声明的变量和参数将是REAL(来源)。这一点,再加上"在某些情况下可选择空白"导致了最著名的错误之一。
如1990年alt.folklore.computers中弗雷德·韦伯所说:
I worked at Nasa during the summer of 1963. The group I was working
in was doing preliminary work on the Mission Control Center computer
systems and programs. My office mate had the job of testing out an
orbit computation program which had been used during the Mercury
flights. Running some test data with known answers through it, he was
getting answers that were close, but not accurate enough. So, he
started looking for numerical problems in the algorithm, checking to
make sure his tests data was really correct, etc.
After a couple of weeks with no results, he came across a DO
statement, in the form:
This statement was interpreted by the compiler (correctly) as:
The programmer had clearly intended:
After changing the . to a , the program results were correct to
the desired accuracy. Apparently, the program's answers had been
"good enough" for the sub-orbital Mercury flights, so no one suspected
a bug until they tried to get greater accuracy, in anticipation of
later orbital and moon flights. As far as I know, this particular bug
was never blamed for any actual failure of a space flight, but the
other details here seem close enough that I'm sure this incident is the
source of the DO story.
我认为把DO 10 I作为DO10I是一个很大的wtf,反过来,由于隐含的声明被认为是REAL类型。这是一个伟大的故事。
- 与旧的C语法相同。但请记住,标准HTML需要CR+LF("
"
行)换行。
- @加载管理器:你不是指HTTP吗?Afaik HTML不区分行分隔符
- 实际上,当您需要定义一个veeeery长字符串而不需要使用字符串连接操作符时,这非常方便。
- @海伦只是,如果你想缩小或者做任何其他类型的自动空白操作,它就会崩溃。
- 但在Java中不起作用
- 注意,虽然这在许多浏览器中都有效,但它不是ECMAScript标准的一部分。请参见:google styleguide.googlecode.com/svn/trunk/&hellip;
- 实际上,它是ECMAScript 5的一部分。这并不意味着你应该使用它(你不应该),但是你所说的是不正确的@martineno
- @阿巴格也许他们有能力把它移走。我发现它也在C语言中工作。
- @布雷顿,你是绝对正确的。我去看了标准的文件。它不在ecmascript 3中,但自2009年12月出版的esmascript 5以来一直在我们身边。我想知道哪个旧的浏览器可靠地支持这个符号。
- 它总是出现在大多数/所有浏览器中。现在的区别是它已经记录在标准中了。
我最喜欢的小C++语法技巧是你可以直接把URL(有一些限制)放进代码中:
1 2 3 4 5 6 7
| int main( int argc, char *argv[] )
{
int i=10;
http://www.stackoverflow.com
return 1;
} |
这编译得很好。
突出显示的语法破坏了这个笑话,但它仍然很有趣。
我不敢说XML是一种编程语言,但它离我们的心不近吗?-)
在我看来,XML最奇怪的特点是,以下是一个格式良好的文档:
下面是NT名称的词汇定义,它允许连续的点。
- 这到底有什么道理和价值?这看起来像是来自XML设计者的笑话。
- 如果我正确地阅读规范,我也可以使用<:-D>..</:-D>作为标记。太好了,我马上就要滥用它了!
- esko:这不太管用,因为名称空间规范阻止了冒号前面没有前缀:)您必须在冒号前面至少放置一个有效的起始字符。XML不需要像Java DO这样的导航编程语言(例如Fo.bar);为什么他们不进一步限制词汇定义,我不知道。懒惰?或者他们只是不在乎。
- 所以,给笑脸戴上帽子(C是有效的吗?OMG</o_o>是直接有效的tho'
- XMI是UML的交换格式,使用了大量的点状名称。
- XCUT说得对。名称空间会终止此操作。
- +一首诗
- +1用于模糊<_><:>:_>:/:_<:</:></_>。
- 它离我的心很远!
- Talvi,XML不够模糊,因为它是…
- @正如@xcut指出的那样,talvi名称空间规范防止您使用前面没有前缀的冒号(但是解析器必须接受这些冒号)。另外,第三个<是非法的(我认为应该是文本内容)。埃多克斯1〔5〕怎么样
- 如果您不让XML远离您的心脏,它将割伤您,您将流血。千角括号之死。
- @不过,凯利夫我们可以在他们身上贴些圆括号绷带。
从Ruby中的随机类继承:
1 2 3
| class RandomSubclass < [Array, Hash, String, Fixnum, Float, TrueClass].sample
...
end |
(首先在Ruby的隐藏特性中看到)
- 因为它是一个物体?(只是猜测)
- 就在docs-us.php.net/count中。"如果var不是数组或具有已实现可计数接口的对象,则返回1。有一个异常,如果var为空,则返回0。"
我惊讶地发现,通过修改类的@ISA数组,可以在Perl中更改类的继承链。
1 2 3 4 5
| package Employee;
our @ISA = qw(Person);
# somwhere far far away in a package long ago
@Employee::ISA = qw(Shape);
# Now all Employee objects no longer inherit from 'Person' but from 'Shape' |
- 哎呀。那是真的吗?真奇怪!!)
- 如果我没记错的话,客观C也是可能的。我认为coco/gnustep中的kvo是通过在运行时动态地对观察到的对象进行子类化来拦截访问器方法来工作的。对象的isa/class_pointer更改为新创建的子类。
- 在某些方面,它并不比在for循环中更改索引变量更奇怪。当然,大多数语言并没有那么多地公开面向对象的方面(参见通用的Lisp元对象协议)。
- @大卫:是的,那是因为大多数语言都没有面向对象的方面作为后遗症移植到语言上。
- 这叫做元编程。能够更改类(通过添加父类、方法等)作为程序的一部分。对于调试(例如将记录器父类添加到任何现有类)和扩展等操作非常有用。
- 我看不出什么是奇怪的——它只是一种动态语言,按照命令去做。它支持很多有用的东西,比如class::mop。
我喜欢这样一个事实,即在javascript中,这类事情是很好的:
1 2
| var futureDate = new Date(2010,77,154);
alert(futureDate); |
结果是从2010年10月0日起77个月154天,即2016年11月1日。
- 天哪,太可怕了。在计算机为我计算日期之前,我必须为它计算日期!
- 我真的很喜欢。
- 这里有什么问题吗?这只是自动标准化日期。当数字是数学的结果时,使用这种方法并没有多大意义,但它是有用的。
- 我没说什么不对劲-我说我爱它…
- 我曾经工作过的一个程序在timestamp类上有这个"特性",但只存在小时/分钟/秒。天/月/年仅限于其正常范围。当人们进入像"25:70:99"这样的时间时,它会让我很伤心,第二天它会把他们变成某种东西,而不是像我预期的那样抛出错误。我同意这个功能是有用的,但它应该是可选的。
- 注意。____
- 我不喜欢那样。
在ruby/python/c中,可以像这样连接字符串:
1 2
| a ="foo""bar"
print a # =>"foobar" |
- 在C里也一样,不是吗?
- 还有Python。
- 那不是世贸组织,那是令人敬畏的
- @雷德:只要它们是不变的弦-是的。
- 哦,是的。如果你在C语言中有一个变量函数,而忘记了两个符号常量之间的逗号,那就很有趣了。所有参数都被一个参数所抵消,并且崩溃得更厉害。但是在objc中很好,在这里您可以使用@"文件来获取具有文件名的nsstring。
- 哦,好漂亮的奥比奇技巧!
- 仍然比+更好的字符串连接语法(参见上面的chrisharris's),只是它只适用于常量。
- 作为obj-c中的旁注,当您将它与nsstring常量(@""一起使用时,您不需要任何额外的@s。例如,@"foo""bar"。这对于跨行断开字符串非常有用…
- 几十年来,上海金融时报一直在这样做。
- 字符串常量。在bar是包含字符串的变量的情况下执行"foo" bar是行不通的。
- 在核心基础上,建立编译时静态EDCOX1(1)实例的EDCOX1×0的宏确保它只与常数字符串一起使用:定义为:EDCOX1×2
- 在Python中,这不是"字符串串联"——它是代码解析的一部分。这是在解析("编译")时而不是在运行时发生的少数事情之一。因此,打印"a"+"b"和打印"a""b"会产生相同的结果,但本质上是不同的-后者只应用于在多行代码上拆分大型字符串常量(在这种情况下,由于的原因,您负担不起三引号-"bla"样式)
- 我将它称为字符串常量语法,而不是串联。
- 在只适用于字符串文本的python中,总是很明显会发生什么
在javascript中,undefined是一个全局变量,其默认值是原始值undefined。您可以更改undefined的值:
1 2 3 4
| var a = {};
a.b === undefined; // true because property b is not set
undefined = 42;
a.b === undefined; // false |
由于undefined的可变性,一般最好通过typeof来检查不确定性:
1 2
| var a = {};
typeof a.b =="undefined"; // always true |
- 为什么投反对票?
- 只是猜测一下,但解释它是语法错误的原因可能会有所帮助。
第四,任何不包含空格的东西都可以是标识符(包含空格的东西需要做一些工作)。解析器首先检查事物是否被定义,在这种情况下,它被称为一个词,如果不是,则检查它是否是一个数字。没有关键字。
无论如何,这意味着人们可以重新定义一个数字来表示其他东西:
它创造了"EDOCX1"(2)这个词,由1组成,不管当时执行的是什么。反过来,它会导致以下结果:
另一方面,定义可以接管解析器本身——这是已经完成的工作用评论词。这意味着第四个程序实际上可以在中途变成一个完全不同语言的程序。事实上,这是forth中推荐的编程方法:首先编写要用以解决问题的语言,然后解决问题。
大约在1977年,在"printf"还没有出现之前,我将"format"函数添加到了lisp中(我是从与unix相同的源复制的:multics)。它一开始就很天真,但一个接一个的特性充斥着它。当盖伊·斯蒂尔(GuySteele)将迭代和相关的特性放入通用的lisp x3j13-ansi标准中时,事情就失控了。以下示例见通用LISP语言第2版第22.3.3节表22-8:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| (defun print-xapping (xapping stream depth)
(declare (ignore depth))
(format stream
"~:[{~;[~]~:{~S~:[->~S~;~*~]~:^ ~}~:[~; ~]~ ~{~S->~^ ~}~:[~; ~]~[~*~;->~S~;->~*~]~:[}~;]~]"
(xectorp xapping)
(do ((vp (xectorp xapping))
(sp (finite-part-is-xetp xapping))
(d (xapping-domain xapping) (cdr d))
(r (xapping-range xapping) (cdr r))
(z '() (cons (list (if vp (car r) (car d)) (or vp sp) (car r)) z)))
((null d) (reverse z)))
(and (xapping-domain xapping)
(or (xapping-exceptions xapping)
(xapping-infinite xapping)))
(xapping-exceptions xapping)
(and (xapping-exceptions xapping)
(xapping-infinite xapping))
(ecase (xapping-infinite xapping)
((nil) 0)
(:constant 1)
(:universal 2))
(xapping-default xapping)
(xectorp xapping))) |
- 以0为前缀的数字是八进制数。
- 是的,我知道这一点,但看起来仍然很奇怪:)而且因为这里的大多数答案都是可以解释的。
- @博佐,这有什么奇怪的?8不是一个八进制的有效数字,所以它只换回0左右。记住八进制是0到7。
- 这是违反直觉的,因为当解析int时,您会期望它以十进制表示法并去掉前导零。这会导致很多讨厌的虫子…谁还要分析八进制数呢?其他语言(更直观地说)默认为十进制,可以用基数参数覆盖。
- 八进制表示为前导零,至少从'78年开始。
- 这是这个线程中的副本
- 在整数上下文中,我认为以0开头的表示是完全正常的。然而,一个要求字符串以八进制表示的显式转换函数,和int接受两个不同的基非常奇怪。` perl-e'my$foo="05";假设int($foo)'python -c 'a ="05"; b = int(a); print b';ruby -e'a='05'; puts a.to_i'。全部返回5。
流行性腮腺炎。有很多wtf特性,我选择了一个,if声明。(请注意,为了适应那些不懂该语言的人,我下面使用了一种相当冗长的编码方式;真正的流行性腮腺炎代码通常对未入门的人来说更难以理解。)
1 2
| if x>10 do myTag(x) ; in MUMPS"tag" means procedure/function
else do otherTag(x) |
这与Java中的说法类似:
1 2 3 4 5
| if (x > 10) {
myMethod(x);
} else {
otherMethod(x);
} |
除了腮腺炎中的else语句在语法上不是if块的一部分外,它是一个单独的语句,通过检查内置变量$TEST工作。每次执行if语句时,都会将$TEST设置为if语句的结果。else语句实际上是指"如果$TEST为假,执行行的其余部分,否则跳到下一行"。
这意味着,如果x大于10,因此第一行称为myTag,而myTag包含if语句,那么else的行为不取决于其上一行的if而是取决于在myTag内部评估的最后一个if语句!由于这一"特性",腮腺炎编码员通常被教导编写上述代码以确保安全:
1 2
| if x>10 do myTag(x) if 1
else do otherTag(x) |
第一行末尾的if 1确保在控制进入下一行之前正确设置$TEST。(顺便说一句,这里的间距必须是这样的,在else之后有两个空格,在所有其他地方有一个空格。间距是奇数,但至少在理解了模式后它是正交的。)
- 在python中也可以这样工作(尝试3..__add__(4))。然后,我再次认为,(3).__add__(4)是一种大脑损伤小得多的方法。
- 你只需做(3).toString()。
- @大猩猩3D:是的,但这不是一个奇怪的语言特征,是吗?
- 江户十一〔十二〕使我眼睛发痒。
- 127.0.0.1.ToInt()。
- 这真的很难分析吗?我会把它当成一个愚蠢的Java事件,直到巴普指出Python也这么做。我是说,来吧。你甚至不能用以数字开头的变量名,所以这不是问题。
- String(3)也起作用。
- 你也可以使用3 .toString()或(3).toString()。
- 3['toString']()也起作用。
- 你知道什么更好吗?'3'
python的everything-is-really-a-reference有趣的副作用:
1 2 3 4 5 6
| >>> a = [[1]] * 7
>>> a
[[1], [1], [1], [1], [1], [1], [1]]
>>> a[0][0] = 2
>>> a
[[2], [2], [2], [2], [2], [2], [2]] |
在javascript中,可以使用双位否定(~~n来代替Math.floor(n)(如果n是正数)或parseInt(n, 10)(即使n是负数)。n|n和n&n总是产生与~~n相同的结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var n = Math.PI;
n; // 3.141592653589793
Math.floor(n); // 3
parseInt(n, 10); // 3
~~n; // 3
n|n; // 3
n&n; // 3
// ~~n works as a replacement for parseInt() with negative numbers…
~~(-n); // -3
(-n)|(-n); // -3
(-n)&(-n); // -3
parseInt(-n, 10); // -3
// …although it doesn’t replace Math.floor() for negative numbers
Math.floor(-n); // -4 |
一个单位否定(~计算-(parseInt(n, 10) + 1),因此两个位否定将返回-(-(parseInt(n, 10) + 1) + 1)。
更新:这里有一个JSPerf测试案例,比较了这些备选方案的性能。
- 我花了一点时间才弄到这个,但很搞笑。
- 呵呵,太棒了!
- 也在C中工作。
- 很好,但是"http:"是如何编译的?
- @SERG:http:是goto标签,它在当前作用域中定义了一个位置,您可以通过调用goto http;跳转到该位置。
- 谢谢,达维森。我太好奇了,从我的同事那里得到了答案。的确,不错的特色)
- 然后您可以写入goto http;//www.stackoverflow.com
ansi-sql中nulls的三值逻辑。
- 我既不同意也不反对
- 我知道有人发表了评论,但它没有出现在查询结果中。
- 我实际上喜欢这个三值逻辑,尽管它可能会伤害无辜的人。
- 考虑到SQL有空值,3-VL似乎比失败语句或编写一些不正确的规则更好。
- 空意味着你不知道什么是真是假。这是合乎逻辑的。
从类型安全的角度来看,这并不是一个很奇怪的特性,而是一个真正令人恼火的特性:C中的数组协方差。
1 2 3 4 5 6
| class Foo { }
class Bar : Foo { }
class Baz : Foo { }
Foo[] foo = new Bar[1];
foo[0] = new Baz(); // Oh snap! |
我相信这是爪哇遗传的(双关语有意的)。
- 我不确定我理解这里的问题…
- 将baz的实例分配给foo将导致运行时错误,因为foo实际上是一个bar数组,baz不会从中派生。这意味着,例如,如果您有一个方法接受一个foo数组,那么您就不能确定是否能够在不引起异常的情况下修改它。
- 公平地说,当你说'foo[]foo='时,你告诉编译器foo是一个包含foo对象的数组…当添加foo对象时,为什么要抱怨?在我看来,这是一种理性的行为。
- 重点不是它应该阻止我将new Baz()添加到foo中;相反,它不应该让我首先将数组强制为Foo[]类型。foo的数组有两个保证:1)从该数组中检索到的任何元素都将具有foo类型;2)可以将foo类型的任何对象分配给该数组。如果数组的底层类型实际上是Bar,显然不是这样。
- EricLippert写了一系列关于类型差异的文章,其中第二篇文章说明了数组协方差的问题:blogs.msdn.com/ericlippet/archive/2007/10/17/&hellip;
- 就是这样。这是关于继承和多态性的全部要点。每次使用接口时都会做类似的事情!
- 在Scala编程中,在第391页中讨论了这种行为:"当被问及为什么Java具有协变数组时,Java的主要发明人詹姆斯·高斯林回答说,他们希望有一种简单的方法来一般地处理数组。例如,他们希望能够编写一个方法来对数组的所有元素进行排序,使用一个像下面这样的签名,它接受一个Object数组:void sort(Object[] a, Comparator cmp) { ... }。需要数组的协方差,以便将任意引用类型的数组传递给此sort方法。"
- @科比:我不明白。Bar[]不是Foo[]的一个亚型,那么遗传和多态性与它有什么关系呢?不允许这种类型差异的原因是数组允许对其基础类型执行读写操作。只读类型可以是协变类型,而只写类型可以是逆变类型,但读/写类型根本不能是类型变量。
- @这可以很容易地通过仿制药来实现。我意识到,这可能是在它们被添加到Java之前,但它仍然是一种不正确的类型方差形式(并且可以在没有数组协方差或泛型的情况下通过使用EDCOX1×14)类型来实现这一点。
- 审问者:哦,我知道,我只是给出了一些关于为什么Java有协变数组的上下文。
- 审问者:这里的一个挑剔:Java没有泛型。Java有模板,它远不如泛型强大。请参阅C以获得在类C语法中实现的真正泛型的一个很好的示例。
- 不,Java没有模板。模板为使用模板的每个类型生成新代码。C++模板做到这一点,Java泛型不这样做。Java泛型与C语言泛型更为相似;不同之处在于,C语言保留字节码中的类型参数的信息,而Java在编译时使用它来进行类型检查后丢弃该信息。
- 这种行为完全是有意的。您应该能够将一个条形数组分配给一个foo数组,因为它们是相同的基类型。但是,baz和foo位于树的不同分支上,因此不能将bar元素实例化为baz…不过,您可以将baz元素添加到foo数组中。
- 处理这种情况的正确方法是为可读数组、readandswap数组和可写数组提供单独的数组类型(readandswap数组支持交换两个项,但两者都必须是同一数组的成员)。前两种类型可以安全地协变;第三种类型不能。
我在C中最喜欢的怪异是5["Hello World"],但由于这已经发布,我下一个最喜欢的怪异是Windows版本的结构初始化黑客:
1 2 3 4 5
| void someWindowsFunction() {
BITMAPINFOHEADER header = {sizeof header};
/* do stuff with header */
} |
这条微妙的线条完成了以下任务:
声明BitmapInfoHeader结构
简洁地设置结构的"大小"成员,而不硬编码大小常量(因为许多窗口结构,包括BitmapInfoHeader,遵循将结构大小指定为第一个成员的惯例
声明结构的版本(因为许多Windows结构,包括BitmapInfoHeader,按照仅追加结构定义的约定,按声明的大小标识其版本)
清除结构的所有其他成员(结构未完全初始化时的C标准行为)。
- 事实上,我发现这是一个优雅的解决方案,而不是一个WTF。
- 我什么时候说是世贸组织?最初的问题是"令人惊讶、奇怪、奇怪或真正的‘wtf’"。令我惊讶的是,当一行代码结合了一个使用很少但定义良好的语言行为和一个简单的编码约定时,它的表现力有多强。
使所有的对象实例都是互斥体。
- 好吧,公平地说,如果不是这样的话,使用synchronized声明会困难得多。
- 将mutex类与随后可以在每个同步语句中使用的jvm一起传送有什么问题?那么还有什么更困难的呢?
- 也许他讨厌多核/CPU系统。
- 呃,也许他不喜欢给你分配的每一个对象增加开销,或者他注意到,如果你在每个对象的基础上锁定,你几乎肯定是做错了,或者你可以用一个泛型库来完成它,而不是加重核心语言语法的负担,或者……
- 从1.5开始有一个专门的类:java.util.concurrent.locks.ReentrantLock,但从一开始它就可能是一个独立的类。大多数对象不需要内置锁,尤其是不可变对象。
- @芬诺-没什么区别。Java仍然允许任何对象用作互斥体,JIT不可能确定对象永远不能用作互斥体。因此,运行时系统必须在每个对象上保留空间来表示互斥体。
- 在任何我见过或编写过的真实世界多线程Java代码中,同步块总是作用于JavaUTI.CONCURNET.ROCK锁(从而可以正确地管理读写器锁)或一个只充当锁的对象。考虑到这一点,我认为传送互斥类并避免对其他所有对象的不必要开销完全没有问题。不管怎样,当您查看变量声明时,拥有一个锁/互斥类会使意图更加清晰,而且更清晰的意图(imho)比使所有对象互斥所增加的一点便利更重要。
在PHP中,可以做到:
1
| System.out.print("hello"); |
在JavaScript中:
1
| alert(111111111111111111111) // alerts 111111111111111110000 |
这对我在JSON中来回传递的一些64位密钥是非常有害的。
python的for循环中的else。
从python文档中:
1 2 3 4 5 6 7 8
| for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print n, 'equals', x, '*', n/x
break
else:
# loop fell through without finding a factor
print n, 'is a prime number' |
输出:
1 2 3 4 5 6 7 8
| 2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3 |
- 这是因为变量和函数声明的hoisting导致的
- 这只是起重的一个例子。充分好给出了一篇关于提升的非常深入的文章。
一些早期的动态语言(如果我记得正确的话,包括早期版本的Perl)没有发现什么是好的动态,什么是坏的动态。所以他们中的一些人允许:
在那句话之后,以下是真的:
在Python中,函数参数的"编译时"(或声明时)计算可能会令人困惑:
1 2 3 4 5 6 7 8 9 10
| def append(v, l = []):
l.append(v)
return l
print append(1)
print append(2)
>>> [1]
>>> [1,2] |
其目的可能是:
1 2 3 4 5 6 7 8 9 10 11
| def append(v, l = None):
if l is None:
l = []
l.append(v)
return l
print append(1)
print append(2)
>>> [1]
>>> [2] |
这种行为对于缓存之类的事情很有用,但它可能很危险。
附加功能:具有可变内容的元组:
1 2 3
| a = (1,2,[3])
a[2][:] = [4] # OK
a[2] = [2] # crashes |
- 但是有人真的用过ISO646吗?
- 好吧,也许有些人知道这些特性后会使用它…但这些几乎没有提到。但是,当然每个人都必须学会阅读和使用"普通"操作符,所以很容易理解,他们不经常提到。这些宏背后的主要意图是(根据维基百科的说法):有些标准的操作程序有时不能用一些国际键盘布局快速或轻松地输入。所以这些宏被引入……
- 它们不是宏,而是关键字。在C语言中,它们是来自的宏。这个头名称告诉了他们引入的真正原因:一个ISO标准(646)指定了一个标准拼写,至少另外两个(ISO C和ISO C++)建立在这一点上。
- 另请访问stackoverflow.com/questions/1995113/StrangestLanguage Featu&zwnj;&8203;re/&hellip;
- 国际标准化组织646是一个早期的国家字符集标准,其中大部分没有包括所有字符所需的C。
PHP中的字符串,函数is as good as a的指针:P></
1 2 3
| $x ="foo";
function foo(){ echo"wtf"; }
$x(); #"wtf" |
不幸的是他/她,这不工作:P></
- 它返回错误。
- 根据定义,array[i]和i[array]都与*(array+i)相同。
- 它不起作用。它是…最热门的答案。
在JavaScript中,方法的结果取决于样式大括号的位置。这是k&r样式,其中大括号位于方法签名之后和返回语句之后:
1 2 3 4 5 6 7
| var foo = function() {
return {
key: 'value'
};
}
foo() // returns an object here |
现在,如果我将此代码格式化为Allman样式,其中大括号总是放在新行上,则结果不同:
1 2 3 4 5 6 7 8 9
| var foo = function()
{
return
{
key: 'value'
};
}
foo() // returns undefined here |
怎么会?在javascript中,如果您不自己做,语言会自动在每行的末尾放置分号。所以在最后一个代码片段中真正发生的是:
1 2 3 4 5 6 7
| var foo = function()
{
return; // here's actually a semicolon, automatically set by JavaScript!
{
key: 'value'
};
} |
因此,如果调用foo(),方法中的第一条语句将是返回语句,它将返回undefined,并且不会执行其他后续语句。
- 我想我应该补充一下,从本质上讲,这不是一种语言特性,而是一种奇怪的语法选择。如果我必须选择Erlang的一个奇怪的语言特性,它将字符串表示为整数列表。含义[80,97117108]。="保罗"。我想知道这对Facebook聊天有什么影响,如果有的话?
- C字符串也只是一个整数列表,有点像。
在scala中,没有操作符,只有方法。因此,a + b - c实际上与a.+(b).-(c)相同。在这一点上,它等于smalltalk。但是,与smalltalk不同,优先权被考虑在内。规则基于第一个字符,因此一个称为*+的假设方法将优先于一个称为+*的方法。例外情况是,任何以=结尾的方法都将具有与==相同的优先级,即!!和!=具有不同的优先级。
所有ASCII字母的优先级最低,但所有非ASCII(Unicode)字符的优先级最高。因此,如果编写了一个方法is比较两个整数,那么2 + 2 is 1 + 3将编译并为真。如果你用葡萄牙语写,é,那么2 + 2 é 1 + 3会导致错误,就像2 + (2 é 1) + 3一样。
另外,为了补充scala中运算符的wtf,所有以:结尾的方法都是右相关的,而不是左相关的。也就是说,1 :: 2 :: Nil相当于Nil.::(2).::(1)而不是1.::(2).::(Nil)。
- 它是未定义的。不能在语句的不同位置更改变量,这是未定义的;不含糊。
- 然而,我不会说它是含糊不清的或未定义的,或者其他什么,即使是ffjoe也使用了许多人熟悉的非常古老的代码。它更像是一个C bug或者类似于那些奇怪的东西。编程语言应该始终具有相同的行为,即使对于表达式(语言的最核心部分)也是如此。我认为,上面描述的表达式应该是确定性的,因为它总是有一些定义的优先规则。对不起,不能很好地用英语组合句子。
- 问题在于,C语言允许在序列点之间按任意顺序执行操作,以便编译器优化表达式。第二行中唯一的序列点是赋值运算符,因此根据编译器认为最有效的操作,所有其他操作都可以以任何顺序进行。对执行顺序指定更多的约束(更多的"确定性")规则将抑制优化。
- @Lyubomyr:它是未定义的,在StackOverflow上已经讨论过很多次了。Prason Saurav在这个答案中很好地总结了这一点。
- @默认,谢谢,我会看的。
其他奇怪的事情:
在C++中,重写虚拟方法隐藏了该方法的所有其他重载。在爪哇,这种情况不会发生。这很烦人。示例:http://codepad.org/uhvl1njp
在C++中,如果基类具有公共虚拟方法FoE(),并且子类具有私有方法FoE(),则该私有方法重写另一个方法!这样,只需将子类对象指针强制转换为超类对象指针,就可以调用类外部的私有方法。这不可能:这违反了封装。新方法不应被视为旧方法的重写。示例:http://codepad.org/lugnpspdh
在PHP中,您可以定义函数来接受类型化参数(例如,对象是某个接口/类的子类),令人恼火的是,在这种情况下,您不能使用空作为实际参数值。示例:http://codepad.org/fphvrz3s
- 啊耶!对于php不允许空值,我真的很恼火。
- 实际上,如果您提供类型提示参数null的默认值,则意味着该值可以是null或指定类的实例。
- 第二点在同一个线程中得到了更好的解释:stackoverflow.com/questions/1995113/StrangestLanguage Featu&zwnj;&8203;re/&hellip;
- @伊万卡罗尔,你链接的另一个答案显示了另一个不同的问题。这里的解释完全不同;)
- 回复:private foo()覆盖public foo(),这是一个很好的设计。否则,更改访问限定符可能会静默地更改调用的方法。它可以被颠覆的方式描述是不幸的,但两个邪恶中的较小者。
- NULL->eat应该抛出一个错误!为什么这不正常?
- @TalviWatia,我不知道你在这方面的意思。
- 对象中的null表示空,如果未定义则表示未知。子元素通常不应该存在。在http://codepad.org/FphVRZ3S的示例中,有一个子元素正在从$obj调用…return $obj->eat();…在下面,当您调用foo(null);时,实际上应该先创建foo();,而不是foo($var_obj);。插入null作为函数参数是行不通的,因为它还不存在。请参见:http://php.net/manual/en/language.types.object.php,如果值为null,则新实例将为空。
- 关于php:您约束了参数应该是什么类型(实现eatable)。您给了它一个不满足约束的值(空)。除了抛出一个异常之外,您希望它在这种情况下做什么?
- @zak我希望它的行为类似于所有其他语言,其中参数被约束到类型。例如允许您传递空值的Java。
- @安德里亚·齐里奥-这对你有什么好处?实际上,尝试调用null->eat()也会抛出一个异常,并使错误远离不正确的代码(假设对$obj->eat()的调用隐藏了几个函数调用的深度)。我在PHP上不是最新的,但是类型化参数似乎存在,以在运行时类型错误时简化调试;允许任意的空值会降低它的有效性。
- @在我看来,zak类型化参数有两个优点:通过使用它们,您可以获得一种隐式文档形式(函数的用法更为简单易懂),而且您通常必须手动进行的类型检查将成为自动的。由于在某些情况下需要将空值传递给某些参数,因此将空值与类型化参数组合在一起是不可接受的,因此将这些函数或方法排除在类型化参数通常提供的上述好处之外。仅当将null设置为默认值时才允许空值可能是一个可接受的折衷。
- @AndreaZilio,我觉得有点奇怪,在这种情况下,PHP(一种以非常开放的类型而闻名的语言)是如此严格。但是,它不是唯一一种不允许任意类型的值也为空的语言。例如,在OcAML、Haskell、F.Ay和斯卡拉中,使用一个选项或可能类型的值只能是空的,尽管它可以在后两者中通过.NET/Java互操作来偷偷进入。实际上,对于我来说,具有静态类型的语言在没有显式声明的情况下允许空值是非常奇怪的,但是我现在已经脱离了主题。
- Zak:我同意,即使在爪哇、C++或其他语言中,允许空值的显式声明也会很棒。PHP包括:
- @andera zilio在php中,我相信通过使用function foo(Eatable $obj=null)作为函数声明,可以显式地声明它接受空值。
C++中我最喜欢的一个是"抽象抽象的具体内联析构函数":
1 2 3 4 5 6 7
| class AbstractBase {
public:
virtual ~AbstractBase() = 0 {}; // PACID!
virtual void someFunc() = 0;
virtual void anotherFunc() = 0;
}; |
我在Scott Meyers的C++中偷了这个。看到一个纯虚拟(通常意味着"抽象")和内联实现的方法有点奇怪,但这是我发现的确保对象被多态破坏的最好和最简洁的方法。
- 它可能是内联实现的,但可能不会真正内联,因为它是虚拟的。
- 这是正确的——这完全是一个简洁明了的问题。
- @肖什:……除非编译器能从上下文中真正知道被破坏对象的真实类型。然而,只有海湾合作委员会才知道如何进行这种优化。
在Ruby中,0在条件表达式中的计算结果为true。
- search.cpan.org/dist/moosex-met hod-signatures/lib/moosex/met&zwnj;&8203;hod/&hellip;perl可能有点过时,但至少您可以使用一些模块附加命名/位置参数、类型检查和约束以及可选参数!
- @RJH:是的,但是添加模块来支持60年代高质量语言的核心元素似乎很愚蠢。
- @保罗:它还允许Perl做我的%args=@;或者我的($foo,$bar,@rest)=@;或者事实上,以您喜欢的任何方式处理参数。对OO来说也是一样的-大部分都是自己做的,但是非常灵活。这就是Perl。
- +我一直认为这会破坏代码的自我文档。
- @正如保罗所说,RJH是60年代的高质量语言。是的,它允许Perl做一些事情…其他语言完全不需要。;)
大约20年前,当我最后一次涉足流行性腮腺炎时,这些实现有一些奇怪的限制。当宿主流行性腮腺炎变得越来越流行时,传统上流行性腮腺炎是一种自宿主语言:计算机语言、操作系统和数据库在一个包中。
腮腺炎基本上与数据库有关。本质上,是一个巨大的多维哈希表,由一个B*树支持,这使得访问非常快速。在语言和数据库之间也没有任何障碍:如果您希望在其中存储某个内容,您只需在变量前面加上一个符号,指示它将被持久化到后备存储。
另一方面,文件系统几乎不存在,对它的支持甚至更少。唯一能做的就是将程序从一个文件加载到内存中,然后将内存中的任何内容发送回一个文件。在加载之前最好清除缓冲区,否则它会与之前存在的内容混合。
因此,考虑到它的自托管性质和极端敌对的文件系统,人们可能会想知道这些程序是如何编辑的。事实上,编辑器是用流行性腮腺炎本身编写的——那么,编辑器如何将程序存储在内存中而不重写自己呢?
好吧,技巧是能够将变量的内容作为源代码执行。然后,一个编辑器将自己加载到变量中,在变量中执行自己,清除内存,然后在内存中加载、保存和编辑文件,一直从变量执行。
此外,所有命令都可以缩短为其第一个字母(除了z命令,缩短为两个字母,主要处理文件系统),还有一个奇怪的事实,比如IF(I设置了一个变量,然后由ELSE查询(E),当然,它可以被干预I或由程序本身。再想一想,我觉得整个语言都是一个wtf。然而,它有一种奇怪的吸引力。
世界跆拳道最糟糕的就是科博改变了主意。
语法非常直接:"alter label1 to goto label2",但是调试运行时意大利面条的结果令人难以置信。
- 那太方便了
- 真是太好了!Matlab中有很多wtf。
和C型languages(包括C本身),你可以使用"云下的操作: </P >
1 2 3
| for (x = 20; x --> 0;) {
print x;
} |
这将打印数字从0 19。 </P >
- 很明显。也没有什么能阻止你用C语言写class YourBoss : Exception。
- clr(但不是c)实际上允许抛出任何对象,而不仅仅是从异常继承的对象。
- …使用catch(throwable t)还可以捕获所有可丢弃的内容,从而防止线程终止(参见threaddeath)。
- 是的,但总是从异常(甚至是RuntimeException)扩展。我没见过有人能扩展错误(除了虚拟机的人)和丢弃错误。
- 在C++中,你可以输入int。
- 我很想看看是否有人试图通过使用Sype类的抛出/捕获设施来尝试(MIS)使用SpCaseType,并在堆栈跟踪的某个地方捕获它。但我不想在现实生活中看到它。
- 在我所知的最主要的时候,如果你告诉我为什么会有例外,我会很高兴的。
- 嗯…这不是"可丢弃"的定义吗?它可以被丢弃吗?
- @大卫:不是一个普通的Dailywtf.com读者吧?:)
"piet是由david morgan mar设计的一种深奥的编程语言,其程序是看起来像抽象艺术的位图。"
打印piet的piet程序
嗯,这个也是我一直以来最喜欢的难找的虫子…将以零开头的整数视为八进制数。这导致了一个只在早上8点到10点之间显示的错误:
有一次,我帮助构建了一个自动回归测试,在晚上通过cron执行。它几乎适用于一个20人的团队中的每个人——期望开发人员偶尔抱怨一次自动测试失败,但是当手动运行时,一切都正常。即使是一次也不能手动复制。
原因是,我们根据日期命令的输出进行了一些统计计算(在bash中),但这只在早上8:00到9:59失败,因为我们将小时值读取为"08"(这是一个非法的八进制值,而"01"-"07"是有效的八进制值,从"10"开始,所有内容都将再次被视为十进制)。…
- 新的编程语言继续支持八进制数。除了Unix文件权限,谁使用它们?
- 我认为他们仍然习惯于混淆本科生的计算机科学。;)
JavaScript是一个充满跆拳道。P></
1 2 3 4 5 6 7
| var d = new Date("1/1/2001");
var wtfyear = d.getYear(); // 101 (the year - 1900)
// to get the *actual* year, use d.getFullYear()
var wtfmonth = d.getMonth(); // 0
// months are 0-based! |
- 你最初的答案并没有说明something实际得到了什么,让读者想知道这种语言特性的奇怪结果是什么。
- 执行函数后,外部变量"something"不会更改。所以"something=13;"在这个示例中不起作用。一旦JS在函数体的任何地方看到"var something",它就会认为它是一个局部(对于函数)变量。
在FoxPro中,如果我没记错的话,每个命令都可以缩写为4个字符,其他的一切都会被忽略,所以read、ready、ready都是一样的——忽略前4个字符之后的内容。向我解释过的那个人喜欢这个功能,但我觉得它很恐怖。
- 听说过JAVA的日期API吗?同样的事情。
- 必须喜欢向后兼容和2位数的年份。-)
- 据说乔达时间是炸弹人;)
- 是的,编写Java的日期和日历类的人需要被枪毙。乔达时间好多了,但仍然不太适合。在groovy中使用(timecategory)。它修复了日期类,并将很酷的内容添加到整数中。
- 新字符串[]"Jan","Feb",…}[日期.getMonth()]。可能是对这种行为的解释。但是,每周的第天是以1为基础的…我很想听听几个月的理由是0为基础,一周中的几天,1为基础。
- C的localtime和gmtime函数的工作方式相同。
作为一个脚踏实地的爱好者,当我从Smalltalk听到become时,我很激动…例如
它从字面上把A对象改为B,这使得编写懒惰的初始化代理变得很简单,因为对A的所有引用现在都将引用B。非常好!
我认为它是一种奇怪的语言特征,因为在我的知识范围内,没有其他语言具有这种能力。
- 每当有人说"没有其他语言有这种语言"时,我往往会在心里附加"…除了常见的lisp":lispworks.com/documentation/hyperspec/body/f_chg_cl.htm:-)
- 真的!作为一个C家伙,我对这样的语言特性感到困惑!想想我们用动态子类化跳过的那些环,以及什么不能模仿这种行为:)
- 您可以在Objective-C中执行此操作,请参见nsproxy(developer.apple.com/mac/library/documentation/cococa/referen ce&zwnj;&8203;ce/&hellip;)
- 用C语言就可以做到这一点,但不需要一些奇怪的代码。这种行为的实现需要数百行代码……(我的意思是,为了使它可用)。
- @穆迪:很遗憾,有人在C存在20年前没有想到这样的功能……哦等等…
- @D.肖利,没错!:)
- 用于python的become::wargle.blogspot.com/2009/07/smalltalks-been-in-python.html
- 这在"传统的"Smalltalk实现中有效,因为所有内容都是通过一个对象表间接指向的。我记得曾经有过这样的阅读:在某些ST实现上效率很低。在实践中,编写陷阱未实现的"通用"代理机制对于需要这种代理安排的持久性或其他机制更有用。
- Ruby字符串有一个方法replace可以做到这一点,但这只适用于字符串。
Java缓存整数对象实例的范围为-128到127。如果您不知道这一点,以下可能有些出乎意料。
1 2
| Integer.valueOf(127) == Integer.valueOf(127); // true, same instance
Integer.valueOf(128) == Integer.valueOf(128); // false, two different instances |
- 与stackoverflow.com/questions/1995113/strangest language featu&zwnj;&8203;re/&hellip;相同
可能已经说过了(也许这对某些人来说并不奇怪),但我觉得这很酷:
在JavaScript中,声明函数接受的参数对程序员来说只是一种方便。通过函数调用传递的所有变量都可以通过关键字"arguments"访问。因此,以下内容将提醒"世界":
1 2 3 4 5 6 7
| <script type="text/javascript">
function blah(){
alert(arguments[1]);
}
blah("hello","world"); |
注意,虽然看起来这些参数存储在一个数组中(因为您可以以与数组元素相同的方式访问对象属性),但它们不是。arguments是一个对象,而不是一个数组(因此,它们是用数字索引存储的对象属性),如以下示例所示(从crockford的补救javascript页面获取的函数类型):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| argumentsExample = function(){
console.log(typeOf(arguments));
anArray = [];
console.log(typeOf(anArray));
anObject = {};
console.log(typeOf(anObject));
}
function typeOf(value) {
var s = typeof value;
if (s === 'object') {
if (value) {
if (typeof value.length === 'number' &&
!(value.propertyIsEnumerable('length')) &&
typeof value.splice === 'function') {
s = 'array';
}
} else {
s = 'null';
}
}
return s;
}
argumentsExample("a","b"); |
- 实际上,它确实关心强制转换,并将在数组中读取:您编写的内容等价于arr[9],因为强制转换告诉编译器EDOCX1[0],并生成一个环绕。如果你刚刚写了arr[pos+10],你会得到你可能期望的范围误差。(使用D2007和$rangechecks测试。)
common lisp的format函数可以选择将数字打印为罗马数字。
在Intercal中,这是您将获得的唯一输出形式。
- 这是对cl's FORMAT的恶毒诽谤,它有两种选择:一种选择把数字打印成罗马数字:一种选择把4打印成IV;另一种选择把4打印成IIII。
- FORMAT还可以选择以英文显示数字,或者通过使用格式字符指定格式参数的循环。
- 为什么他们还要费心支持不正确的罗马数字?
- IIII不是"不正确的",它早在1390年就开始使用了,它只是不符合现代"正确的罗马数字"的观念。所以,从本质上讲,是一个变量,而不是一个错误。
在C语言中,sizeof运算符不评估其参数。这允许编写看起来错误但正确的代码。例如,给定类型T,调用malloc()的惯用方法是:
1 2 3 4
| #include <stdlib.h>
T *data = NULL;
data = malloc(sizeof *data); |
在这里,当sizeof运算符(data是NULL时,不评估*data,所以如果评估它,就会发生不好的事情!).
不管怎样,这允许我们为新来者编写令人惊讶的代码。注意,在他们的右脑中没有人会这样做:
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h>
int main()
{
int x = 1;
size_t sz = sizeof(x++);
printf("%d
", x);
return 0;
} |
这将打印1,而不是2,因为x永远不会递增。
对于与sizeof的一些真正的乐趣/困惑:
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h>
int main(void)
{
char a[] ="Hello";
size_t s1 = sizeof a;
size_t s2 = sizeof ("Hi", a);
printf("%zu %zu
", s1, s2);
return 0;
} |
(只有当对数组、指针和运算符感到困惑时,才会产生混淆。)
在我看来,在C中,能够将超出范围的整数转换为枚举是相当奇怪的。想象一下这个枚举:
1 2 3 4 5 6
| enum Colour
{
Red = 1,
Green = 2,
Blue = 3
} |
现在,如果你写:
1 2
| Colour eco;
eco = (Colour)17; |
编者认为没问题。还有运行时。
有关详细信息,请参阅此处。
- C并没有隐藏事实,枚举只是整数,或者你设置它的任何东西。int只是默认类型。如果它们要求您显式地给枚举一个底层类型,那么它看起来会不会不那么奇怪?
- @Dykam:我不认为c中的枚举只是整数;如果它们只是整数,我们将使用int32类型的变量来使用它们,而我们不是。相反,我们使用一种有目的地创建的机制,即枚举类型,它将一些类型安全性添加到命名常量的有限列表中。从语义的角度来看,枚举的有趣之处在于它们代表的是一个值域,而不是整数。
- 如果你这样看,可能会很奇怪。但如果您担心强制转换会使代码容易出错,请不要使用它们…我也不使用它们,但很高兴这种可能性被暴露出来。
- 可能是因为添加检查以确保位域枚举有效会很昂贵?
- @Dykam,@罗杰:我不同意你们两个。一段时间前,我曾建议,枚举(即命名常量的有限列表)和位字段可以通过语言中不同的语法机制实现,而不是通过同一个语法机制实现,这可能会很好。NET使用"EnUM"构造来实现枚举和位字段(可能继承C++传统),但是,从语义的角度来看,命名常量(适当枚举)和可组合的1位值在整数(位字段)中的列表是完全不同的。不同的事物需要不同的语言结构。
- 同意,他们是不同的野兽。虽然目前的方法确实大大简化了一些事情。
- @戴卡姆:同意,但对我来说还是一个WTF…
- 我会问你,为什么编译器应该关心枚举是否适合?Enums的大部分转让都具有后期约束力,因此不可能知道转让是合法的。是的,他们可以为初学者添加一个小功能。
Perl:
可以编写一个完全由标点组成的程序。
这是怎么工作的?!
- 当你走到一半时,有不止一种方法可以打破四舍五入关系(即x*5*)。python 2从零开始取整(en.wikipedia.org/wiki/rounding-rounding-half-away-u-from-zero)。python 3的一个称为银行家舍入:en.wikipedia.org/wiki/banker's_舍入。它比旧的有几个优点,在IEEE754中是默认的。
x= x+1
当我还是一个初学者的时候,这是很难理解的,现在函数式语言不使用它,这就更难了!
如果你不明白这有多奇怪:把等号当作断言的陈述,而不是你在基础代数中所做的赋值动作,那么这就相当于说"0等于1"。
- 因为我已经用Python学习了这个特性,所以在其他语言中我真的很想念它。
- 这似乎没有用,相当于把print n * n放在n = int(string, 10)之后。
- 不,不是。只有在引发异常时,才会执行else块,但不属于(在本例中)ValueError类型。
- @ChinmayKanchi:这也是错误的,否则如果没有执行,就执行块。如果else块中发生错误,则不会捕获它(与print n*n being put after n=in t(…)相反),如果except子句中引发并处理异常,则不会执行else块(与print being put after all try..except结构相反)。
- 我不认为这是一个"奇怪"的特征。它在大多数语言中都太有用了。
- 很酷。我真希望C拥有它。不会称之为奇怪的特征…
我很惊讶没有人提到在大多数类C语言中真正丑陋的switch case实现。
1 2 3 4 5 6 7
| switch (someInt) {
case 1:
case 2: System.out.println("Forgot a break, idiot!");
case 3: System.out.println("Now you're doing the wrong thing and maybe need hours to find the missing break muahahahaha");
break;
default: System.out.println("This should never happen -,-");
} |
好消息是,新的语言使其实现正确。
- 我通常用onclick事件和cursor:pointer的css样式(或类似的样式)创建普通的div/spans。
- 我只需要使用href="someIntermefulFragmentID",当我分配一个单击处理程序时,它会返回false。我经常可以在片段ID中编码一些有用的东西,我可以在单击处理程序中检索到这些东西。如果禁用了javascript,那么如果有一个具有协调ID的元素,链接仍然可以做一些有用的事情——浏览器可以滚动到它。或者,链接指向一个尽可能最好地复制javascript功能的常规页面。
- 我以为通常是这样做的:(function(){})(),括号放在不同的地方。
- @埃里克,我邀请你看一下编辑历史,看看我的答案。
- @埃里克:"有些人会把黄金paren放在函数周围,而不是整个调用周围。这对我来说没有意义,因为我们要告诉用户的是:看看整个事情。我认为,在其中一部分加上括号会适得其反。我认为整个事情需要用帕伦斯包起来。"—道格拉斯·克罗克福德。
- 同样的,你为什么需要它?
- @哈森J:在这些元素中添加tabindex=0,否则它们将无法通过键盘访问。
- @TalviWatia认为onclick处理程序不应该有任何区别。
- jquery库是这样做的:(function($, undefined){})(jQuery);。
- @亚当·拉塞克是的!不久前我发现了!奇怪的是,jslint抱怨这种模式。
- @布雷顿,克罗克福德已经非常清楚,JSlint只是他对JavaScript代码的看法。我认为如果你明白自己为什么要这样做,完全可以忽略不计。
- 为什么不使用这样的变量呢?无论变量"未定义"是什么,都会为var foo;变量分配undefined的默认值。正如前面提到的,函数参数也是如此。
- @Pauan取决于你在做什么,以及你是否需要表达。
- 是的,我最喜欢的策略是沿着(function(){var v; return v})()的路线。
ok,因为问题将处于间歇模式,我将加入"fun"
go(aka issue9)使用大写字母表示可见性:
如果你用大写字母命名,它将具有公共访问权限。
如果使用小写,它将受到包保护:
包装外可见:
在包外不可见
1 2
| func print( v ... ) {
} |
你可以在这个原始答案中找到更多。
- 这是因为sizeof不是一个函数,而是一个宏。
- 它不是宏,而是运算符。但这并不能解释这种差异。
C++模板机制是图灵完成:只要在运行时不需要输入,就可以在编译时进行任意计算。任意的或者你可以很容易地编写一个永远编译的C++程序,但是语法上是正确的。
在Perl中,您可以执行以下操作:
1 2 3 4
| my $test ="Hello World";
substr($test, 0, 5) ="Goodbye";
print $test; |
这在其他语言中是可能的吗?
- 哇,我真的很想在读了所有这些很酷的提示后现在就学习Perl。
- 我真的不确定这些是为了"小费"…
- 那么它打印了什么?我想是Goodbye World吧?
- 鲁比:埃多克斯1〔3〕。您可以在C++中自己滚动(并且可能支持支持OOP的许多其他语言)。
- 在vb6中是可能的:Mid(test, 0, 5) ="Goodbye"。
- 这被称为lvalue子语法;但是为了简单和公正,您还可以使用三参数版本substr()并消除这些相等。不过,核心库还有其他一些功能。my$foo="foo bar";my@args=(0,3);substr($foo,@args)="bar";这里$foo是什么,是同一个ass substr($foo,0,3)……享受!
- 古老的(对于普通的互联网定义而言)基本方言已经有了这种说法(而这正是vb*的由来)。
- 那很有用!
- 背后的想法是直接替换文字。可以将其视为使用退格键或删除键删除有问题的字符,然后用替换文本填充它们。
- 在C++,Irc中是可能的。
- 我喜欢把它想象成一个regexp的替代品:test =~ s/^...../Goodbye/;,我知道这个比较有点无意义,但本质上,这会产生相同的结果,尽管使用了完全不同的方法和技术。我在其他替换方法之前使用regexp。
我喜欢在C中偷偷输入八进制值:
1
| int values[8] = { 123, 154, 103, 310, 046, 806, 002, 970 }; |
- 这是stackoverflow.com/questions/1995113/StrangestLanguage Featu&zwnj;&8203;re/&hellip;的复制粘贴副本。请删除它。
在javascript中,第一次看到!!a(作为一种转换为布尔值的方法)。
- 这是我见过的最糟糕的语言设计。我的心向你和你的腮腺炎编程伙伴倾诉。
- 至少这些怪癖的刺激是适度的,因为语言的规模很小。我真正了解的是流行性腮腺炎有一个非常强大的类型抽象——高效排序的n元树——但它们不是一流的对象。没有其他聚合数据类型。该语言缺少引用或指针类型,因此无法从下到上构建树。这使得一些算法很难实现。
- 那太荒谬了!我告诉你太荒谬了!
下面是一些奇怪的C特性:http://www.steike.com/code/unused/evil-c/
这是我的最爱之一,你可以在没有主()的条件下用Java做一个打印。
这将编译并运行,并给出println,但也有一个异常(java.lang.nosuchmethoderror:main)
1 2 3 4 5
| class Test {
static {
System.out.println("I'm printing in Java without main()");
}
} |
可能已经提到过,但是--
PHP对八进制值的处理:
1 2 3 4
| $a = 07; // 7 (as it should be)
$b = 08; // 0 (would be an error in any sensible language)
$c = 018; // 1 (again, should have been an error)
$d = 0A; // error (as it should be) |
请参见:http://bugs.php.net/bug.php?ID=29676
还要注意对这个bug的评论——derick称它为一个特性(如引用"fix"所示),而不是一个bug,他声称它"在脚本中使用数字的所有情况下都会极大地降低PHP速度"——但是,为什么php会对0a产生错误呢?
我想有人可以写一整本关于PHP古怪的书…
- 我记得当我在g77的texinfo文件中的某个地方读到recursive关键字不受支持,所有的递归都可以转换成循环时,我很沮丧。这可能就是我们使用商业编译器的原因(它支持将其作为Fortran 77的扩展)。我想这与参数似乎作为对Fortran中函数的引用传递的事实有关。
- Fortran几十年来不支持递归子例程。它与传递引用无关,但通过静态分配调用堆栈的方式。
- VsFortran是/曾经是IBM在VM和MVS上的"旗舰"Fortran。我怀疑他们不支持递归,因为他们的策略是旧代码在最新的机器上仍然是可链接和失控的,此时他们仍然支持fortran-h并允许两者链接。我也怀疑这不再是真的(自从我和大蓝一起工作以来已经10多年了)
在爪哇,你可以期待
等于
但事实并非如此。实际上,您会得到一个编译器错误,因为加法的结果是int类型的,因此不能分配给字节变量b。当使用复合运算符++时,编译器会自动在此处插入一个转换。所以
变成
declarations和JavaScript变量/函数: </P >
1 2 3 4 5
| var x = 1;
function weird(){
return x;
var x = 2;
} |
奇怪的()returns undefined…词对"X",即使在没有happened指派。 </P >
similarly,但不是unexpectedly </P >
1 2 3 4 5
| function weird2(){
var x;
return x();
function x(){ return 2 };
} |
returns 2。 </P >
- 直到Fortran 77中的一些编译器出来,他们才解决这个问题。并非所有Fortran 77的实现都正确。
在C中,这至少会生成一个编译器警告,但不会:
1 2 3 4 5
| public int Something
{
get { return Something; }
set { Something = value; }
} |
当被调用时,它会导致应用程序崩溃,并且不会得到一个好的堆栈跟踪,因为它是一个StackOverflowException。
- 惠普曾经做过一个没有启动按钮的微波炉。要在半功率下重新加热通心粉3分钟,请按3[输入]。5[y^x]
- RPN是一个什么样的WTF?
- @大卫,这是不寻常的,完全不同于标准惯例。
- @丹尼尔:在使用它的地方并不少见,而且计算机语言中的很多东西都不同于标准的非计算机约定。RPN已经在一些非常流行的计算器中使用,所以许多人对它有一些熟悉。Fourth并不是一种主流语言,但我不认为RPN是一种WTF。
- @大卫"它的用途"有点击败了整个不寻常的点。在使用它的地方没有什么不寻常的。现在,假设你去了离你最近的一所大学,询问毕业的CS学生。你希望他们中有多少人以前见过,更不用说用过了?
- @丹尼尔:不到十年前,当时很多工程师都用RPN计算器。从那时起,惠普就不再由工程师管理了。不过,早期的一款iPhone计算器应用程序使用了反向波兰语(我买了它,因为我不喜欢用中缀计算器做复杂的事情)。而且,任何上过编译器课程的人都会熟悉它。我觉得这比你想象的要普遍。
- @大卫和每一个工程师可能都认为"wtf?"当他们第一次看到它的时候。
- RPN与我们习惯的不同,但它确实很容易实现。
- 它不是一个世贸,它是一个自由贸易区(双恩德雷德)。
vbscript的日期/时间文本(为什么仍然如此罕见?):
1 2 3
| mydate = #1/2/2010 5:23 PM#
If mydate > #1/1/2010 17:00# Then ' ... |
编辑:日期文本是相对的(那么它们在技术上是文本吗?):
1
| mydate = #Jan 3# ' Jan 3 of the current year |
因为它是编译的,所以不支持相对日期文本。只支持日期或时间文本,但缺少的时间或日期假定为零。
编辑【2】:当然,有一些奇怪的角落案例提出了相关的日期……
1
| mydate = #Feb 29# ' executed on 2010-01-05, yields 2/1/2029 |
- 你要的是同一件物品的7倍,而不是副本的7倍。我认为这是正常的,不是WTF
- 正常,是的,但我知道我被这个咬过几次
- 不是来自Python的背景,这真的让我很失望。+ 1
- 你可以在Ruby中使用这段代码,它也做同样的事情。
- 尝试def x(y,z=[]):z.append(y);打印z
- 不,相信我,作为一个一直使用python的人,这绝对是一个wtf,并且在过去不止一次把我甩了。顺便说一下,如果你想要一份有7份a的清单,你可以做[a for i in range(7)]。
- 不,相信我,作为一个一直使用Python的人,这是意料之中的。顺便说一下,您的示例不起作用。尝试[List()在范围(7)中查找i。
为什么c的list.addrange()不让我添加t子类型的元素?list.add()可以!微软需要的只是一行额外的代码:
1 2 3
| public void AddRange<S>(
IEnumerable<S> collection
) where S : T |
- 如果是全球性的,那么define("TRUE",false,false);define("true",true,false);就是echo(TRUE==false);//echos true和echo(true==false);//echos false…那么,TRUE的意思就不是真的,除非是小写的。
当我上大学的时候,我用一种叫做snobol的语言做了一点工作。整个语言虽然很酷,但却是一个很大的wtf。
它有我见过的最奇怪的语法。你用:(标签)代替goto。当您有:s(label)(goto label on success/true)和:f(label)(goto label on failure/false)并且您在检查某些条件或读取文件的行上使用这些函数时,谁需要if's。所以声明:
将从文件或控制台读取下一行,如果读取失败(因为达到EOF或任何其他原因),将转到标签"END"。
然后是$sign运算符。它将使用变量中的值作为变量名。所以:
1 2 3
| ANIMAL = 'DOG'
DOG = 'BARK'
output = $ANIMAL |
将在控制台上显示值"bark"。因为这还不够奇怪:
将创建名为bark的变量(请参见上面指定给dog的值)并为其提供"sound"值。
你看得越多,情况就越糟。关于snobol(来自链接文本),我发现的最好的说法是"语言的力量及其相当惯用的控制流特性使得snobol4代码在编写之后几乎不可能被阅读和理解。"
我为一个客户机编写了一种编程语言(用于实验驱动自定义硬件),其中有一些自定义类型(curl、circuit,…),每个类型只有2个值。它们可以隐式转换为布尔值,但是(在客户机的请求下)可以在运行时更改此类类型常量的确切布尔值。
例如。:curl类型有两个可能的值:cw和ccw(顺时针和逆时针)。在运行时,可以通过简单的赋值语句更改布尔值:
因此,您可以更改这些类型的所有值的布尔值含义。
- 这对我来说似乎是个好主意(它允许像ccw这样的东西根据实际数据中的内容进行定义),但前提是所有这些分配都是相同的。差异应该标记为冲突,除非编译器有一些很棒的方法来在模块之间转换。我同意,乍一看,它确实很不错,但如果您处理的是输入数据,而输入数据的感觉您无法控制,这是一个很好的主意。
Perl有许多奇怪但整洁的特性。
if可在如下声明之前或之后使用:
1 2
| print"Hello World" if $a > 1;
if ($a > 1) { print"Hello World"; } |
对于foreach也是如此:
1 2
| print"Hello $_!
" foreach qw(world Dolly nurse); |
- Ruby允许相同的if结构。这是我最喜欢的语言之一。
- Ruby允许这样做,但我个人认为,始终将"if"放在第一位会使代码更容易阅读。不管怎样,它在语法上同样令人愉快,如果你需要添加其他的,你不需要重新排序。
- 实际上,我喜欢if修改器,因为它使程序更具表现力和可读性。它允许您将语句中更重要的部分(条件或操作)放在另一部分之前,因此它是突出的。与任何功能一样,如果使用得当且不被滥用,它是有用的。
- 仅供参考,这被称为mutator语法,在语法上非常棒:last unless defined $row。
- 幸好我可以控制自己,否则我会开始对Perl大喊大叫…奇怪,当然。整洁?不是…好吧,我闭嘴。
- 我很怀念其他语言(C/C++)中的"反转IF"语法。
- 此语法取自函数式编程。Perl尝试尽可能多的范例,这样就允许使用许多函数式编程位。这是其中之一。我在函数式编程方面有丰富的经验,我并不认为它是一个奇怪的特性,但它是来自不同范例部分的一个很好的补充。
- 如果您知道这是什么,Perl会从basic-plus获取其postfix语句,除非您在键入时需要多个语句。
PHP中的"真"、"假"和"零"normally cannot be overridden which是常数。不管一个人多介绍,with the of命名空间在PHP 5.3 =一>,现在可以在任何这些常数的名称,但全球命名空间的命名空间。which can to the following行为:铅P></
1 2 3 4 5 6 7 8 9 10
| namespace {
define('test\true', 42);
define('test\false', 42);
define('test
ull', 42);
}
namespace test {
var_dump(true === false && false === null); // is (bool) true
} |
当然如果你想你真的真的好,你可以总是true from the全局命名空间导入P></
1 2 3
| namespace test {
var_dump(\true === \false); // is (bool) false
} |
- 在IBM上尤其如此,其中第72到80列对编辑器很重要。
- 对于Fortran,不应该使用编辑器。您应该将程序写在用颜色标记列利用率的表单上。然后让数据输入部门的恐吓妇女用钥匙在卡片上打孔。
- 也有隐式类型。名称从I到O的变量是隐式整数。(你可以直截了当地说。从来没有人。)
- 我相信高列通常用于序列号,这样,如果程序被洗牌,你就可以把它重新排序,也就是说,把牌叠掉。
在Haskell:
收益率为5。
ActionScript 3:
当一个对象被它的接口使用时,编译器不识别从Object继承的方法,因此:
1 2
| IInterface interface = getInterface();
interface.toString(); |
给出编译错误。解决方法是投射到对象
1
| Object(interface).toString(); |
PHP:
.和+运算符。它有其合理的解释,但仍然显得很尴尬。
Java(以及IEEE74的任何实现):
1
| System.out.println(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1); |
输出0.9999999999999999。
- 这也意味着PHP必须使用->来限定对象,而不是使用更漂亮的.。
- 很好,PHP没有像JavaScript那样为字符串串联和加法重载+运算符。在PHP中,如果你看到+,你就知道你在谈论增加数字。…(除非你有数组…)
- 第一个不是WTF——它是一个gotcha,迟早会抓住大多数人关于计算机上的有限精度浮点表示。
- 好吧,你第一次看到它,它肯定是一个wtf:)
- 它不是Java WTF,它是任何正确的WTF(!)实施IEEE754。
- @尼克:你知道你是在说增加数字,即使你实际上是在增加字符串。
- 但1等于0.999….参见en.wikipedia.org/wiki/0.999…
- @阿甘博:当然,但是0.99999999999不等于0.999…也不1。IEEE754值没有无限精度
- C给我一个1:)
- 这是因为在c中,带浮点的数字的默认类型是double。用0.1f代替0.1会得到相同的结果。
- @尼克:不,超载很好。允许操作数是字符串的"加法",这只是100%的错误。如果将"a"转换为int,则应该得到一个异常。而不是沉默的0。
- 更正我以前的注释:执行debug.writeline(0.1f+0.1f+0.1f…)将打印1.0,因为编译器将该表达式转换为常量(计算时,必须使用double)。但如果你用一个循环加0.1f十次,你会得到0.999999…
- @因为标记颜色,cdmckay实际上在我的编辑器中看起来很漂亮。->非常恼人,因为它看起来像HTML标记。这就是为什么::似乎能更好地发挥作用。
在PHP中:
1 2 3 4 5
| echo 'foo' == 0; // echos '1'
echo 'foo' == true; // echos '1'
echo 0 == true; // echos '0'
$foo = 'foo';
echo $foo['bar'] // echos 'f' |
PHP有一些最烦人的类型强制…
洛洛克!
整个语言本身。虽然不完全是一个世界跆拳道的事情,但我从来没有遇到过一种语言,它在我的脑海中以卡通片般尖叫的声音播放。我以前也没有看过代码,想叫"aaawww cuuute!"
此程序显示数字1–10并终止
1 2 3 4 5 6
| HAI
CAN HAS STDIO?
IM IN YR LOOP UPPIN YR VAR TIL BOTHSAEM VAR AN 10
VISIBLE SUM OF VAR AN 1
IM OUTTA YR LOOP
KTHXBYE |
- 用TINYINT(1)、BIT或(最好是)BOOLEAN而不是ENUM('0','1')怎么样?
- 实际上,我使用了tinyint(1)——MySQL还没有布尔类型。
- 它有一个bool类型,它是tinyint(1)的别名。
- 您甚至不需要在可能值列表中声明空字符串。从文档"如果向枚举中插入无效值(即不在允许值列表中的字符串),则将以特殊错误值的形式插入空字符串。"我的意思是wtf,您显式列出了一组可能的值,特别是因为您希望任何其他值为错误。
- 是的,但至关重要的是,"错误"空字符串与枚举中的空字符串不同-它们的数字表示形式不同。
在C或C++中,你可以用宏来获得很多乐趣。如
1
| #define FOO(a,b) (a+b)/(1-a) |
如果传入foo(bar++,4),它将递增两次。
- 或#define false true。
- #define while if(谁需要循环?)#define void int("为什么编译器抱怨我的void函数没有显式返回?")#define main(argv, argc) (main)(argc, argv)(无明显原因切换argv和argc)
- 虽然你可以用定义来做一些愚蠢的事情,但是有充分的理由按照定义的方式来定义它。与这里的其他条目不同…
- 我同意布赖恩的观点,但是如果你警告你重新定义关键词不会伤害任何人…
- 我在StackOverflow上看到有人提到了#define private public。
- @布莱恩,是的,你可以用define做一些非常聪明的事情,但是他们要求做一些奇怪的事情。能做到这样是很奇怪的。
- @惠蒂斯:很久以前,在遥远的一个计算机实验室里,一些人发明了C语言。而C一开始没有void;void只在标准C中出现。这意味着有很多老编译器的人想要运行现代C代码,而#define void int运行得很好,可以在k&r编译器中运行一些c90代码。
- 这在Unix Haters手册中。
- 定义空42
- #定义interlockedincrement(x)(x)++stackoverflow.com/questions/652788/&hellip;
- 我听说这实际上是未定义的,因为语句中多次出现减量/增量运算符显然没有定义。未经证实的
- @你说得对。
PerlFileHandle类型的运算符调用。
一开始,有
1 2
| print"foo","bar","baz"; # to stdout
print STDERR"foo","bar","baz"; |
请注意,由于缺少逗号,所以您知道这是要打印的文件句柄,而不是要以字符串方式打印的文件句柄。这是一个肮脏的黑客。
语言升级开始了,它们生成适当的OO文件句柄,并将x FOO y, z, abc转换为FOO->x(y, z, abc)。有点可爱。同样的print语句有效运行
1
| STDERR->print("foo","bar","baz"); |
大多数情况下,当您错过逗号或尝试运行类似于hashof $a, $b, $c的子例程调用(不带括号),并忘记从其实用程序包将hashof函数导入命名空间时,您会注意到这一点,并收到一条关于"can't call method‘hashof’via package’contents of string $a的奇怪错误消息"。
- 指针是世界上最自然的东西:p
- 有时我会觉得很失落,我从来没有"啊哈!"有指针的时刻。不知怎么的,我觉得指点总是很自然的。递归也是如此。
identifiers VBScript和支架
VBScript是有所谓identifiers支架,这是identifiers定义式和backets广场,像这样: </P >
他们真的是相当的方便,actually,他们allow你我和routines保留字变量后,调用方法的对象的名称,是第三方的保留字也使用几乎任何Unicode和字符(包括空格和特殊字符和identifiers)。但这也意味着,你可以与他们有一些有趣的: </P >
1 2 3 4 5 6 7 8 9
| [2*2] = 5
[Здравствуй, мир!] = [Hello, world!]
[] ="Looks like my name is an empty string, isn't that cool?"
For[For[i=0]=[0]To[To[To[0]
[Next[To]([For[i=0])=[For[i=0]
Next |
在其他的手,identifiers支架可以忘记你,但gotcha案例的quotes,但像这样的声明: </P >
1
| If MyString ="[Something]" Then |
因为法律是一If MyString = [Something] Thenperfectly语法。(这就是为什么和一个语法highlighting IDE是一个必须的!) </P >
><br / 他identifiers支架能信息和埃里克lippert的博客: </P >
- 花絮:支架identifiers VBScript和保留字incompatibilities
- quiz VBScript的答案,第六
- 类也不区分大小写。
- 他们应该在php.ini中添加一个编译器选项来分析区分大小写!
- @不应该有罗伯特皮特。为Drupal、Wordpress等安装任何写得不好的插件,你就完蛋了。
- 但是,如果应用程序是家庭自制的,比如Facebook,你可以根据自己的标准创建自己的代码,这就是为什么我说Option。
- 罗伯特皮特:我唯一的安慰就是知道你一定要活在你自己创造的地狱里。如果必须添加一个选项,请将其设置为上述错误是致命错误。
- PHP中有没有什么东西不会导致"wtf"?
在Python中:
1 2 3 4 5 6 7 8 9 10
| >>> a[0] ="hello"
NameError: name 'a' is not defined
>>> a[0:] ="hello"
NameError: name 'a' is not defined
>>> a = []
>>> a[0] ="hello"
IndexError: list assignment index out of range
>>> a[0:] ="hello"
>>> a
['h', 'e', 'l', 'l', 'o'] |
这些切片分配也会产生相同的结果:
1 2 3
| a[:] ="hello"
a[42:] ="hello"
a[:33] ="hello" |
在JavaScript(和Java中,我想)你可以逃脱这样有趣的字符:
1
| var mystring ="hello "world""; |
如果你想把回车放到一个字符串中,那是不可能的。您必须这样使用:
1 2
| var mystring ="hello,
world"; |
对于编程语言来说,这都是正常的,也是意料之中的。奇怪的是,你也可以像这样逃离实际的回车:
1 2
| var mystring ="hello, \
world"; |
- 这只是逗号运算符比算术运算符绑定得更紧密。例如,$b = 1, 2+3与$b = (1, 2)+3相同。你可能在期待:$b = 1, (2+3)。
- 我明白为什么会这样。但不明白为什么要这样设计。
- 哇,真是难以置信!就像他们试图重新定义直觉的反面。他们也做到了!
C/C++:
快速平方反比算法利用了IEEE浮点表示法(从维基百科复制的代码):
1 2 3 4 5 6 7 8 9 10 11
| float InvSqrt(float x)
{
union {
float f;
int i;
} tmp;
tmp.f = x;
tmp.i = 0x5f3759df - (tmp.i >> 1);
float y = tmp.f;
return y * (1.5f - 0.5f * x * y * y);
} |
- 考虑到$A[测试]和"$A[测试]"也是等价的,这是有意义的。但有人想知道为什么PHP有如此多的"特性",这些特性并没有增加任何真正的好处,只会导致意外或不可预测的行为…
- 是吗?不,它不是。分配律在逻辑上不适用于引号,不管您的示例在PHP中有效。我同意,它也充满了无用的垃圾。(在5.x中,他们实际上添加了"goto"!什么,语言在那之前不起作用?你看过新的Kewl Nowdoc字符串吗?太浪费时间了。)
- define不是php中的关键字,它是一个函数。当然,它也是一个不可分解的原语,但它仍然是一个函数。
- 我平时很小心。我发誓我在写论文的时候看到了这个页面php.net/manual/en/reserved.keywords.php,"define"在列表中。也许我在吸毒,因为现在不在那里。但是,如果您将我的示例中的"define"替换为所列的任何官方关键字,则会遇到相同的问题。
- 我更喜欢没有define的PHP。我只是保存了一个globals.php文件。把它保存起来!
- 我写日历的时候就开始不喜欢PHP了。我在isLeapYear()函数中去掉了变量$off。它使函数始终返回true,而不是错误。
容易挑剔的人,二郎到处都是。例如,3种形式的标点符号,
1 2 3 4 5 6 7 8
| a_function(SomeVariable) ->
statements_end_with_commas(),
case PatternMatching of
0 -> now_we_end_with_semicolon;
true -> except_the_last_one
end.
%% Function definitions end with periods! |
在C或C + +,parentheses are optional for the argument sizeofto…提供T型:不是the argumentP></
1 2 3 4 5 6 7 8 9 10 11 12 13
| void foo() {
int int_inst;
// usual style - brackets ...
size_t a = sizeof(int);
size_t b = sizeof(int_inst);
size_t c = sizeof(99);
// but ...
size_t d = sizeof int_inst; // this is ok
// size_t e = sizeof int; // this is NOT ok
size_t f = sizeof 99; // this is also ok
} |
为什么我从来没有understood this is!P></
更多的是平台功能而不是语言功能:在iPhone上,创建一个包含少量计算的无限循环并运行程序。你的手机会发热,当外面很冷的时候,你可以把它当作暖手器。
在PowerShell中,可以重命名变量:
1 2 3 4 5 6
| > $a ="some value"
> $b ="a"
> $c ="d"
> Rename-Item variable:$b $c
> $d
some value |
间接间接间接!拿这个,PHP!
文字也可以工作:
1 2 3
| > Rename-Item variable:d e
> $e
some value |
- 是的,PowerShell让我很生气。我曾经给他们写过一封关于语法的信。他们的回答有些含蓄:blogs.msdn.com/b/powershell/archive/2006/07/23/&hellip;
- 更糟糕的是,尽管有wtfs,与其他shell(sh、bash、csh、tcsh、comd.exe等)和perl相比,PowerShell看起来还是很干净的。有没有试过理解巴什的$(())、$()、[])等?
- @马库斯:是的,请看我这里和这里的答案。
(P)In earlier version of visual basic,functions without a"return"statement just"return none",without any kind of compiler warning(or mistake).(p)(P)This lead to the most crazy debugging sessions back when I had to deal with this language on a daily basis.(p)
- 哦,伙计,这太糟了。我很高兴他们在以后的vb.net版本中实现了这一点。他们真的应该刚刚创建了vb.sharp并将兼容性参数留在表中。
- 我想说让您返回值的RETURN语句是我最喜欢的vb.net相对于vb6的改进之一。(我最喜欢的是例外和出错时转到。)
- 这也是Python的特性之一。在强类型语言中,它不会那么糟糕,实际上可以说它是好的,因为它使事情更加统一(所有函数都有返回值),但是在动态类型中,它总是让我头疼。
- python是强类型和动态类型。只是说…
字符串的数学和Perl是非常奇怪的。 </P >
1 2 3 4 5 6 7 8 9 10 11
| $ perl -E '$string ="a"; $string++; say $string'
b
$ perl -E '$string ="abc"; $string++; say $string'
abd
$ perl -E '$string ="money"; $string++; say $string'
monez
$ perl -E '$string ="money"; $string--; say $string'
-1 |
- + 1。出于某种原因,我觉得这很好笑,忍不住咯咯笑了起来。
- 谢天谢地,C不允许这种疯狂…Control cannot leave the body of a finally clause
- 这是假的,是吗?它可能看起来像一个WTF(也可能是一个),但我按照规则生活:最终总是赢,除非你之前撞坏了机器。
- @Richard E-即使抛出未经检查的异常?
- @迈克尔:是的,它的确是假的。当我第一次见到这个时,我很沮丧。在这里,我想,一旦你把一堆东西"丢弃"了。但你是对的,最终总会赢。我想知道您是否可以在这里插入一些巧妙的技巧,比如愚弄编译器,同时执行其他代码。
- 公平地说,我认为TDWTF的解释很好,因为我记得,除非你拔掉电源线,否则最终总会赢:dailywtf.com/articles/my-tales.aspx
- +10我盯着它看,目瞪口呆,头脑发热,如果我在代码中使用了最后的返回。顺便说一句,我把IDE的"返回到finally block"警告立即改为一个错误。
- @kGregory-是的,即使当抛出异常作为finally的目的是为了清理内存和其他资源(即调用dispose、解锁事物或执行必须始终执行的操作,不管如何,可能设置一个静态变量),然后由于抛出了异常,也不需要将任何值作为callst中前面的函数返回。ACK将无法获得结果(异常将被捕获,或者由于异常该函数也将退出)
- 我不确定能不能接你,格兰特。您是说finally子句中的返回将在将返回值放入堆栈的意义上执行,但是当堆栈退出finally块后继续释放时,该返回值将被丢弃吗?
- 在这种情况下,我不确定代码应该返回什么。但我敢肯定,你不能把return放在finally条款中。
- javac会将这段代码去掉。
- @J.F.塞巴斯蒂安:我完全同意。我想不出一个单一的有效的return在finally中的使用。好吧,我要断言的是,这取决于语言告诉你,当你使用return或throw或任何其他东西时会发生什么。
- 隐马尔可夫模型。。。在想了一会儿之后,我真的明白了。当RETURN语句完成时,该函数不再处于活动状态。由于finally子句必须运行,因此当遇到return false时,return true语句没有执行。函数在该点返回。编译器可能会注意到return语句不能引发异常,因此可以安全地重写它,将其放在finally子句之后。
- @令牌:前几天我发现了一个用途。C不让我做的时候我很难过,但现在我想我明白为什么了。实际上,这并不是一个很好的用途…我把回程表放在街区下面:
- 即使你不能返回一个finally,下面的代码会做什么:bool x = true; try { return x; } finally { x = false; }
- @Chris刚刚在LinqPad(C)中测试了这个,它返回了真值。另一方面,如果将代码更改为TestClass x = new TestClass(); x.Value = true; try { return x; } finally { x.Value = false; },其中testclass是引用类,则在控件返回调用方法之前,value属性将设置为false。因此,当返回被命中时,值似乎被复制到堆栈中,但最后一个块仍然被调用(如您所期望的那样)。
- @马丁-在Python中,同样的情况也会发生。一个小的实现细节会影响try / finally块的工作结果,这看起来很奇怪。
- 记住,finally完全按照它所说的做。
- 如果halt;不停止疯狂,也许exit;会……:)
- 仅供参考,这是C中的编译时错误。控件不能离开finally子句的主体
- 这太棒了。简单而精彩
- 控制不能离开C中finally子句的主体,这是不正确的。请参见第8.10节:"如果在finally块的执行过程中引发了异常,并且未在同一finally块中捕获,则该异常将传播到下一个封闭的try语句。如果在传播过程中出现另一个异常,则该异常将丢失。"(检查)静态返回是一个特殊情况。Java、公共LISP、Python、ET.AL。所有人都要这样做。
- 这不是世贸组织。这是合乎逻辑的,因为最后,总是执行它的代码,所以它覆盖了所有的东西,这是它的方式。
- 刚刚在Delphi中尝试了等价的方法,但它无法编译-与c([错误]Unit1.pas(26):无法中断、继续或退出finally子句相同)
- C++通过使用RAII而不是最后避免了这个问题。
- 这里的直观行为是fork(),控件将分支到两个并行时间线。
- @ Joseph Garvin -"C++通过使用RAII而不是最后来避免这个问题。"并不是真的——正如Dan Weinreb指出的,异常可以留下最后一个块,不幸的是,它们也可以在C++中留下析构函数。如果这种情况发生在前一个异常导致的堆栈展开过程中,那么程序只会终止。因此,在C++中,专家建议是采取每一个步骤,以确保异常不会留下析构函数。
在PHP中,字符串字母不能像在C中那样使用,您需要使用ord()和chr()以便从数字转换为char,反之亦然:"a" != 97,但ord("a") == 97。
不过,有一个例外:
1 2 3
| for ($i = 'a'; $i < 'z'; $i++) {
print"$i";
} |
将打印字母A到Y。就像您所期望的那样,它是C样式的数据类型。
但是,如果测试条件更改为<=,它将不会像您想象的那样打印a到z,而是打印a到yz!(共打印676项)
另外,如果您将676项列表中"z"之后的"z"更改为"a a",并再次将测试条件更改为<,则只会看到"a"被打印出来!不是你所期望的从A到Z。
如果您将递增器更改为$i+=2,它将再次只打印"A"!唯一的方法是按顺序使用$i++,$i++,现在它像预期的那样工作。
然而,在PHP中,这是一种很好的输出字母a-z组合的方法,尽管实际上很难使用它。
- 我喜欢德尔福对案件陈述的处理。一行自动换行,一个开始将启动一个文本块,该文本块在结束后自动换行。
- +1哦,天哪,是的-他们什么时候才能学会,最好是把共同的案例设为默认(没有双关语)?在不破坏任何优化的情况下,让中断变得更有意义,对于我们希望实际继续进行下一个案例的罕见情况,有一个"continue"关键字。
- 哦,我真的很讨厌新的语言改变了行为。现在,当我混合循环并切换到循环中,并将break放在那里时,出于习惯,我得到了一个我在查看代码时找不到的bug。
- @blueraja:continue在switch中有有用的行为(break也是如此),因此,在我看来,将这些词中的任何一个重载为"通过"或"离开switch是一个坏主意。
- 事实上,我认为坏的是新的C语言(C语言和Java语言)做得不对。他们保留了相同的坏C风格的switch语句,只做了一些改进(不允许这样做),但仍然使用了这种可怕的语法。与C相比,我更喜欢vb.net的一点是它的优势Select Case语句,其中每个case块都是真正的代码块,而不仅仅是标签和break语句之间的行跨度。
- @克里斯:是的,我知道,他们可以用他们想要的任何关键字。重点是,应该有一些关键字需要进行fallthrough,而不是转义。由于fallthrough在爪哇/ C中不允许使用,所以我不明白为什么他们不让"中断"语句可选(他们不能因为向后兼容性而拒绝它)。
- 在Java中实际上允许使用FLAIN。
- 我讨厌C开关语法。德尔菲说得对。
- 我一直担心,江户十一〔3〕永远不够,需要江户十一〔2〕。
- 达夫的设备规则。
- 完全不同意。新的语言有错误。这是对的,在早期的形式中,一点也不难看。
我知道的最伟大的编程语言集(今天是1313),您可以在这里找到:http://99-bothes-of-beer.net网站/准备好去看真正奇怪的东西;-)每个人都应该做出自己的选择
- esolangs.org/wiki/main_页面
早期的Fortran,那里的空白不明显。(反Python!)
意思:从这里到第20行的循环,从1到10改变i。
含义:将1.10赋给名为do20i的变量。
有传言说这个窃听器撞坏了一个太空探测器。
红宝石
Time.parse经常假装解析没有失败,而是返回now。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| require 'time'
Time.parse '2000-01-01 12:00:00'
# -> 2000-01-01 12:00:00 +0100
Time.parse '2000-99-01 00:00:00'
# -> ArgumentError: argument out of range ...
Time.parse 'now'
# -> 2010-08-13 21:26:13 +0200
Time.parse 'yesterday'
# -> 2010-08-13 21:26:18 +0200
Time.parse 'billion years ago'
# -> 2010-08-13 21:26:37 +0200 |
- 好吧,语言就像是一个笑话,就像是国际语。我看不出这里面有这么伟大的"怪异特征"…
- 我相信WTF是lolcode中保留的关键字…
Java的访问修饰符是我最近的一个WTF(因为我必须学习一点)。
显然,包比类层次结构更紧密。我无法定义对子类可见但对包中的其他类不可见的方法和属性。我为什么要和其他班级分享一个班级的内部信息呢?
但我可以定义对包内的每个类都可见的属性和方法,但不能定义包外的子类。
不管我怎么想,我还是看不出逻辑。切换访问修饰符,并进行保护行为,就像它在C++中工作,并保持包私有修饰符,它是有意义的。现在没有了。
- 逻辑对我来说很明显:不是类,而是包是一个维护单元。从子类中隐藏成员有效地保留了维护人员在不破坏子类中代码的情况下删除或重命名成员的权利,如果这些子类位于不同的包中,并且可能是由完全不同的人在完全不同的时间和地点编写的,这非常有用。包维护人员甚至可能根本不知道子类的存在。
- 所以只有一个人可以更新包?考虑到一些Java基础包是多么大,这是一个很高的顺序。
- @Makis:"Maintainer"是负责包的组(可能它应该是"Maintainers")。在这个组之外编写子类的程序员不必担心包的内部。
- 嗯,我还是不明白为什么会更好。除非我们将包保持在很小的范围内,否则问题与任何应用程序开发中的问题都是相同的:您希望将OO用于的正是这种情况所能解决的问题。
- 我也一直认为这很奇怪。我能想到的唯一原因是修饰符的严格顺序:public>protected>package>private
- @joppux:protected不严格大于package。包允许从受保护的地方访问不允许,反之亦然。
在javascript中:
1 2 3 4 5 6 7 8 9 10 11 12 13
| var something = 12;
function nicelyCraftedFunction()
{
something = 13;
// ... some other code
// ... and in Galaxy far, far away this:
if( false ) // so the block never executes:
{
var something;
}
}
nicelyCraftedFunction(); // call of the function |
通常,您希望something变量的值为13。但在javascript中没有-变量有函数作用域,所以稍后的声明会影响上游的所有内容。
在使用C/C++/Java符号(如JS)的语言中,你会期望变量具有块范围,而不是像这样…
因此,编译器甚至可以从最终生成的字节码中删除的死代码块在其余正常执行的代码中仍然有副作用。
因此,something仍然是12—在调用函数后不会改变。
- 因为你应该写"control.begininvoke(dosomething);"
- 不,"control.begininvoke(dosomething);"也不起作用,除非dosomething是任何委托类型的变量。
- 我将把它转换成动作类型。"代表"一词似乎根本不是一门课。
- 我经常希望编译器能自动完成new Action(delegate { })的工作。
从Java中的文本文件中读取一行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| BufferedReader in = null;
try {
in = new BufferedReader(new FileReader("filename"));
String str;
str = in.readLine();
if (str != null) {
...
}
} catch (IOException e) {
...
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {}
} |
呃。虽然我承认这并不奇怪…只是邪恶。-)
较短、更惯用的版本:
1 2 3 4 5 6 7 8 9 10 11 12 13
| try {
BufferedReader in = new BufferedReader(new FileReader("filename"));
try {
String str = in.readLine();
while (str != null) {
str = in.readLine();
}
} finally {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
} |
- 有了Perl,谁还需要Brainf*ck!
- infoozapps.files.wordpress.com/2011/09/zz186191f0.jpg<---也适用于Lua,即使不完全是标点符号。
PHP作为一种完整的语言,主要是WTF。
langauge的定义(参见www.php.org)不是由语法或标准定义的,而是由一组"你可以写这个例子"部分(当然,你能写任何其他东西吗,只是猜测一下概括),诚实的用户贡献说"但是它做了这个古怪的事…"。
我定期会遇到我们构建的PHP解析器的问题。以下是最新消息:
现在,php是Perl的一个(非常糟糕的)副本,因此它允许使用隐式变量子状态构造字符串。字符串中的$X表示"将$X的值插入字符串",相当于"abc"。X元。"def"where"."是PHP的字符串连接运算符。
字符串中的$A[7]表示"将数组$A的第七个槽的值插入字符串",相当于"abc"。7美元。DEF"。
现在,语言(网站)明确地说"define"是一个关键字,你不能在任何你能找到表达方式的地方使用它。所以上面包含"define"的gem是什么?是否引发语法错误?不,那是有道理的。
不,它实际上是指:
1
| "abc" . $A["define"] ."def" |
只有当你写了一个看起来像标识符的东西(关键字或不是!)在一个简单的数组中访问一个字符串。在语言中没有其他地方会发生这种行为。什么,写"abc$a["define"]def"是不合理的,所以PHP的发明家不得不把它写进去?让我休息一下。(为了复合重罪,有"字符串中的复杂数组访问",当然它的工作方式不同。查看"abc$a[define]def";根据PHP网站,这是非法的。
(原来PHP数组是关联哈希,所以按名称查找数组(好吧,哈希表)成员不是一个糟糕的主意)。
这种语言充满了这样的gotchas。如果你喜欢"哎呀,看看我今天在我的子程序下发现了什么蠕动的东西",你应该切换到PHP。
- 对于期望参数类型为Foo的函数,在静态类型语言中,拒绝参数类型为Bar的函数是完全有意义的。Just是a -> Maybe a的函数,Nothing是Maybe a的函数,fromJust是Maybe a -> a的函数。希望这有帮助。
- 这是有道理的,但在理论上是很难解释的。如果它被称为"不只是"和"不只是"的话,我想它会更容易理解。
- 唯一的世界跆拳道就是你完全错过了这一点。我不知道你的背景,但是在Java中使用字符串。它实际上是一个"可能"字符串,因为它可以是字符串或空值。不幸的是,编译器不会阻止您将其用作字符串,这会导致可怕的空指针异常。好吧,haskell没有空值。如果您执行的操作可能返回结果,也可能不返回结果,例如获取字符串中字符的索引,那么您可能返回整数。接收代码使用模式匹配来区分整型和非整型。
(P)In my opinion this should not be allowed in C++:(p)字母名称(P)This may seem right,but this means that you cannot override a method without allowing users of the subclass to call the original method instead of the new one.(p)(P)Just think about a subclass of a collection where you want to increament the number of elements when adding an element to the collection itself.(p)(P)a logical solution would be to override the add(……)method to increase the counter before adding the element,but a user of the new collection could add an element to it using the old method so bypsing your increament and resulting in your elements-counter disagree with the actual number of elements of the collection.(p)(P)这是不可能在爪哇。(p)
- 在这里,您可以看到实际的代码:codepad.org/tvyg4yyv
- 我认为,两次投反对票的人应该给他一些理由——我看不出有什么问题。
- 使用这种语法本身就是一种代码味道:
- 只是更多的例子,试图使对象定向做一些它不应该做的事情。语法清楚地表明您是有意调用基函数的。如果您真的不希望发生这种情况,那么这两个类很可能不是liskov substitutable,您应该使用受保护或私有继承,这将不允许此构造,或者甚至将"a"聚合到一个完全新的对象中,以使a从外部不可用。
- @Madkeithv我不同意你的观点:)我认为事实上,从OOP的角度来看,这两个类应该是明显的子类,因此是可替换的。你这样做是正确的(通过聚合A)或实现继承,你可以控制这种情况,但是这样你就失去了有用的子类型关系,而这仅仅是因为这一点,在我看来,C++的行为是错误的。在Java或其他面向对象编程语言中,这个问题是不存在的,因为您可以从外部调用最新的方法。
- 您似乎采取了与stroustrup相反的态度。stroustrup不担心有可能被误用的特性,只要它们足够有用。C++有很多可滥用的特性。
- @大卫,你说得对。语言设计师做出的每一个选择从他们的角度来说都是有意义的:这里我只是说在这个特定的案例中,我有不同的观点,我不同意语言设计师的观点。我真的认为这违背了它在一般OOP中的工作方式,斯特劳斯特鲁普决定允许这样做,这让我觉得有点不重要。你难道不害怕你的类的用户可以调用你所重写的方法的一个不太具体的版本吗?因为在某些情况下我会这样做:)
- 提到stackoverflow.com/questions/1995113/StrangestLanguage Featu&zwnj;&误8203;re/&hellip;
- @埃文卡罗尔:这是一个不同的问题;)
- @安德里亚·齐里奥:就我个人而言,这并不困扰我,因为要得到这种奇怪的行为,程序员必须写一些明显奇怪的东西。任何人都可以用任何语言编写坏代码;在这种情况下,语言提供的好处是使编写更好的代码更容易,并使更差的代码更明显。
- 我同意戴维的观点,C++的设计理念不是限制程序员可以做什么,仅仅因为他们的决定可能是危险的或错误的。虽然我个人不会遵循这个哲学,我并不是C++的爱好者,但语言的成功多年来肯定证明了这是一种有用的做事方式,如果不是理想的方式。
- 有一个简单的解决方案:在基类中使foo()受到保护(并将其重命名为foo_core()或其他东西)。然后在调用受保护虚拟类的基类中定义一个公共的非虚拟foo()。
- 我同意内特C-K…
- 慷慨是正确的——您应该尽量避免将虚拟方法公开。这使得基类更容易对派生类(例如,通过模板方法模式)强制约束。古鲁·赫伯·萨特解释说:gotw.ca/publications/mill18.htm
- 我不认为这是一个奇怪的语言特征。
在学习PowerShell时找到:
尝试猜测结果数组的外观:
1 2 3
| $a = 1, 2
$b = 1, 2+3
$c = 1, 2*3 |
答案:
1 2 3
| 1, 2
1, 2, 3
1, 2, 1, 2, 1, 2 |
哎哟!它动摇了我对PowerShell及其背后的人的信心。
- vb.net仍然是个麻烦。字符是不可为空的数据类型(因此不能为"Nothing"),但可以为vbNullChar,它是表示空字符值的非空对象。为什么不让字符可以为空呢??
- @大卫:当你需要一个可以为空的字符(Character?)时…
在C:
1
| warning C4013: 'myfunc' undefined; assuming extern returning int |
我记得出于某种原因没有看到警告(在一些遗留代码中有太多警告?)还不明白为什么在使用非int返回函数的情况下,从int转换会导致编译器错误。
编译器假定这样的事情是非常意外的。
- 这就是大多数语言在C变得如此突出之前所做的,以至于它开始影响所有其他的新语言。您当然可以认为从1开始更符合逻辑和直觉。这可能不是决定的真正原因,但C需要从0开始,这似乎源于数组索引和指针算术之间的等价性,而不是任何从0开始计数的哲学论证。
- 无论哪种方式,它都能正常工作——我们只是从0开始训练。
- 在Perl数组中,从$[开始——默认为0,但它是变量。
- 如果索引从0开始,"a[i*n+j]"对"a[(i-1)*n+j]",创建多维数组也会容易得多。在Fortran中可以看到类似的索引。
- Matlab也从1开始。
对我来说,它绝对是intercal中的PLEASE修饰语。如果PLEASE出现的次数不够多,则认为该程序不够礼貌,错误消息表明这一点;如果出现的次数过多,则该程序可能会被视为过分礼貌而拒绝。
- 要杀死PHP的怪癖,需要杀死整个语言=p…我觉得这是个好主意。
- 这有点像mysql_db_query是如何贬值为mysql_query的,但却颠覆了论点…
在mumps You can have a与跳转的偏移。如果你有一个(我的生锈的mumps is…)P></
1 2
| some_label if x=1 do_something
else do_something_else |
then the队列P></
jump to the else statement will…P></
- 这是错误消息中未翻译单词的一个有趣案例,但我不会将其本身归类为语言特性。
- @约翰克,我还是不明白为什么错误信息不是语言功能。如果错误报告不是一个功能,那么您将拥有等同于ERROR_REPORTING=OFF的功能,btw也是一个功能…
- @Talvi:我将在错误消息作为语言特性与错误报告作为语言特性之间画一条相同的线:我不将消息作为特性,即使包含它们的报告系统是一个特性。两件不同的事情。
- @约翰克"这不是一只虫子……这是一个特色。"<-那句话
intercal(and,or和xor)中的一元运算符。
- 因为什么时候是和,或,异或一元运算符?它们至少需要两个操作数,这两个操作数也可以隐式给出,在Intercal中可能是这样的。
- 来自en.wikipedia.org/wiki/intercal operators:"与大多数其他语言相反,and,or,and xor是一元运算符,用于处理其参数的连续位;结果的最重要位是应用于输入的最重要和最不重要位的运算符,结果的第二个最重要位是应用于最高位和第二高位的运算符…这就是说,所有的内部交易都是有意的。
我喜欢smalltalk中缺少运算符优先级
2*3+4*5=6+4*5=10*5=50
而不是
2*3+4*5=6+4*5=6+20=26
这是由于Smalltalk的对象性质以及消息从左向右传递的事实。如果消息*以数字3作为参数发送到2,则该消息的响应为6。太棒了,如果你感觉不好,你甚至可以用猴子来修补。
第四,它的控制结构有些奇怪。首先,因为它是一种反向波兰符号语言,所以条件优先于IF,如:
现在,要关闭条件块,可以使用关键字THEN:
1
| x 0 = IF ." Equals zero!" THEN |
现在真正的WTF开始了。IF所做的是编译一个有条件的正向跳转,并将跳转偏移的地址放在堆栈上。当找到THEN时,它从堆栈中弹出该地址,计算实际偏移量,然后编译该地址。另一方面,ELSE编译一个不符合条件的向前跳转,从堆栈中弹出一个地址,在堆栈上推一个新地址,计算弹出地址的偏移量,然后编译该偏移量。意思是语法如下:
1
| x 0 = IF ." Equals zero!" ELSE ." Not equal to zero!" THEN |
第一和第二个语句的编译如下:
1 2
| x LITERAL 0 = (0BRANCH) LITERAL offset SLITERAL" Equals zero!" (DOTQ)
x LITERAL 0 = (0BRANCH) LITERAL offset SLITERAL" Equals zero!" (DOTQ) BRANCH LITERAL offset SLITERAL" Not equal to zero!" (DOTQ) |
为了增加这种奇怪,这种行为并不是隐藏的。它是该语言的ANSI规范的一部分,可以通过构建自定义流控制结构或以有趣的方式将它们组合起来,自由地利用它。例如,取forth的WHILE循环:
1
| BEGIN x 10 < WHILE x 1+ to x REPEAT |
BEGIN和WHILE之间的部分是任意代码,因此您可以在单个控制结构中的条件测试前后执行代码。这是按设计的,但以下虽然允许,但不是:
1
| BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN |
它利用每个控制流字的工作方式组合两个WHILE语句,并为每个出口添加不同的后循环代码。为了证明我不是在开玩笑,我只是从互联网上的一个代码中复制了这个小片段,并做了一些小修改来简化它。
- 此行为由ieee754->grouper.ieee.org/groups/754定义。本规范的其他好奇为正负NaN:S、+0、0和-0。
- 那又怎么样?它只是epsilon的1/epsilon极限,分别是0和0
- 我认识的大多数语言都会产生一种零误差除法。这种行为让我很惊讶。
- 这是因为javascript是在假设其大多数用户都是白痴的前提下创建的,因此会被毫无意义的错误混淆。他们不想要的是:"Error on line 5: Division by Zero,wtf这个错误消息是什么意思?????"他们得到的是这个"hlp我的prgm dosnt wrk!!
- 讽刺的是,它在数学上提供的答案是正确的。
- @塔尔维-我几乎不同意。如果1/0=无穷大=>无穷大*0=1,这绝对不是真的。不过,我知道@tobias是对的。
- @拉尔夫,你的反例是有缺陷的每无穷大不是(必然)交换。参见:en.wikipedia.org/wiki/communivative
在MAXScript中,所有运算符都被视为相等的。因此,a = b + c将a设为b的值,然后计算a+c的和,并丢弃结果。
- 它是做什么的?
- @丹尼尔:我认为只有当for循环由于break语句而不退出时,else才被执行。
- 是的,它在for循环完成后执行。
- 对于那些不熟悉Python的人来说,一个简单的示例代码片段将是很好的选择。
- 我添加了一个示例
- 还有一段时间,也试试看。
- Try:else:按预期工作(在没有异常出现时执行);for/white:else:与大约50%的程序员的直觉不匹配。我希望它只有在for/while循环的主体从未执行过的情况下才被执行,但事实并非如此——只有在for/while循环中没有break语句被执行时,才会执行else子句。迷惑了吗?
- 如果有两种退出循环的方法,则使用此选项。假设您正在搜索列表。当你找到你想要的,或者你没有找到它就点击了列表的末尾时,你就退出了循环。在其他语言中,我设置标志"itemfound=false",并在循环之后测试标志的值。另一种类似于后循环测试,但您不需要标志。唯一的问题是,如果有三种或三种以上的方法可以退出循环(例如,找到、找不到、出现太多、坏项目),您仍然需要标记。所以我试过用一次,然后把它掉了。
在SQL中
NULL不等于NULL。
所以你不能这样做:
这将始终返回false。
- 是的,我见过(至少听说过)包含pi值的PostScript文档,它使用打印机本身将pi值近似为一定数量的十进制数字,以便包含在文档中。;-)
通知7。有效程序示例:
1 2 3 4 5 6 7 8 9 10 11 12
| Chomsky is a room.
A thought is a kind of thing.
Color is a kind of value.
The colors are red, green and blue.
A thought has a color. It is usually Green.
A thought can be colorful or colorless. It is usually colorless.
An idea is a thought in Chomsky with description"Colorless green ideas sleep furiously."
A manner is a kind of thing.
Furiously is a manner.
Sleeping relates one thought to one manner.
The verb to sleep (he sleeps, they sleep, he slept, it is slept, he is sleeping) implies the sleeping relation.
Colorless green ideas sleep furiously. |
其他像图灵机模拟器这样的愚蠢之处也可以找到。
在PHP中:
1
| for ($s="a";$s<="z";$s++) echo $s.' '; |
这将写下:
1
| a b c d e .. .w x y z aa ab ac ad .. ay az ba bb bc ... by bz ca cb ... yz za zb ... zx zy zz |
- "解释"可能使您更容易记住字符串乘法,但请注意5 5 != 25。在python中,两个相邻的字符串组合成一个字符串——这直接取自c。
- 对。。这就是我的意思。我从来没有说过"5"*"5"是"25"不是。我说过"5"*5是"5"5"5"5"5"5"5"5"5",而"55555"是同一个字符串。
- 星号在Python中没有什么特别之处(除了它是一个内置符号)。这并不意味着"乘以这个"。您可以通过更改类的mul方法,将其指定为表示您想要的任何内容。"myClassInstance*something"只是表达"myClassInstance."的另一种方式。
- 好啊。但对我来说,这仍然是很奇怪的一个例子。
- 好吧,用一个字符串乘以一个数字会得到什么结果呢?实际上没有任何其他逻辑输出imo。
c++1x lambda:
1
| [] (int x) { std::cout << x << std::endl; } (); |
对于某些奇怪的语法,这些可能会被滥用:
这是完全有效的C++ 1x。
- OMFG。我怎么不知道?我脑子里的轮子认为邪恶的模糊思想正在快速旋转…
- void(0)是获取未定义值的更可靠方法。然而,阅读我的答案,看看为什么这也是一个坏主意。(简言之,void(0)并没有像现在这样做)。
- "未定义"不是保留字。它是一个变量名,恰好是未定义的。未定义是一种类型,由typeof显示。
- 这也适用于无穷大和NaN。这将在火狐3.7中更改,方法是:whereswelden.com/2010/01/12/&hellip;
- 这就是为什么大多数图书馆像(function (undefined) { ... })();一样定义它们的本地范围。这样,在您的作用域中就有了一个保证的未定义值(因为省略的参数总是未定义的)。它的压缩比支票的类型要好。
为了保持与VisualBasic6.0的向后兼容性,vb.net的设计者做了一些非常愚蠢的事情。当然,这还不足以让它真正兼容,只足以让事情变得更反直觉。但最糟糕的是,你不必初始化变量,因为它们已经是了,除非在那些罕见的情况下它们不是。
1 2 3 4 5 6 7 8 9
| For i As Integer = 1 To 3
Try
Dim k As Integer
k += 1
MsgBox(k)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Next |
这将打印1 2 3。
拥有一个你不能100%信任的特性并不是一个特性,而是一个缺陷。说它是按设计的,只会使它成为设计缺陷,而不是实现缺陷。
- 我不知道vb.net…但是如果它像这样工作的话…真奇怪…
- 原因是变量的生存期是每个函数的,它与作用域不同。我以前就知道,我想这在所有的.NET中都是真的。对我来说不明显的部分是为什么它会自动重用同一个变量而不初始化它。可怕的是,我遇到的人似乎都不知道这种行为,而且我在生产代码中也看到过这种错误。
到目前为止,我遇到过的最奇怪的功能是用BASIC语言的"返回n"语句(不记得是哪一个,大约是28年前)。n"是可选的,默认为1。它可以是一个正数,也可以是负数,表示下一个要执行的是哪个与调用gosub相关的行。
例如,下面将输出"30":
1 2 3 4 5
| 10 GOSUB 200
20 PRINT"20"
30 PRINT"30"
100 END
200 RETURN +2 |
当我不得不将用这个奇怪的基本语言编写的程序翻译成Fortran时,我遇到了这个问题。基本程序使用这个特性相当多的时间来返回基于各种条件的不同语句,我花了一段时间来理解逻辑流。一旦我理解了它,我就能够写一个更简单的程序版本。不用说,更简单的fortran版本比原始的基本程序有更少的错误。
- awk并不是数组从索引1开始,Lua这样做的唯一语言,AfaikPerl也是如此。
另一个C-ISM。
1 2 3 4 5 6
| int i= 0;
while( i != 12 ) {
/* Some comment
i += 1;
/* Another comment */
} |
为什么不起作用?林特会告诉你的。然而,C编译器通常会轻而易举地忽略这一点。和I.一样
那是一个真正的世界跆拳道时刻,当我发现什么是错误的。
- +1表示php错误而非英语(本例为希伯来语)。
- iirc,这是一个双冒号或::符号。不过名字很奇怪。
- en.wikipedia.org/wiki/paamayim_nekudotayim_php
- 是的,我第一次得到它时,我必须通过维基百科来弄清楚到底发生了什么。
- 我说希伯来语,第一次看到它时我不明白!
- 我真的想向一个"犹太人干了9/11"的阴谋疯子展示这个。他们会认为这是犹太复国主义者秘密经营网络的证据。
- 翻译是沿着"双点,两次"这条线进行的。
- 即->NULL->异常错误。
- 但至少当你看到它的时候你可以用谷歌搜索它,我的意思是这是一个非常独特的术语:)
Java泛型是一个WTF:
1 2
| List<String> ls = new ArrayList<String>(); //1
List<Object> lo = ls; //2 |
2:是否非法(???)这令人费解,但你必须想想接下来会发生什么:
1 2
| lo.add(new Object());
String s = ls.get(0); |
我们将为一个字符串引用分配一个对象,噢,不!像这样,他们周围有很多人。
- 它输出真假真-这意味着如果与==运算符比较,自动取消定义->布尔类型转换的行为会有所不同。
- 你知道你可以编辑答案,尤其是CW答案?
我曾经写过一种编程语言,它有一个"strfry"操作符:
1 2
| "hello world"?
# =>"wdo rlholle" |
有用的,嗯?
- strfry=>"炒菜"?
- 如果你在做饭!;)
- 像C?gnu.org/s/libc/manual/html_节点/strfry.html
- php有一个str_shuffle函数…
- @肯:是的,但是把它当作一元运算符更有用。
- PHP更奇怪。=!(0);?>返回1
- 嗯?怎么这么奇怪?我的意思是,起初它看起来像Perl,但后来你意识到它的作用,然后它就一点也不奇怪了。
大约20年前,我与一种叫做coral的语言的编译器合作,这种语言允许我声明writeonly变量!
不过,这是有道理的,因为它们是全球性的,并被用作信号机制。一个进程将写入一个值,另一个进程将读取该值。
- 对于像python这样的松散类型的无声明语言来说,这尤其可怕,因为它将静默地创建一个新的totalsum变量,而实际上您的意思是totalsum。
- 我以前是这样想的,但现在我发现了这样一个事实:当有人决定用不同的"拼写"添加代码时,强制相同标识符的所有实例使用相同的大小写可以避免以后可读性/维护方面的一些问题。现代的IDE(IntelliSense)功能只需在每个标识符中键入几个字母就可以了。然而,正如所说,在自由声明语言中,案例敏感性是自杀。
- 区分大小写不是用语言实现的,因此您可以对不同的变量使用totalsum和totalsum。它就在那里,所以你不用它来表示同一个变量。它使对变量的所有引用保持一致,这是一件好事。它只是一个副作用,您可以将它用于相似但不同的变量名。TRWTF就是人们为了这个目的而使用它的时候。
- 大卫:没有人故意用totalsum和totalsum作为两个独立的变量。这就是问题所在;错误地使用变量名是很常见的,调试非常困难,完全是语言无意义区分大小写的错误。
- @BlueRaja:你是对的,在使用变量之前不需要声明变量的语言中,这个问题变得更加危险。但是我看到了不同情况下的变量,但是Java中使用了相同的名称。在我理想的世界中,我有两个约束:(1)变量名区分大小写;(2)变量名不能与其他变量名相同(忽略大小写)。这样,变量名看起来总是完全相同,不能与其他变量混淆。[为清楚起见:这里有两个戴维斯评论。我的是第三条评论。]
- (这里第一个david)totalsum/totalsum问题是一个更大的问题,即一致的命名方案。事实上,它在不区分大小写的语言中得到了一致的命名,这有助于让我看到区分大小写对于实现良好的编码habbits(使维护编程工作更容易)具有的长期好处。
- 在普通的Lisp中,变量名是区分大小写的(这实际上是实现国际化的唯一方法——通常情况下,大小写折叠是一个真正的蠕虫罐头),但是标准的阅读器会将它们放在大写。(由于cl是一个ANSI标准,我们不必担心德语"ss"或匈牙利语"sz"或土耳其语"i"。)
- @剪贴狗:天哪,是什么让程序员这么懒?轮班很复杂?压力大?什么?因为Fortran不区分大小写,所以这就是解决方法?还是基本的?上帝啊!如果您不喜欢大小写,请在下(或上)大小写中键入所有内容。并处理结果代码的不可读性。或者让未来的程序员来处理它。
- @xcramps:它与击键的经济性无关。这与我对案件的偏好无关。它只与标识符的解释方式有关。标识符中的区分大小写使程序员能够对两个或多个不同的变量使用同一个词(仅按大小写区分)。不值得为它所造成的问题付出代价的利益。这增加了混乱,但并没有改善它,它引入了更多的方式射击自己的脚,并削弱了可读性。
- 当然,一个好的折衷办法是强制区分大小写,同时只允许一个特定单词的一个实例存在。换句话说,一旦定义了"MyIdentifier",就只能将其称为"MyIdentifier",而且,这将阻止定义"MyIdentifier"和"MyIdentifier"。
- …大写和小写是两组不同的ASCII数字,而UTF-8可能就是为什么…
- -i8n字符集的1个大小写折叠并不总是明显的。
以下C代码引发nullreferenceexception,而不是print 1:
1 2 3 4 5 6 7 8 9 10
| static void SomeMethod(string format, params object[] args)
{
Console.WriteLine(args.Length);
}
static void Main(string[] args)
{
SomeMethod("blabla", null,"Ok here"); // print 2
SomeMethod("blabla", null); // exception
} |
- 仅此一种语言的名字就值得在这里投票。
- Perl具有所有这些特性…
- PHP也允许这样做,$animal="dog";$dog="bark";echo$$animal;
- 我还应该提到我的大学没有snobol编译器。相反,我们有一个spitbol编译器。
- 元编程能力有什么问题?
- 有一次我在斯努波尔写了一个课堂作业,一点也不好玩。这种语言迫切需要更好的控制结构,这比只有一种语句(包括标签、主变量/值、部分或全部模式匹配、等号、要分配的值和要跳转到的标签)更重要。
- @斯莱贝特曼:我想……梅塔谋杀案?
- @kris它作为数组$animal[$dog][$bark]=$sound;或类$animal->dog->bark=$sound;更有用。
- 我听过一个关于聪明的程序员的snobol轶事,他们经常把一堆snobol卡拿给读卡器,展示如何把它们都扔到地上,随机地把它们堆起来,然后把所有的东西都扔给读卡器。Snobol很乐意按预期运行他们的程序,没有问题,而机器上的其他语言则会邀请程序员花一晚上的时间手工整理卡片。
- 在任何人痛恨Snobol之前,你必须记住它始于1962年,大致相当于Fortran IV;早在结构化编程发明之前。如果你想要结构化的snobol,我推荐图标(由创建snobol的同一个团队创建)。
我所知道的最怪异的特点是来自C++世界:
最糟糕的是,它碰巧是非常有用的,广泛使用斯芬纳在助推足够证明我。
- +1个好发现!!!!
- 那是不是很奇怪?完全可以预测的行为。类加载器在加载类之前查找任何方法时调用类构造器本身。无论它是主方法(字符串[]),还是任何其他方法。此外,整个应用程序可能没有主(string[])方法-这取决于应用程序基础结构。
- @你的评论是正确的,但是你用了错误的词。它是加载类时执行的自由浮动静态块。加载类以确定是否存在主方法。类加载器从不调用类构造函数。
- @奥卡里兹:哦,我明白了。我对Java不太熟悉,因为它对我来说有点新。谢谢你的澄清,奥斯卡。现在我知道更多了。:)
- @lyubomyr:这也很奇怪,因为这会打印到屏幕上,同时还会引发一个异常:java.lang.nosuchmethoderror:main。
- @是的,这很奇怪。它是可预测的这一事实并不能治愈奇怪。这个问题下列出的大多数"奇怪"语言特性是完全可预测的。
- @ RussellW:就我所理解的Java和JVM而言,它只取决于加载类的方式,因此如果将其作为单个应用程序运行,则需要EDCOX1×0×-这就是为什么它明确地指出为什么它在EDCOX1(1)中失败。这与Turbo C++编程技术非常相似,如果我没有错的话,它允许使用一些特殊的EDCOX1和2指令来指定一些主优先级。
- 添加system.exit(0);to end将帮助您摆脱nosuchMethodError
在JavaScript中,NaN是一个全局变量。
- 不知道他们加了这个!那太甜了。类型安全是我喜欢的关于C的事情之一,也是我想将我的Web开发从python切换到C的原因之一。不过,这也可以派上用场。
- 权力带来责任!
PHP
从在线文档:string implode ( string $glue , array $pieces )—用字符串连接数组元素注意:由于历史原因,implode()可以按任意顺序接受其参数。
所以这是可行的:implode($someArray, $glue)。
希望他们能在php 6中消除这些历史怪癖。
- 冷融合是一种愚蠢的语言:)
- 哦,好吧,但我还是喜欢。:)
这是缺少一个奇怪的特性:python没有switch语句(尽管存在解决方法)。
- 在模板中也使用了大量的C++语言
- 这不是简单地归结为sizeof是一个编译时操作符吗?
- @戴卡姆,是的,你说得对。考虑到这一点,答案是显而易见的,但它仍然"似乎"很奇怪,特别是因为与其他运算符不同,运算符是一个单词,而且看起来几乎像一个函数调用。
- 您应该使用%zu来打印size_t类型,而不是强制转换为int类型。
- @克里斯:我太懒了,我知道s1和s2都小到可以放在int里。我做演员是因为%zu只是c99。
- sizeof()不评估其内部结构的一个好处是,它允许您创建一个宏,该宏扩展到一个数组,后跟其计数:define string_array(…)((const char*[])va_args)、(sizeof((const char*[])va_args)/sizeof(const char*))
整个malbolge编程语言:http://en.wikipedia.org/wiki/malbolge
在Perl中(没有"use strict"或"use warnings"):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| if(true==undef)
{
print"True
";
}
else{
print"False
";
}
if(undef)
{
print"True
";
}
else{
print"False
";
}
if(true)
{
print"True
";
}
else{
print"False
";
} |
印刷品:
- 行为是一致的,因为它只比较引用,A和B引用相同的内部字符串,而C和D引用两个不同的字符串对象。只比较Java对象与= =,如果你想检查同一个实例,如果你想比较两个对象使用C.Erras(D)。使用==比较字符串只会带来麻烦
- 是的。两种方法都可以,速度可能稍快一点:c == d || c.equals(d)。但您必须调用equals(),或者同时对两个字符串进行实习生,才能得到正确的结果。这不同于C行为,顺便说一句。
在PHP中,可以使用sigil和字符串文字或包含变量名称的变量引用变量,例如:
1 2
| ${'foo'} = 'test';
echo $foo; |
这将打印"测试"。这种行为的奇怪之处在于,您还可以使用非字符串作为变量名,例如:
1 2 3 4
| ${array()} = 'test';
echo ${array()};
${NULL} = 'test';
echo ${NULL}; |
现在我们有了名为array()的变量,甚至为空!全部包含字符串"test"。
- 为什么?有人知道吗?
- 因为PHP遵循Perl处理字符串变量增量的约定。所以,$s='z';echo++$s;将返回'aa'。但字符串与字符串进行比较,因此"aa"小于"z"。
JavaScript: </P >
1 2
| parseInt('06'); // 6
parseInt('08'); // 0 |
- 这是一个简单的递归,可以编写一个完全有效的递归计算属性。虽然编译器可能会被硬编码以捕获一些非常简单的无限递归情况,但要将其作为语言中的规则来实施,则需要解决暂停问题。你是一个够坏的家伙来解决停滞不前的问题吗?
- 不过,这种特殊情况很简单。如果属性除了获取或设置自身之外什么都不做(您需要的不仅仅是有效使用递归属性),则生成一个警告。我见过太多的开发人员,甚至整个团队都因为这个问题而陷入了"神秘的崩溃",这在很大的代码库中是很难发现的。
- 我认为这个问题在当前版本的语言中是固定的。如果您的属性微不足道,那么您应该使用自动属性。
- Mehrdad:由于自动属性不能有初始值,典型的解决方案是自己实现属性。
- 在这种情况下,vb.net将引发一个错误。
- @GABE自动实现的属性可以有一个初始值,您只需在类构造函数中分配它们。
- 丹·迪普洛:你的意思是在所有类构造函数中分配它们(或者确保你用:this()将它们链接起来)。
C + +:P></
1 2 3 4 5 6 7 8 9
| void f(int bitand i){ //WTF
i++;
}
int main(){
int i = 0;
f(i);
cout << i << endl; //1
return 0;
} |
- 这与"其他"或"其他"条款类似吗?
- 除了这个从句,你还有其他的例子吗?
- 这是一种字符串处理语言,类似于扫描a直到"x",但如果没有找到,则是y。这有点开玩笑,实际上,一个参与者一直想要一种语言,其中有一个修饰符。
- 为什么投反对票?
- 这类似于几种语言的语法,它们将由逻辑运算符分隔的表达式串在一起,如expr1 || expr2 || expr3。执行将在计算结果为true的第一个表达式处停止。
正在查找函数?为什么不是一种语言?
我喜欢PHP,但它似乎总是这样构建的"噢,s***t!我忘了这个!让我们在函数"中添加另一个参数,结果是:
str_replace($search,$replace,$subject,…)
strstr($subject,$search,…)
注意额外的下划线和参数的不同顺序。
这还有别的东西
1 2 3 4 5
| $a = array( 'a', 'b', 'c', 'd');
print_r($a); //Prints array( 0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd');
unset($a[2]); //Destroys the element 2 of the list
print_r($a); //Prints array( 0 => 'a', 1 => 'b', 3 => 'd'); |
在Java中,
int x=010;
这将指定x的值为8。
Java中任何一个前面加上0的整数都假定为八进制。
- 在python 3.x中不能再这样做了。它给出了一个语法错误。
- 真的。。。:)这很奇怪。
- 嗯,我想这可能是"为什么我要使用Python3"这样的问题的答案。(例如stackoverflow.com/questions/1921742/&hellip;)
- 让我想起了#define if while。
- 搞砸了,很搞笑。为了两倍的乐趣,True,False = False,True。更糟糕的是,1==1之后仍然回归真实。如果真的和假的只是一致的(全球的)标签,那就不会有什么大不了的了。
- 在c:#define true false中,但仅当使用stdbool.h时。
- 这也是不使用do if test() == True:的另一个原因,但只使用if test():,这是在python中建议的(当然,对于if not test():而不是if test() == False:)。
准将基本的命令快捷方式。基本上,大多数命令都有一个缩写形式,通常是第一个字母+(shift+第二个字母)。但是,由于c64上的字符集默认都是大写的,所以这些命令看起来像奇怪的符号。下面是一个简短的Hello World示例:
也许有人有一个更好的例子,事实上有更多的肉,但对于长期的计划,这看起来完全荒谬。
以下是缩写列表:http://www.c64-wiki.com/index.php/basic_keyword_abbreviation
- 我只是觉得ColdFusion不好,因为代码看起来很难看。
pl/sql允许声明关键字的变量和函数名。以下是可编译的pl/sql:
1 2 3 4 5 6 7 8 9
| create or replace
function function
return number as
return number;
begin
function.return := 4;
return return;
end function;
/ |
这创建了一个名为function的函数。后来:
1 2 3 4 5
| SQL> select function from dual;
FUNCTION
----------
4 |
在Java中,如果x的值是NA,则EDCOX1〔14〕返回false,EDCX1〔15〕返回true。
- 啊,这是地震代码中的一个,对吧?喜欢它,虽然它不是一个很好的语言功能…
- 是的,是地震引起的。你说得对,这和IEEE 32位浮点表示有关,而不是C/C++。
- 与CS语言特性有什么关系?
在JavaScript中:
1 2
| 1 / 0; // Infinity
1 / -0; // -Infinity |
- 或者Y组合器:((? (?) (? ?)) (? (?) (? ?)))是需要应用顺序编译器的简单版本,((? (?) (? ?)) (? (??) (? (?) ((?? ??) ?))))在标准编译器IIRC上工作。
C的默认继承模型赢得了我的投票:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class Animal
{
public string Speak() { return"unknown sound" ; }
}
public class Dog : Animal
{
public string Speak() { return"Woof!" ; }
}
class Program
{
static void Main( string[] args )
{
Dog aDog = new Dog() ;
Animal anAnimal = (Animal) aDog ;
Console.WriteLine("Dog sez '{0}'" , aDog.Speak() ) ;
Console.WriteLine("Animal sez '{0}'" , anAnimal.Speak() ) ;
return ;
}
} |
运行程序会导致以下结果:
Dog says 'Woof!'
Animal says 'unknown sound'
获得这种行为应该需要程序员离开程序员的道路。子类实例并没有停止成为它的样子,因为它已经被上推到了它的父类型。相反,您必须显式地请求预期(几乎总是期望的)结果:
1 2 3 4 5 6 7 8 9
| public class Animal
{
public virtual string Speak() { return"unknown sound" ; }
}
public class Dog : Animal
{
public override string Speak() { return"Woof!" ; }
} |
- 这对于C设计师来说是非常深思熟虑的,而且有充分的理由。Anders Hejlsberg在这里解释了原因:artima.com/intv/nonvirtual.html
- 嗯,真是太棒了。我对C很深,我甚至没有意识到这是不寻常的。
- 是的,我知道Hejlsberg那样做是有原因的。不会改变这样一个事实:默认行为与任何合理的人所期望的相反——子类型实现的行为差异在向上转换到其父类型时仍然会显现出来。
- 它不是C++的相同模型吗?
- 这不是应该的吗?如果选择覆盖,则它是覆盖。如果你选择不,那就不是。如果不指定,就像您的示例一样,编译器会发出警告。
C++最烦人的解析:
1 2 3 4 5 6 7 8 9
| struct S
{
S() {} //default constructor
};
int main() {
S s(); // this is not a default construction, it declares a function named s that takes no arguments and returns S.
} |
- 对我来说完全有意义,这只是宣布一个代表。
- 声明内容为:s->go right->is a function->go left->returning S->go right->';'。
下面是关于数组的这个答案。
在PowerShell中,与其他动态语言一样,字符串和数字在某种程度上是可互换的。然而,PowerShell无法下定决心。
1 2 3 4 5 6 7 8 9
| PS> $a ="4" # string
PS> $a * 3 # Python can do this, too
444
PS> 3 * $a # Python doesn't do it this way, string repetition is commutative
12
PS> $a + 3 # Python gives a mismatched types error
43
PS> 3 + $a # Python would give an error here, too
7 |
如果变量是整数而不是字符串,那么操作是交换的。
1 2 3 4 5 6 7 8 9
| PS> $a = 4 # integer
PS> $a * 3
12
PS> 3 * $a
12
PS> $a + 3
7
PS> 3 + $a
7 |
当有疑问时,做一个演员:
1 2 3 4
| PS> $a ="4"
PS> $b = 3
PS> [int] $a * [int] $b
12 |
您也可以使用[float]。
- 让我们看看,PowerShell对于将整数和字符串与*和+运算符混合有一个定义明确、合理的策略:左边的操作数定义了操作的类型。它恰好与Python不同。注意,对于字符串重复是可交换的,没有"官方"要求,不同于数字加法。然后,数值运算按预期工作。如果您将所有内容强制转换为单个类型,则所有内容也将按预期工作。那么,有什么奇怪的?
- @Martinho:$a ="4"; 0 + $a * 3,所以*比+优先级高,由于$a是一个字符串,所以我们得到0 + 444,结果是444。我称之为"gotcha"(又名"奇怪")。
在Java中,
1 2
| String s = null;
System.out.println(s +"hello"); |
输出"nullhello"。
- 这是当今Java世界中的常见做法,无论如何,您将永远无法在Java中看到C语法语法属性。
一个意外的特性是枚举定义列表中的尾随逗号和C、C、Ruby等中的数组初始化列表。
1 2 3 4 5 6 7
| string[] foods = {"tofu","grits","cabbage", }
public enum ArtPeriod {
Modern,
Romantic,
Dada,
} |
- 这可能是因为类型A可能不容易初始化。也许它的构造函数采用了一个在typeb中不存在的字符串?有人可能会说,隐式"强制转换"(=同名字段之间的简单映射)到具有无参数构造函数的类型应该是可能的(事实上,像automapper这样的工具的存在告诉我们有必要这样做)。实际上,官方地图支持作为一种语言的一部分是非常酷的。
- 哦,等等,实际上你在抱怨信息太不具体了。是的,那也很糟糕。
- 对不起,不是所有语言。scala会说"类型不匹配",跟在所需类型和所需类型之后,并指出代码中发现错误类型的确切位置。如果需要,它将显示用于验证类型是否兼容的决策树。所以,去抱怨特定的语言吧。
- 而且,它在编译时失败,除非你明确地告诉它要远足,并且你知道你在做什么。
- 实际上,编译时的错误是很好的。它们是100%可复制的。:)
- 丹尼尔:听起来还是工作太多了-读取错误,读取文件名,读取行号,找出错误的字符/列位置。我只需要一个被错误铸造的表达。因此,我可以搜索所有出现的错误,并确保在程序中的任何地方都不会发生相同的错误。
- 它显示给出错误的表达式。这就是我所说的"代码的精确点"。如果你有a = b + c,是c造成了问题,它会显示出这个表达式并指向c。
- 异常来自强制转换,而不是对象A的分配。在异常点上,它确实不知道它还试图将值分配给特定的对象。
- 是的,尤其是.NET运行时有时似乎什么都不知道。昨天收到错误"对象引用未设置为Intance"。没有行号,没有文件名,没有函数名,只是一个愚蠢的文本嘲笑你的错误。(尽管这可能是由于自定义异常处理导致的信息不足,但必须进行检查。)
- @aarep:如果您没有调试符号(您可能在周围看到的那些.pdb文件),或者是因为您没有它们进行编译(也称为发布模式),或者只是删除了它们,那么您就无法知道行号或文件名。至于方法名,您总是可以看到异常的堆栈跟踪,除非您故意用自定义异常处理将其丢失。""没有将对象引用设置为实例"是NullReferenceException的消息,这可能是最令人讨厌的无意义异常。
- @martinho fernandes:我有.pdb文件,在没有优化的情况下编译,使用调试开关,获取最后一个exception.innerexception,而我的exception.stacktrace仍然以"control.marshaledinvoke"结尾。有一些文件名和行号,但不是导致异常的文件名和行号。显然,像form.invoke()这样的东西会搞砸异常处理。
- 另外,加载新程序集(例如使用type.gettype)也不会显示真正的问题。错误消息总是"找不到模块"。(甚至不说找不到哪个模块),即使有几十个原因导致无法加载dll文件。有一个用于解决加载问题的实用程序"fuslogvw",但即使这样有时也无法显示任何内容。GRRR…
在javascript中,我认为以下内容是等效的:
1 2
| a['title'] ="Syntactic sugar is good for yr teeth.";
a.title ="Syntactic sugar is good for yr teeth."; |
- 您可以在C++中使用类似的方法,但是使用指针HACK。只需将指向类的指针强制转换为void*,然后将其强制转换为指向其他类的指针。
- 我的C++是生锈的,但我不认为你所描述的会改变对象本身的类,只是这个对象的特定指针。
- 在python中,您不必费心做这些。谁在乎一个物体是什么阶级?哈哈
- 你们所评论的都不是真正等同于Perl的东西,它使对象保持完整,但改变了对象的类。
- python:foo.u类条
带块的vbscript:
1 2 3 4 5 6 7 8 9
| With xml.appendChild(xml.createElement("category"))
.setAttribute("id",id)
.setAttribute("keywords",keywords)
With .appendChild(xml.createElement("item"))
.setAttribute("count",count)
.setAttribute("tip",tip)
.appendChild(xml.createTextNode(text))
End With
End With |
- 哇,以前从没见过这个
- 世界跆拳道联盟!!!!那是我不知道的!
- duff的设备可能是switch语句在默认情况下没有中断的一个很好的原因;-)但是,我还没有看到任何其他的交错开关和循环的良好使用-但可能有一个。哦,等等,是的,还有另一个用途:协程和原线程。
- 我会记住的。
- 哦,伙计。有那么多语言的神秘玉米粒。
- 实际上,这是黑客测试的一部分。-)
- 这太不对了。你从圈外直接跳到圈中间,对吗?你从来没有真正遇到过这样的事情。那么,如果将while()放在case 0:后面,会发生什么呢?它仍然循环吗?或者这就是为什么这段时间要结束的原因?我突然觉得C是一种解释性语言。
- @frunsi:"duff的设备可能是switch语句在默认情况下没有中断的一个很好的原因"——总是将常见情况设为默认情况。我不会说这是常见的情况。
- @如果你试图把它读作汇编代码,也就是说,末尾的while是一个(有条件的)JMP返回do,这就解释了为什么你可以跳过do而仍然在循环中结束。
- 这只适用于n>0,对吗?
- @Afriza:是的,这个代码看起来在n==0.时会很疯狂。
- 请记住,对于现代编译器来说,达夫的设备通常会产生比常规循环语句更糟糕的代码,现代编译器知道如何(更好地)展开循环,而不是手工操作。
- @弗伦西:达夫本人发表了这篇文章,声称类似这样的话:"这在讨论是否应该在默认情况下进行转换时提供了一个论据,但我不确定这个论据是支持还是反对它。"
- @SF:是的,没错,在世界范围内没有违约的情况下,达夫的设备可能也可以工作(使用fallthrough或continue关键字)。在那个世界上,使用switch语句的大多数其他代码都会更短。然而,对于C和C类语言来说,要改变这一点还为时已晚(除了新手以外,所有人都希望默认值在今天消失)。
- +我喜欢这个功能。我真的希望在嵌套开关的子块中的情况是有效的。
- 这种技术也可以用于在C中实现无堆栈线程,如在Contiki操作系统中:sics.se/~adam/pt
与MATLAB,下面可能会surprising especially,如果你用这一: </P >
1 2 3 4 5 6 7 8 9 10
| >> not true
ans =
0 0 0 0
>> not false
ans =
0 0 0 0 0 |
这里是两个有奇怪的特性。第一个是,a b是interpreted作为a('b'),not trueinterpreted not('true')是王牌。奇怪的是,第二特征not任何字符returns 0(presumably是因为有好的false或true和MATLAB,只0或1)。 </P >
- 有些语言改为使用elif(我认为python就是其中之一)。
- pl/sql也有EDOCX1[2]
- Perl使用elsif。
- Ksh有if ... elif ... else ... fi。和case ... esac。
在javascript中有很多东西可以让你的眼睛湿润。
局部变量的作用域,只是一个简单的例子:
1 2 3 4 5 6 7 8 9
| function foo(obj)
{
for (var n = 0; n < 10; n++)
{
var t; // Here is a 't'
...
}
t ="okay"; // And here's the same 't'
} |
- 哈哈。我听说开发人员故意放慢一些操作(例如搜索)的速度,因为它可以帮助人们相信它确实在做什么。我想也差不多。
- 这让我想起了我最近读到的一些东西。他们正在测试一个fps,并决定增加坏人的命中率。然后他们问测试人员他们的人工智能是怎样的,他们发誓人工智能要聪明得多。但是人工智能并没有改变,只是关键点。人们在头脑中对这个世界有一定的叙述,如果你理解并符合他们的期望,他们会认为这证实了他们的叙述。
- 我过去常常在程序中增加很多额外的减速,使它们看起来像在做一些复杂的事情。回到小学,就是这样。
- 有趣…………
- 回到学校时,我们有80286台机器,实际上我不得不在汇编中编写一些屏幕输出例程,以获得合理的速度(即不爬行)。
- 哈哈。然后,您可以在每个版本中减少,并告诉您的用户您"减少了可执行文件的大小",用户都会说,"哇,他一定已经对代码进行了真正的优化,以减少可执行文件的大小并添加新功能。"
- @问:不,你走另一条路。更大的可执行文件显然意味着更多的特性,对吗?
- @Nate C-K,如果人工智能的寿命足够长,可以炫耀它的人工智能,那么它实际上可能更聪明,而在它死之前,它可能已经死得太快,无法证明它。
- 添加一个"任意多字节"的注释,它就会膨胀。
- @ U?伯格&252;M&252;?编纂过程中,汉文注释被忽略。
在C中
- 不在GCC工作
- 虽然eelis的模拟文字很棒,但它们是一种奇怪的语言特性,还是仅仅是一种使用特性的奇怪方式?
- 真正的wtf将是由一个格式错误的编译器生成的编译器错误。
- php=扩展调试。让我想起windows=assert(blue-screen-of-death)lol
- 这有多恶心……当有一个支持在Eclipse中围绕X、Y和Z轴旋转文字的类似文字版本时,请再次唤醒我……现在,这将给"可视化编程"一个新的真正意义。
- O和L和的顺序有关系吗?
- 排序很重要,因为模板创造性地使用了运算符重载。(不要使用真正的代码,滥用运算符会使代码难以读取)
- 参见:EngavaLang.Org/2010/07/02/& Helip;模板Haskell击败C++,下手。
基本雅达利:
您可以在不编写循环的情况下用字符填充字符串:
1 2
| 10 DIM A$(100)
20 A$(1)="":A$(100)="":A$(2)=A$ |
- "=utf-8与'=ascii。$i将呈现为整数/字节
MySQL的Enums,特别是他们把毫无准备的同事搞混的能力。
1 2 3 4
| CREATE TABLE foo (
....
dispatched ENUM('0','1') NOT NULL DEFAULT '0',
) |
然后:
1
| UPDATE TABLE foo SET ..., dispatched = 1; |
哎呀,dispatched改为零,因为1没有被引用。这真的让我的代码开发人员很恼火;我现在使用的是简单的旧ints。
在相关注释中,即使向枚举中添加空字符串选项,例如
1
| blah ENUM('','A','B') NOT NULL, |
如果给blah分配一个无效值,mysql将使用一个秘密的隐藏空字符串值来表示无效值,这将很难与您自己添加的值区分开来。哎呀!
- Lisp不是一种wtf语言吗?) ) ) ) ) ) )
在X++中(Microsoft Dynamics AX):
1)需要在单独的行上使用分号(;)将变量声明与语句分开(至少在4.0版之前)
1 2 3 4
| int i;
int myArray[5];
;
i = 1; |
< BR>
2)数组索引是基于1的,因此不允许像in一样使用索引0(零)从数组中读取
1 2 3
| int myArray[5];
;
print myArray[0]; // runtime error |
这并不奇怪,但是允许您使用分配左侧的零索引,如
1 2 3 4 5
| int myArray[5];
;
myArray[2] = 102;
myArray[0] = 100; // this is strange
print myArray[2]; // expcting 102? |
发生什么事了?数组将被初始化为它的默认值,无论在赋值中使用了什么值。以上代码输出0(零)!
- 这是当前最高投票率答案的翻版…
- 有点-这两次应用a[b]==b[a]转换。可能在现实世界中有用。
不确定是否有人提到过。
在爪哇中,在最后一个块中,它可以返回一个值。它将停止异常的传播并重写正常的返回语句。
- 很好,至少Eclipse会发出最终不会正常结束的警告。
在matlab(交互式面向数组语言,目前是tiobe 20)中,有一个关键字end表示数组的最后一个元素(它对应于numpy -1)。这是一个众所周知的matlab语法:
要从数组中间获取元素,通常需要编写:
1
| myVar = myArray( ceil( length(myArray)/2 ) ) |
令人惊讶的是,关键字end根本不是关键字,而是一种变量:
1
| myVar = myArray( ceil( end/2 ) ) |
- 这只是结束一个无效声明:3。更多的语言支持这一点。
- 这和#define EVER ;;没什么关系。你知道的。。。。for(EVER){ ... }。我跑开藏起来了
- 它相当于asm的nop函数("no operation"),它简单地……没有什么。不过,我希望编译器可以对此进行优化。很多年前,我在一个循环中看到过这种用法,它的目的是引起一个延迟:"for(int i=0;i<2000000000;i++)";它基本上只做增量i。(尽管永远不要做那样的事情,但以后会伤害你:merlyn.demon.co.uk/pas-r200.htm r200)
- 它并不是nop的等价物——nop有一些副作用,比如跳过一个可能有助于CPU冷却的周期。C s*语言不会为void语句生成任何机器代码。
- @Fennec-我更喜欢#define ever (;;),所以我可以说for ever { ... }。我也喜欢#define forever while(1),这样我就可以使同一个声明与forever { ... }和do { ... } forever;都有效。
python 2.x演示了一个糟糕的列表理解实现:
1 2 3
| z = 4
s = [z*z for z in range(255)]
print z |
此代码返回254。列表理解的变量与上定义的冲突。
python 3.x已经处理了这个特性,但是闭包仍然在使用外部变量的动态链接,并且在函数式的python程序员中引入了许多wtf。
1 2 3 4
| def mapper(x):
return x*x
continuations = [lambda: mapper(x) for x in range(5)]
print( [c() for c in continuations]) |
此代码显然返回[16,16,16,16,16]。
- 在某些情况下,这实际上非常有用。我认为,如果您对类进行编码以在不同的实例中访问私有数据,那么您可能知道自己在做什么,并且必须不遗余力地传递对另一个类的引用。克隆就是这样一种必要的操作。
- 还要注意,静态函数可以访问它们所属类的实例成员。
NSI(NullSoft可脚本化安装系统)具有StrCmp指令:
1
| StrCmp str1 str2 jump_if_equal [jump_if_not_equal] |
Compares (case insensitively) str1 to str2. If str1 and str2 are equal, Gotos jump_if_equal, otherwise Gotos jump_if_not_equal.
1 2 3 4
| StrCmp $0"a string" 0 +3
DetailPrint '$$0 =="a string"'
Goto +2
DetailPrint '$$0 !="a string"' |
蛋糕上的糖霜:jump_if_equal和jump_if_not_equal也可以是负的。但我想你已经从正数前面的+符号中找到了答案。我不记得这是强制性的,还是一个可怕的惯例。
这基本上结合了最差的基本和最差的汇编程序。
javascript中的变量分配可以创建全局变量。如果变量是一个函数内的赋值,并且在同一范围内没有声明为var,则该变量隐式声明为全局变量。
1 2 3 4 5 6 7 8
| function foo() {
x ="juhu"; // creates a global variable x!
var y ="kinners"
}
foo();
alert(x); // alerts"juhu"
alert(y); // alerts undefined |
注意,在为变量赋值后,也可以使用var语句:
1 2 3 4 5 6 7 8
| function foo() {
x = 12;
var x; // x is now local
return x;
}
alert(foo()); // will alert 12;
alert(x); // will alert undefined |
- 如果我没弄错的话,python也会这样做,但是他们在版本3中把它去掉了。
- Perl仍然这样做,perl -E'say 010'。
- 被一个除了8和9以外的所有数字都有效的错误卡住了!!快疯了!!!!谢谢布瑞恩!
- 真是疯了。
- 这是一个功能。以0开头的所有数字都被视为十六进制。当然,错误随之而来。
- @你不是说八进制吗?十六进制是0x。
- 这就是ParseInt接受(可选)额外参数的原因。
- 前导0表示八进制数。因为8不是有效的八进制数字,所以结果必须是0。
- 你的意思是有些语言不是这样的?
- python(2.x)在08上抛出一个syntaxerror(或任何其他不是真正八进制的前导零数字)。3.x不允许前导零,句点。(但它有前缀0b表示二进制,0o表示八进制,另外还有通常的0x表示十六进制。现在我只需要克服我对"打印功能"的厌恶……;-)
- …而parseInt('010')->8只是为了迷惑你。
- 这一次我也是。
- ES5中的变化:"函数parseint的规范不再允许实现将以0字符开头的字符串视为八进制值。"
- 解析整数时,应始终传递基参数。parseInt('08')==0,而parseInt('08',10)==8
- 这是有道理的。也许parseInt('09')应该抛出一个异常。
- 天哪,什么是ffffffffffffffffffff
- 谁曾经故意用这个函数解析过一个八进制数?据Joseph Pecoraro所说,该代码将与ES5中断。
- 您可以传递基数:parseInt('08',10)==8。但是,这很奇怪;-)
- 很多语言都是这样做的,包括C++。
第四可以变化的基部数在任何时间: </P >
1 2
| HEX 10 DECIMAL 16 - .
0 Ok |
它需要一个便条,请预先定义的一指: </P >
1 2
| 36 BASE ! 1Z DECIMAL .
71 Ok |
- scala有XML文字表示法。def xmlstring=foo bar baz
- 为什么这仍然如此罕见?因为文字日期不是经常需要的——时间跨度文字会更有用。
- 我对日期时间文本的问题是,它们可能是不明确的-mydate=10/9/2009 18:35-10月9日还是9月10日?现在我猜它总是m m/dd/yyyy,但对于非美国用户来说,日期不是dd/m m/yyyy格式总是很奇怪。在具有日期构造函数的语言中,您至少可以始终引用签名,但我想这与在帮助中查找或记忆签名没有什么不同。另一方面:日期的整个语言结构看起来非常"沉重"。我能理解为什么VisualBasic有它(OfficeVBA),但我看不出它在C中有什么用处。#
- @Fennec:既然你提到了,vb.net 9也是如此。
- @安德烈·什切金:我不知道,我经常使用它们,这样做是值得的。请记住,vbscript使用相对时间文本,所以现在是2010-01-05年1月5日。不过,时间跨度文本(超过简单的秒数)也不错。
- @迈克尔·斯图姆:同意。可能应该使用ISO 8601,只是为了保持清晰。我想语言特性的相对权重很大程度上取决于它对程序员个人的影响。
- 不了解vb,但在foxpro中,日期文本是在编译时根据当前用户日期设置进行解释的,可以通过设置日期dmy、设置日期myd等进行更改。
- @格瑞:vbscript似乎不受计算机的区域设置的影响。当存在歧义时,美国日期格式mm/dd/yyyy似乎是首选的格式,尽管yyyy-mm-dd hh:mm:ss也有效(iso8601减去"t")。
Fortran对不同列的特殊意义。(如果你是和打孔机一起长大的,那可能是完全自然的。)
这样做的一个副作用是,变量名在第72列后被截断。与IMPLICIT NONE结合在一起,当这样一个变量名在第72列附近开始时,它会悄悄地引入一个新变量。
你需要
意识到这一点
在另一个编辑器中突出显示注释部分(第72列之后)颜色比以前的部分…
- 这有什么奇怪的?
- 我甚至不懂语言,这很清楚。像这样的隐式声明"不应该"在支持它们的任何语言中被狭隘地限定范围。
- "A"变量在while块内部定义,并在while块退出后存在
- 我相信Javascript也会这样做,除非您在声明之前放上var关键字。Python也会这样做,而且在它周围没有办法…当您认为稍后在不同的范围内重新定义了变量,但没有重新定义,而且它仍然使用前一个循环中的相同值时,这真的会让您头昏眼花……搞混了!
- 在javascript中,只有python和ruby函数创建范围
对javascript的另一个投票:
因为任何以0开头的数字都被解释为八进制(奇怪),无效的八进制数的值为零(错误)。我发现这是一个八月,几个月来我没有接触过的代码自行中断。事实证明,它将在10月份自行修复。
八进制支持显然已被弃用,所以JavaScripter的后代将不会有这种通过仪式。
- 我想知道设计师把它放进去时是怎么想的…
- 它更像是语言设计的副作用,顺便说一下,这是个很好的例子。
- 在python中也是可能的:class C ( random.choice([A, B]) ):;-)
- 可能在大多数动态语言中都是可能的。例如,在Perl中:package C; use base (qw/A B/)[ int(rand(2)) ];。
- 哈哈,好笑!
PHP的列表结构:
1 2 3
| $array = array(0,1,2);
list (,,$x) = $array;
$x == 2; // true |
- 字符串引用。Perl也会这样做,但是如果您使用use strict(或者特别是use strict 'refs'),它会发出警告。但我更喜欢符号表游戏:现在猜猜A是什么?是的!(您可以使用Package Globals!)
- 这是我在PHP中非常喜欢的功能。
- @Mdcore,真的吗?为什么,因为你喜欢洗脑?
- 任何shell语言都可以做到这一点,许多其他语言可以通过一些返回基于字符串的符号的读取操作来做到这一点。它对于在动态语言中实现反射特性很有用。
这个老的PHP最喜欢的并不是所有的wtfish,但是范围解析错误是许多开发人员看到的值得给wtf一些爱的事情之一:
1 2 3 4
| $class = new StdClass();
$class::test();
PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM on line 3 |
- .getFullYear()
- GetYear是1900年以来的一年。
- @尼克:那可以解决问题。@KZH:我知道,只是想展示一个"有趣"的结果。
- @霍布豪斯:你当时不需要上面的几十行……now.GetYear()几乎总结了你的整个帖子。
- 自从Unix/C(c a.1972)以1970-01-01时代为基础建立其时间结构以来,这一直是一个问题。它已经传播到许多其他语言、库、数据库和电子表格应用程序。
和Python。 </P >
1 2 3 4 5 6 7
| >>> x = 4
>>> y = 1000000
>>> x is 4
True
>>> y is 1000000
False
>>> |
如果你只是尝试它don′t相信我! </P >
在Perl中,对象只是blessed refs,因此在运行时更改对象的类很容易:
1 2 3 4 5 6 7 8
| package Foo;
sub new { bless {}, $_[0] }
package Bar;
package main;
my $foo = Foo->new;
ref($foo); # =>"Foo"
bless $foo, 'Bar';
ref($foo); # =>"Bar" |
我很惊讶其他语言不能做到这一点。多有用的功能啊!
使用sqlite可以声明具有所需数据类型的列。它查找一些特定的子字符串("int"、"real"、"text"等),以确定相关性。
这使得您可以躺在类型声明中:
1 2 3 4
| CREATE TABLE Quirks (
X FLOATING POINT, -- = INTEGER affinity because of the"INT"
Y STRING, -- = NUMERIC affinity
); |
- 您要将数组字段名作为ID列出吗?有用,不是WTF!试一试:$array = array('id','field','value');和…$x == 'value'; // true。非常适合查询!
有向图和可选标记
C(ISO/IEC 9899:1999,4.4.6/3)和C++(ISO/IEC 1488∶2003,2.5)有一个很少被使用的特性,被C称为"有向图"和C++的"替代令牌"。这些与三元图的区别主要是因为包含它们的字符串文字永远不会被不同的解释。
1 2 3 4 5 6 7 8 9
| %:include <stdio.h>
int main() <%
int a<:10:> = <%0%>;
printf("Here's the 5th element of 'a': %d
", a<:4:>);
puts("Evil, eh? %:>");
return 0;
%> |
C++有很多,包括和/或不需要作为EDCOX1,0,EDCOX1,1,EDCX1,2的行为。C也有这些代码,但需要包含才能使用它们,将它们视为宏而不是令牌。C++Health[CISO64 6]字面上是一个空文件。
值得注意的是,gcc实现了对这种奇怪语言特性的支持,但是在试图编译上述代码段时,许多其他编译器都会死气沉沉。
- 这是因为Java没有操作符重载,除了EDCOX1对字符串类型的3,来自C背景,这完全是预期的行为。
- 更具体地说,如果第一行是真的,则字符串类与Java中的所有其他类的区别更大。
- 为什么投了反对票。很奇怪。事实上,对它有一个解释,并不能使它不那么令人惊讶或奇怪。
- +1因为在处理字符串时"=="经常失败并不明显。如果变量"mystr"等于"hello",则编写mystr=="hello"并不总是有效(我可能是错的,但如果编译器能够内联"hello",则认为它会有效)。
- 我不会称之为"最奇怪的"语言特性,只是"最差的"语言特性之一。
- + 1。我同意。如果你不知道Java,并且来自C背景,这是一个"奇怪"的特性。
- @雪文:你是说在C语言中,==作为相等运算符处理字符串?那为什么有strcmp?
- 我的意思是"java2s.com/tutorial/cpp/0300"string/stringequals.htm。
- 另外两个"新"不见了吗?
- 您不了解引用相等和对象相等之间的区别。
和PHP。 </P >
复活节的日期_ UNIX timestamp为他准备一个给定年复活节午夜 </P >
国际_复活节的日期(年] [国际美元) </P >
- 为什么不在那个问题上特别提一下(这是CW!)或者对这个问题发表评论?我们不需要更多的副本。
- 不必是全球性的,只需适当地调整范围:{local $[=1; ...}。
- $]总是隐含地在词汇范围内。
- 我们说的不是$[,而local在词汇上不涉及任何内容。它只是将全局值存储在一个私有寄存器中,并在词法范围的末尾恢复它。然而,变量本质上仍然是全局的。
在C++中,可以从空指针调用静态方法——看!
1 2 3 4 5 6 7 8 9 10 11 12
| class Foo {
public:
static void bar() {
std::cout <<"WTF!?" << std::endl;
}
};
int main(void) {
Foo * foo = NULL;
foo->bar(); //=> WTF!?
return 0; // Ok!
} |
那个让我吃惊的…
- 世界跆拳道联盟?!这是文件吗?
- 不想相信。但实际上是可行的,比如说codepad.org。jansch.nl/2007/03/09/systemoutprint-in-php解释了它的工作原理,但仍然很奇怪(trwtf是php如何吞下对未定义变量的引用,并将UndefinedConstant视为"UndefinedConstant")。
- Holly S**T.这是一个真正的WTF
- 我不明白这有什么奇怪的。你能解释一下它到底在做什么吗?
- @nickretallack字符串强制是php所做的…嗯,不是最好的,而是到处都充满活力。未知常量?把它们串起来!你最终得到的结果就像你说的"System" ."Out" . print("hello");,它将这些字符串与打印输出(无论是什么)连接起来,然后对它什么都不做。同时,"print"函数将传递给输出的内容发送给输出。
在Java中(实际上,我最近在不同的POST上写了这个):
1 2
| int x = 1 + + + + + + + + + + + + + 1;
System.out.println(x); |
- 注意,该程序依赖于非ANSI预处理器功能,_-扩展到--F。在ANSIC中,它是两个独立的令牌,因此扩展到-,然后是-F。因此,输出不是作者预期的pi值。有关详细信息,请参阅stackoverflow.com/questions/841646/&hellip;。
- 为了达到这个目的,有一个国际上模糊的C代码竞赛,就是为了找出真正有效的奇怪的C代码……IOCC.ORG
- - 1。这是一个用来计算π的ioccc条目。这里有什么奇怪的语言特征?
- 但pi不是0.267…用gcc 4.3.2编译
- @罗杰:C预处理器是这里奇怪的语言特性。
- @kai,代码依赖于旧的预处理器"特性",更多信息请参阅上面的我的评论(本文的第一条评论)。
- 等边三角形的中心到一点的效果更好…;)
在ColdFusion中,所有的变量都被当作全局变量,不管它们放在哪里。
1 2 3 4 5 6 7 8
| <cffunction name="one" returntype="void">
<cfset var wtf="coldfusion">
<cfinvoke method="second">
</cffunction>
<cffunction name="two" returntype="void">
<cfoutput>#wtf#</cfoutput>
</cffunction> |
- 范围界定是我最头疼的地方。
- 我在这里疯了吗?我是唯一希望这个"t"变量在这个函数中定义的范围内的人吗??!我不希望"t"是全局的,也不希望从任何其他函数访问,而是在同一个函数中?是的!
- @Maltrap:t在内部块中定义,由和分隔。在几乎所有其他现代语言中,在一个块中定义的内容都位于该块中。同样,我可以认为t是在全局/窗口对象中定义的,应该可以全局访问。JavaScripts行为非常奇怪,因为它将作用域应用于某些-块,而不是其他块。
- 您需要的是类似(for(…)(function()var t;…)的东西。})();),如果你希望范围界定做得好的话。
- 函数作用域而不是块作用域。无聊的。
- @马尔特拉普:我也希望这样做,因为我最喜欢的语言也这样做。
- @张:这让我的眼睛湿润了。
- 在好的javascript中,每个函数只能有一条var语句,通常在函数的顶部。只有函数在JavaScript中创建了一个新的"作用域",而不是像for循环和if语句或{}那样。
- 斯特拉格:是的。因此,"好的"javascript在概念上与几乎所有其他块范围语言都不兼容。
- 针对您的javascript全局问题的jlint…
- @确实是这样。问题是,JavaScript的行为类似于Scheme(闭包、lambdas等),但使用C语法…当人们看到C语法并期望它表现得像C时,这会令人困惑,但事实并非如此。
在Visual Basic 7及更高版本中,我发现了短路逻辑评估的实现,以保持与旧版Visual Basic的兼容性<=6代码一点WTF:
AndAlso (MSDN)
OrElse (MSDN)
- 这基本上是这个高投票率的答案的翻版stackoverflow.com/questions/1995113/StrangestLanguage Featu&zwnj;&8203;re/&hellip;,因为有向图和三向图是密切相关的。
- rmeador:编辑以显示它不是一个骗局。
Perl的$[(已弃用),这在前面关于通用Perl变量的另一篇文章中提到过,但它值得特别提及,并提供更好的解释。对$[的更改仅限于当前范围。有关如何使用它及其含义的更多信息和快速说明,请访问$[http://www.perlmounds.org/index.pl/?NoDyIID=480333
因为我没看到有人提起…RPG 2或3(报告程序生成器…也就是火箭推动的垃圾)是迄今为止我使用过的最古怪的语言。它结合了对程序流几乎没有控制的功能(在文件的顶部输入,在底部退出),并且编程语句是基于使用固定字体在特定列中定义的字符来定义的(想想穿孔卡片!!!)
要成为真正的Fubar,你必须尝试在DY-280中编程。它将RPG流和逻辑与COBOL语法结合在一起。
请看这里的rpg:wikipedia.org/wiki/ibm_rpg
dyl-280的一个例子:http://99-bothes-of-beer.net/language-dyl-280-224.html
- 嗯……它不是真正的"接线员"。x --> 0被解析为x-- > 0。
- 这就是为什么它很奇怪!
- stackoverflow.com/questions/1642028/&hellip;
- 这不是未定义的行为吗?
- @拉德克:不,为什么?x在每个表达式中只被引用一次。
- 它将1个字符全部保存在公认的"for(x=20;x>0;x--)"形式上。程序员会放弃保存单个字符的可读性,这让我觉得是真正的WTF。
- 我刚才读这本书之前可能会感到困惑,但现在它的可读性非常好!
- 您也可以使用任何其他组合:-->=、--<=、--<、++>、++<、++>=、++<=。
整洁的依赖系统的溢出会导致(mri/c)ruby和macruby(但不是jruby)中的年滚动,然后出现较大数量的本地时间错误,这又如何呢?这不是一个常见的问题,但很奇怪:
1 2 3 4 5 6 7 8 9 10 11 12 13
| $ ruby -version
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
$ irb
>> Time.at(67767976233550799)
=> Tue Dec 31 23:59:59 -0500 2147483647
>> Time.at(67767976233550800)
=> Wed Jan 01 00:00:00 -0500 -2147483648
>> Time.at(67768036191694799)
=> Wed Dec 31 23:59:59 -0500 -2147481749
>> Time.at(67768036191694800)
ArgumentError: localtime error
...
Maybe IRB bug!! |
不过,这可能是特定于64位环境的。
- "在C中使用(宏)来绕过宏的预处理器定义"——它没有绕过宏()的预处理器定义,但是如果宏的预处理器定义没有lpare,那么它就不会被绕过。
- 是的,很难在iPhone上输入函数宏和对象宏。
- 虚拟案例有什么奇怪的(除了名字)?
PHP背板
来自http://www.php.net/manual/en/language.operators.execution.php
PHP supports one execution operator: backticks (``). Note that these are not single-quotes! PHP will attempt to execute the contents of the backticks as a shell command; the output will be returned (i.e., it won't simply be dumped to output; it can be assigned to a variable).
1 2
| $output = `ls -al`;
echo"[cc]$output |
;< /代码>
在代码中发现"而不是"是"相当容易的"。
这也很有趣:
After much trouble, I have concluded that the backtick operator (and shell_exec) have a limited buffer for the return. My problem was that I was grepping a file with over 500,000 lines, receiving a response with well over 100,000 lines. After a short pause, I was flooded with errors from grep about the pipe being closed.
特征:bash的大麦,壳牌(ksh93)和Z shell允许阵列的每个下标变量与或不与美元符号:(一) </P >
1 2
| array[index]=$value
array[$index]=$value |
这与美元符号,将产生的预期值(10000美元。 </P >
1 2 3 4 5 6 7 8 9 10 11
| unset array
for i in {1..10000}
do
((array[$RANDOM%6+1]++))
done
unset total
for count in ${array[@]}
do
((total += count))
done
echo $total |
如果你strangeness:remove the美元最虔诚的总会随机的,如果randomly,甚至是更大的比10000。 </P >
这similarly产生,而不是2 3: </P >
1
| a=1; ((r[a++]++)); echo $a |
你不能用一美元的标志,因为它有一个分配的(A冰在LHS),尽管你可以做的,如果你是用间接的评价,但双动发生。 </P >
的原因:与美元符号,"变频冰performed扩张前的arithmetic评价只山羊做这么一次。"美元"的标志,它的performed两次,一次对《指南calculate指数再次到Lookup and calculate的索引的分配(SO、效应、分配在一步在回路可能看起来像array[4] = $array[6] + 1totally scrambles"阵列")。 </P >
- 流行性腮腺炎在每日世界卫生大会上很有名。我认为问题更多的是关于奇怪的特性,而不是语言如何使事情变得异常疯狂,尽管…;)
- 在dailywtf.com上阅读"腮腺炎病例":dailywtf.com/articles/a"U the mumps.aspx的病例"
- 幸运的是,现代实现比这要好得多。
- 顺便说一句,我很熟悉《世界贸易基金会日报》的那篇文章,它已经过时了(大概10岁以上),而且,在我看来,也不完全是真实的。
- 为了说明清楚,我喜欢腮腺炎。但我也看到了更糟糕的情况。或者,更确切地说,看到了一些糟糕的事情,以至于对那些忍受了更糟糕的事情的人感到同情——维护写得糟糕的单字母命令,遗留的流行性腮腺炎代码。
- 对于这样一种早期的语言来说,它实际上是一个奇怪的高水平。如果它只是具有更好的结构化编程特性(至少Intersystems正在尝试),那么它可能是一种非常好的语言。至于if--else,他们建议增加一个then声明,这样可以保留$test的价值,并在下一行的开头恢复它,从而保护您不受其改变的危险;但我甚至不知道未来的标准是否会发生。
- 在我看来,单字母命令也不错。总之,只有几个命令,记住它们并不难。不过,单字母变量是不好的。以及标记接口,这些接口以任意命名的变量而不是显式参数传递信息。在我工作的地方,这些做法是(不再)允许的。
- 但是流行性腮腺炎最好的一点是不必每10年废弃和重写一次代码,因为您选择的语言不再受支持。这种语言有着惊人的寿命。
- 好的,我同意一个字母的命令。只是每当我看到一个字母的命令时,其他的都是一个字母。
- 我最不喜欢的变量名可能是%。
在一个陌生的银行系统中使用了RSL编程语言。数组有内置类TArray。但是,如果从中继承,则每个实例变量都将成为数组的元素。
1 2 3 4 5 6 7
| class (TArray) DerivedArray
var someField = 56;
end
var a = DerivedArray();
PrintLn(a.Size); // => 1
PrintLn(a[0]); // => 56 |
以下是Perl调试器中的一些混乱:
1 2 3 4 5 6
| DB<1> sub foo { +(1..20) }
DB<2> @bar = foo(); # list of 1, 2, 3, 4...20
DB<3> x scalar @bar # size of list
0 20
DB<4> x scalar foo();
0 '' |
这是正确的。当您这样调用该方法时,来自scalar的标量上下文向下传播到子例程调用中,将看起来无害的..转换为完全不同的运算符。(这是"触发器"运算符,而不是范围运算符)。
- Hm.…在纯数学中,[x]有时用来表示对x的非常"形式"的解释,如在[0/0]和[∞/∞]中(两个有趣的分数极限情况)。虽然我不知道[]的确切定义,但我会说"我的意思正是我所写的,但不要试图从字面上解释它"。相关的?
C,命名空间重新排序
例如。
1 2 3 4 5
| namespace foo.bar.xyz{
public class Foo{
Exception e; // you'll get compile time error here....
}
} |
因为
1 2 3 4 5
| namespace foo.bar.Exception{
class HowDoMyWayException : ApplicationException {
// because someone did this
}
} |
- 这完全有道理。我应该有两个值,但我不知道它们是什么。它们的价值相同吗?我不知道。
- @汤姆:但空值是一个定义值:没有其他值。应该有另一个值。
- @汤姆,如果你不知道它是什么,那它在数据库里做什么?
- 空值应以0/0表示
- 不,空值为空。它不等于空,因为它实际上不是一个值。它并不意味着"我不知道",它只是意味着"此行中此列没有值"。
- 实际上,SQL使用三值逻辑。所以比较的结果可以是真、假或空。myvalue=null的结果总是空的,myvalue的结果也是空的!= NULL。
- 问题是,有不止一种合理的方法来定义空值的含义(如上面的注释所示),这些不同的含义意味着平等测试等事物的不同语义。没有办法同时满足所有的解释。
- 真正的wtf在SQL中使用==。
- 如果将NULL解释为未知,则与NULL进行比较是有意义的。但SQL对此并不一致。(如果是的话,如果总和为NULL的话,SUM将返回NULL。)
- 真正的WTF是一个事实,即它是有效的SQL,不返回任何内容。这至少应该是一个警告。
- 使用is和is不用于比较空值。
对于那些不知道的人来说,PostScript实际上是一种编程语言。我对它有点疯狂——我写了一个PostScript程序,它将曼德布洛特分形计算到非常高的细节级别。它确实是可打印的PostScript,尽管它会使许多打印驱动程序崩溃…
不管怎样,从何处开始使用PostScript…这里有一个:您实际上可以创建一个标识符为….没有什么。
()cvn 5 def%将数字5分配给…没有什么
PostScript是一种基于堆栈的语言。()将空字符串放入堆栈。cvn将其转换为一个名称(如果打印它,则为"/",因为ps中的所有名称前面都有斜杠)。然后5 def将值5分配给它。(%是注释字符)
你不能直接把它拿回来,例如,如果我说"打印",这不会打印5号。但是你可以间接地得到它:
()cvn load print%这将打印数字5
还有什么。。。PostScript有字典作为本机类型,您可以使用数组引用作为字典的键…但引用才是关键,而不是数组。所以:
/mydict 100听写定义
[0]dup mydict exch 42放置mydict exch get=%打印42
mydict[1]42 put mydict[1]get%引发未定义的错误
编辑:哦,是的,还有一件有趣的事……在ghostscript提示下尝试以下操作:
1
| 1 array dup dup 0 exch put == |
哦!
- 在cp/m中,\x1A将标记"文件结束"…但我无法想象它被用于现代系统。无论如何,python(至少v3)也将其视为文件的结尾。
- 相当多的C编译器仍然认识到这一点。
- 作为文本文件终止符,ctrl+z源于cp/m时代,这也是MS-DOS的基础。出于某种原因,许多应用程序仍然支持这一点。
PHP中的变量
PHP中的一个奇怪特性,允许您从其他变量的内容(警告、未测试的代码)创建和分配变量:
1 2 3 4 5 6
| $a = 'Juliet';
$$a = 'awesome'; // assigns a variable named $Juliet with value 'awesome'
echo '$a'; // prints Juliet
echo '${$a}'; // prints awesome
echo '$Juliet'; // prints awesome |
好吧,假设我们有这样的东西:
1 2 3 4
| $bob = 'I\'m bob';
$joe = 'I\'m joe';
$someVarName = 'bob';
$$someVarName = 'Variable \'bob\' changed'; |
各种间接的娱乐如何?
1 2 3 4 5 6
| $juliet = 'Juliet is awesome!';
$func = 'getVarName'
echo '${$func()}'; // prints 'Juliet is awesome!'
function getVarName() { return 'juliet'; } |
heavily used this is not that,but of syntax c + S"Return to静态参考尺寸阵列:"Weird isP></
1 2 3 4 5 6
| struct SuperFoo {
int (&getFoo() const)[10] {
static int foo[10];
return foo;
}
} |
ofc method can be above,在房屋declared as静态常量P></
- strstr类似于在C中复制其行为,而php的数组是关联存储的。如果不希望索引中断,不要使用unset,而是使用实际的数组函数,如array_splice。
在Ruby中,你可以用Heredocs做一些奇怪的事情。考虑:
1 2 3 4 5 6 7 8 9 10 11 12
| a = <<ONE
This is one. #{<<TWO}
This is two. #{<<THREE}
This is three.
THREE
TWO
ONE
p a # =>"This is one. This is two. This is three.
" |
在C++中,你可以这样做:
1 2
| std::string my_str;
std::string my_str_concat = my_str +"foo"; |
但你不能这样做:
1
| std::string my_str_concat ="foo" + my_str; |
操作员过载通常受到wtf的影响。
在ColdFusion阵列中,从1开始。
- 我不知道任何PHP,但是如果有任何值是真的,这是有意义的,除了false(某些语言的行为方式),0是真的,'any string'是真的。
- @科比:如果测试是这样的话,那么1 == 2也是正确的。测试不是('false' && 0),而是('false' == 0)。PHP就是疯了。
- 好吧,在回答中引用我的话是不公平的,但方向是正确的——多说些话,看看是否有意义,画一幅全图。
换句话说:多重继承。它毫无意义,只会制造麻烦。
我指的是C++中的米河,而不是Java和其他语言中的混音等。
- 你有多少父母?
- 我个人喜欢多重继承,因为它促进了编程风格的混合。我一直很喜欢,但不能再做太多了,因为我主要在.NET中工作:(
- JK,你属于多少个不同的物种?
- 是你讨厌它,还是它的一个特殊实现?我看到我做得很好,我也看到我做得很差。
- 不,这是很明显的邪恶。
- 好吧,那么,您使用过什么MI实现?我向您保证,在某些语言中开发文本冒险是非常好的,在公共Lisp对象系统中也很好。
- @JK-我有两个父母,但没有人依赖于我的眼睛颜色。
- 我使用C++,发现它造成了太多的混乱。当类从mi类派生时,不保证成员顺序。存在太多更好的解决方案。
- @CWAP:成分
- @Dykam:我真的很喜欢构图,我只是错过了C中某种形式的自动接口委托。主要是减少样板代码。
- 澄清JK的意思:如果你把这句话应用到你自己身上,说你有不止一个父母,会发生什么?
- - 1!乔治.爱迪生,另一个吃爪哇市场营销机器的受害者。对不起,请证明你的陈述是正确的。你为什么这么认为?
- 就像我说的,会员订单不能保证。现在,这不是一个必要的问题,而是一个潜在的陷阱,如果不小心。至于JAVA,说我讨厌Mixin远不是事实。我认为Java更好地实现了MI。
- 乔治·爱迪生:这将取决于多重继承是如何定义的。用你的语言可能不管用,但做得好,很甜蜜。
- 我知道。有些语言有,有些没有。我可能应该解决我的问题。
- @你有多少种?除非你是变种人,否则父母就是哈萨人。
- @我有两个父母。我也有很多他们都没有的特点,很多来自一个父母,他们任意地凌驾于另一个父母的基因之上。这就是我们应该如何建模OO继承吗?我们是否应该把它留给编译器来决定继承的成员在几代之间应该如何变异呢?见鬼,也许我们甚至可以发明一种由自然选择驱动的新范式!
- Java从什么时候开始继承的?斯卡拉,是的。
- Andrei Alexandrescu的现代C++设计,你可以看到MI有它的用途。我有点喜欢浅米深思。您的医生不建议您进行深密虚拟继承。
Python的:P></
18.03归来~,which is the between the点距离(10.5)和(25.5%)by the了毕达哥拉斯定理。事实上,因为这能支持本地语言Python has to the form of numbers在复合for example)2 +。since the number of a的绝对值在复合形态BJ=sqrt(of a + a + b平方公尺),我们得到一个距离subtracting while the number from another复合然后apply the function ABS(绝对)过来。P></
- 我真的看到过这个"在野外",自称黑客倾向于喜欢这种奇怪的混淆代码。
- 这个模式实际上是什么意思?- -
- @letsc编译器自动将数字解析为整型文字值,但046和002被解释为八进制数字。八进制2和十进制2是相同的,所以不会引起问题。但是八进制046是十进制38。C约定将以0开头的任何数字解释为八进制。这种有些过时的约定会让编码人员措手不及。
Perl的sub没有真正的参数列表,只有@数组。另外,sub自动展平传递给它的参数。
我不明白为什么这是一个持久的特性;这反映了几年前我作为一个笨蛋在我的TI-86基础版上所做的事情,因为语言的特性还不够。
- 实际上,Visual Studio 2008编译器支持这一点。但不知道他们是怎么做到的。
- 您可以有一个operator+(const char *, std::string)函数,它将允许"foo" + my_str函数。在运算符重载中,至少需要一个用户定义的类型(类、枚举等),但不必是第一个类型。运算符重载通常不是一个好主意,但有时它非常有用。
- 这个答案显然是错误的,你确实可以做你声称不能做的事情。运算符重载通常是明智的。
- 不过,江户十一〔二〕偷了它
在PHP中
1 2 3 4 5
| var_export('false' == 0); // true
var_export('false' == true); // true
var_export('false' == false); // false |
编辑
正如@kobi所提到的,这可能是因为语言将任何值解释为"true",除了"false",但对于php来说则不是这样,因为这里的情况比您想象的更奇怪!
这个例子在PHP手册的"字符串转换为数字"一章中有详细的记录,其中说:
If the string starts with valid
numeric data, this will be the value
used. Otherwise, the value will be 0
(zero).
以下是示例:
1 2 3 4
| print (int) 'zero'; // 0
print (int) 'false'; // 0
// but
print (int) '1 - one'; // 1 |
P.S.我认为这种隐式类型转换比有用性更有害。
- 我曾经写过一个PHP函数,它返回一个引用,除非出现错误,否则它会返回null。但你不能只引用return null;,因为这不是对任何事物的引用。这意味着我必须定义一个变量,将其设置为空并返回它。当然,变量名为$thisIsAStupidFxxxingVariableIHadToDefineBecauseOtherwiseThisFunctionShitsItself&zwnj;&8203;。(是的,这些是我的PHP开发生涯的早期阶段)
- 您不应该将空值作为错误传递,如果返回值同时表示错误或有效结果,那就太糟糕了。
- 我怀疑他现在明白了
- 在这种情况下,我将fxxxing编译器需要的变量命名为"fcrt"。
我最喜欢的C++之一:
1 2 3 4 5 6 7 8
| #include <iostream>
using namespace std;
int main()
{
cout << 3 << 5 << endl;
cout << (3 << 5) << endl;
return 0;
} |
当然,这很容易解释,但它已经开始让学生们抓耳挠腮!
- 可以为此提供样本输出。那些开始编程的学生仍然会抓耳挠腮。对于我们中的其他人来说,当我们记住位移位操作符时,它将是触发手掌到前额的线索。
- 第一行:35第二行:96
红宝石人字拖。"条件语句中的"…"和"…"并不总是范围运算符:
1 2 3 4 5 6 7 8 9 10 11
| (0..20).each do |x|
if ((x%10) == 5)..((x%10) == 5)
print"#{x}"
end
end
(0..20).each do |x|
if ((x%10) == 5)...((x%10) == 5)
print"#{x}"
end
end |
这将输出:
1 2
| 5 15
5 6 7 8 9 10 11 12 13 14 15 |
…在每次传递时检查这两个语句,…在每次传递中只检查"on"或"off"语句(取决于触发器状态)。他们是从awk和sed那里偷来的。
Matz用"Ruby编程语言"编写:"触发器是Ruby的一个相当模糊的特性,最好避免使用…"
在多种语言中交替使用:
1 2 3 4
| boolean b = true;
for(int i = 0; i < 10; i++)
if(b = !b)
print i; |
乍一看:B怎么可能真的不等于自己呢!?这个意外地只会打印奇数
- 您使用的是"="而不是"="。所以B每次都会得到非B的值。如您所说,它将打印奇数(每2个数字一次)
- 如果有一个+=操作符,为什么我们没有呢!也接线员吗????哦,等等。:)
- @fennec我认为你通常只使用二进制运算符进行复杂的赋值,但是++和--是值得注意的反例。
来自任何人?
处理(Orthor.org)是一种基于Java的语言。简单来说,处理编译器是Java预处理器,它将处理特定的语法转换成Java。
由于语言的设计,它有一些惊喜:
处理类被编译成Java内部类,这会引起一些麻烦,比如私有变量并不是真正的私有。
1 2 3 4 5 6 7 8
| class Foo {
private int var = 0; // compiles fine
}
void setup() {
Foo f = new Foo();
print(f.var); // but does not causes compile error
} |
此外,缺少draw()函数会导致不调用事件处理程序:
1 2 3 4
| // void draw() {} // if you forgot to include this
void mousePressed() {
print("this is never called");
} |
在C++中,创建一个受保护的抽象虚拟基础纯虚拟私有析构函数的能力。
这是从受保护的抽象虚拟基继承的纯虚拟私有析构函数。
iow,一个析构函数,只能由类(private)的成员或朋友调用,并在声明它的基类(abstract base)中分配了0(纯虚拟),该析构函数稍后将在派生类中定义/重写,该派生类以受保护的方式共享多个继承的基(virtual base)。
- 您可以在Java中执行同样的操作,即在运行时修补一个被交织的字符串的内容。
- 怎么用?!Java字符串是不可变的。
- ((char[]) String.class.getDeclaredField("value").get("niko"))[3] = 'i'
在俄亥俄州立大学,他们用一种叫做Simult/C++的私生子C++语言来编程。Reals/C++使用契约设计的方法来实现一切。它要求您对编译后的注释中的组件和方法进行数学建模,从而强制您维护方法和对象之间的需求/确保关系。
- 这真的很酷,虽然我不明白为什么他们会如此坚定地坚持C++。有很多其他语言支持契约式设计,有些严格执行:en.wikipedia.org/wiki/design-by-the-contract-language-u支持。也许这只是我,因为我从C++开始,但我不认为它是一个很好的语言教学。
s a="a="a",@a="2n",a="c="("22"?@a),@a",@a,a="a",a(c)"s+",e=$t(@@a@(c))",@a
这是cos(cache-objectscript)中一个很好的一行程序。有趣的是这里要注意的是5种不同的代码间接模式*G
Perl可以自动将Base 26转换为Base 10,如果您可以在早晨与自己一起生活…
1 2
| $ perl -E"say lc (@a='a'..'asdf')"
30530 |
- 如果上面不清楚,则true和false分别等于1和0(它们的名称不区分大小写)。真或假、真或假也有效。)
- EDOCX1,0!==…叹息
- 少了分号
Fortran不是一个真正的WTF时刻,而是一个"为什么我需要输入所有这些垃圾时刻"的时刻。
1 2 3
| IF(12 .gt. 11) THEN
// Do some magic
ENDIF |
"gt."让我在玩这门语言的时候有点不知所措,直到我意识到它是">"符号。哦,我多么喜欢不学生物专业,每天都要涉猎这个垃圾。
- 我个人喜欢空白不重要的事实,所以IF(12.GT.11)THEN和I F ( 1 2 . G T . 1 1 ) T H E N是相同的。
- "if(a=1)"导致了多少"c"错误?
- @D.Shawley——这让我想起了Apple Basic,其中任何与关键字匹配的字母序列都被解释为该关键字,并且在令牌之间自动添加空格。这意味着您可以在完全没有空格的情况下编写整个代码行,并且编辑器(如果我可以调用基本命令行编辑器)将为您格式化它。
- FORTRAN早于ASCII和EBCDIC,首先在一台具有6位字符集的计算机上实现。所以你不能指望<和>是可用的,因此需要替代品。Fortran的最新版本确实支持<和>运算符。
- +1表示使用"dabble"一词。
- @D.肖利,什么才是真正的优势,即空白不重要?(没有)
- Fortran也是第一个。为什么其他语言没有遵循它的领导?
在常见的Lisp中,零维数组是奇怪的,而且很自然,它们具有读取语法。
- 或者可能是:2 = 2.5;,然后是if(2 + 2 == 5)。
- 2=1;5=2;5+2=是什么?是3吗?还是2?
- 你记错了。珀尔从来没有这样做过。
- @亚赫尔克,那是2。这个问题出现在语言中,这些语言假设任何左值都是有效的标识符,并且允许您使用相同名称的变量来隐藏类似1的文本。将2和5重命名为x和y,您将看到这是什么样子。x=1;y=x;x+y->2。
在bash中,变量既可以是标量,也可以是数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| $ a=3
$ echo $a
3
$ echo ${a[@]} # treat it like an array
3
$ declare -p a # but it's not
declare -- a="3"
$ a[1]=4 # treat it like an array
$ echo $a # acts like it's scalar
3
$ echo ${a[@]} # but it's not
3 4
$ declare -p a
declare -a a='([0]="3" [1]="4")'
$ a=5 # treat it like a scalar
$ echo $a # acts like it's scalar
5
$ echo ${a[@]} # but it's not
5 4
$ declare -p a
declare -a a='([0]="5" [1]="4")' |
ksh也做同样的事情,但是使用typeset而不是declare。
在zsh中执行此操作时,将得到子字符串分配,而不是数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| $ a=3
$ a[2]=4 # zsh is one-indexed by default
$ echo $a
34
$ a[3]=567
$ echo $a
34567
$ a[3]=9
$ echo $a
34967
$ a[3]=123 # here it overwrites the first character, but inserts the others
$ echo $a
3412367
$ a=(1 2 3)
$ echo $a
1 2 3 # it's an array without needing to use ${a[@]} (but it will work)
$ a[2]=99 # what about assignments?
$ echo $a
1 99 3 |
- 不过,我觉得这对电话不太好…
- +1个用于除纸镇或投掷导弹以外的iPhone的最佳使用
- 我有个应用程序的主意……:)
其余的这些都没有关于惊人的Ruby触发器的操作:
1 2 3 4 5 6 7
| p = proc {|a,b| a..b ?"yes" :"no" }
p[false,false] =>"no"
p[true,false] =>"yes"
p[false,false] =>"yes" # ???
p[false,true] =>"yes"
p[false,false] =>"no" |
是的,程序状态存储在解释器的分析树中。像这样的事情就是为什么要永远制作一个兼容的Ruby实现。但我原谅你,鲁比<3
- 这是很好的观察
- +1为了更好的解释,尽管前面已经提到过这一点(stackoverflow.com/questions/1995113/strangest language feat&zwnj;&8203;ure/&hellip;)。
- 嗯,我认为K&R和Allman等样式适用于用于流控制的括号。用于隐式创建对象的括号是另一种动物。
技术上不是一种语言,而是一种体系结构。
http://www.6502.org/tutorials/6502opcodes.html jmp
6502组件,间接JMP:
Note that there is no carry associated with the indirect jump so:
AN INDIRECT JUMP MUST NEVER USE A
VECTOR BEGINNING ON THE LAST BYTE
OF A PAGE
For example if address $3000 contains $40, $30FF contains $80, and $3100 contains $50, the result of JMP ($30FF) will be a transfer of control to $4080 rather than $5080 as you intended i.e. the 6502 took the low byte of the address from $30FF and the high byte from $3000.
因此,向代码中添加一个字节可能会使您的间接跳转偏离目标。
- +因为它可以是一个WTF,即使我认为这是一件好事。
- 请解释一下0 == true是一件好事。我不是在玩-实际上感兴趣…任何整数的值是否为假?
- 在Ruby中,只有false和nil是假的。我认为它避免了使用一个幻数来表示错误,例如,如果0是一个函数的有效结果,它仍然可以在出错时返回nil,并在if语句中使用。
- 那么0 != nil呢????
- 我认为强制数字为布尔值是wtf-0不应该作为布尔值计算,它应该是类型不匹配。
- 在方案中,0和f是不相交的,只有f是假的。
- @理查德,这不仅仅是数字。在Ruby和Python这样的语言中,所有东西都可以被解释为布尔值。正如斯科特所说,在鲁比,一切都是真的,除了假和零。在Python中还有其他错误的东西,比如(,)和[],但是所有的东西都可以被当作布尔值。不仅仅是数字。
- @matrixfrog、python和ruby是动态类型的语言,所以您可以将任何内容强制转换为布尔值并不奇怪。我想更多的是一种静态类型的语言,比如C(+//y/Ob/s),Java,甚至VB。
- 李察:至少在C语言中(我也认为Java),它已经是一种类型的错配。
- 对于来自C语言世界到Ruby/python的人(像我一样),这是一个wtf;但是对于来自Lisp家族的任何人来说,这是非常自然的:在普通的Lisp中,只有空列表(别名为nil)是"假"的,其他的都是真的。
- @斯科特,我同意避免魔法数字是一件好事。但否定仍然存在。所以在一个打字错误中,你可能会因为这个混乱而得到正确和错误。例如!0是错误的。简而言之,只需使用关键字"真/假"。
- 这是一个很好的特性,如果没有找到字符串或nil或false中的任何搜索返回位置,那么只需编写puts"Found" if"abba".find"ab",而不是puts"Found" unless"abba".find("ab") == nil。
我不相信这个人是不是在这里,JSF的性质:访问。 </P >
在一个JSF UI的时间,你会把财产的价值,一个是从客户端到服务器对象的接口referencing thusly村的信息: </P >
1
| <h:inputText value="#{myObject.property}></h:inputText> |
的事这是Java不支持的特性,所以你有写方法启动与山羊和集为了链接的用户界面对象的"财产"的服务器。 </P >
1 2
| public void setProperty(String property){...}
public String getProperty(){...} |
这是我的第一个混淆的时候学习JSF和静止的跆拳道-值得考虑的信息。即使真的有没有其他的方式做它,直到implements支持Java,C #型置业。 </P >
- 我同意A[0:]和A[42:]应该引起索引错误-但是A[:]和A[:33]样式都有意义,并且可以使用。
- 如果[:33]可以使用,为什么不使用[42:]?看不出有什么区别。(当然,[:]非常有用)
在Lisp中,可以复制一个列表,可以复制一个向量,可以复制一个结构,还可以复制一个CLOS对象…
…但不能复制数组或哈希表。
JCL的条件执行。P></
1
| //STEP02 EXEC PGM=PROG02,COND=(4,GT,STEP01) . |
你allows features this or not to run on the run a步depending回车代码从以前的步骤。那么在好的特征。P></
除了偶of which features for a小转弯出去backwards inside the逻辑。P></
第一步does not run the true if the condition is。P></
4 secondly茶,其实"step01 GT,if the回车尾均值比4大step01 is from"P></
我知道所有的事情,"Do not the means this if the run from step01步回车代码是比4的大。"which is the几乎but not the same as a那么幼稚的解释"Run the step is if 4大的比从step01回车代码"。P></
我只给你看这些东西时认真is about 2.30疯狂夜班下降AM与经营者at the end of the other在线headaches这双ambiguity导致严重。P></
在SQL Server中(至少ms):
这将始终评估为错误:
鉴于:
1 2 3 4 5 6 7 8 9 10 11 12
| DECLARE @int INT
SET @int = 6
IF @int <> NULL
BEGIN
Print '@int is not null'
END
ELSE
BEGIN
Print '@int is evaluating to null'
END |
输出将是:
1
| @int is evaluating to null |
必须写下:
1 2 3
| IF @someint IS NOT NULL
BEGIN
END |
谁把英语专业的学生加入了SQL小组?:)
- +1指第9版的语言。-D
- 他们没有把它改成第九期吗?不管怎样,我真的很喜欢。同样,我也不介意使用标识来划分块。
- "问题9"是指什么?
- @马吕斯看到:code.google.com/p/go/issues/detail?ID=9
我认为这篇文章实际上不是一个"语言特性"(C),我可能在发布它时非常无知,但我不知道为什么会发生这种情况,所以我会问。如果它与一些奇怪的语言特征有关。好吧,它真的让我成为"wtf",所以它值得这个地方。
1 2 3 4 5 6
| int a = 0;
int *p = &a;
printf("%d, %d, %d.
", *p, (*p)++, *p); // Outputs"1, 0, 0.
" on MinGW's GCC 4.4.1 |
为什么?
--编辑
刚拿到,没什么大不了的。我可以感觉到C++大师在嘲笑我。我猜函数参数的计算顺序是未知的,所以编译器可以随意调用它们(我想我已经在Boost文档的某个地方读过了)。在这种情况下,参数语句被向后计算,可能反映了函数的调用约定。
- 我本以为会出现空引用异常。
- @JDK:NullReferenceException是C的事情。这是因为所有的+操作都自动编译为StringBuilder流,这样a+b+c(其中所有变量都是Strings)就变成了new StringBuilder().append(a).append(b).append(c).toString(),正如我们从StringBuilder.append(Object o)的javadoc中看到的,可以通过打印null来处理空值,而不是抛出异常。tl;dr:编译器的魔力和句法糖分。
- @爱斯科:在这里,我认为微软是逐字抄袭太阳:)
- @JDK:不管怎么说,大部分的C都是句法上的糖分。)但是,是的,编译程序的魔法与+连接字符串本身就是一个完整的问题。
在PHP中,以下内容:
1
| <?php $foo = 'abc'; echo"{$foo"; |
是语法错误。
如果你真的想要{,然后是$foo的内容,你就必须使用.:
1
| <?php $foo = 'abc'; echo '{' . $foo; |
- 这被称为"银行家的四舍五入",是相当标准和预期的。始终可以使用Math.Round()方法重载和附加参数来指定其他舍入方式。
- "标准和预期"取决于观众。程序员很少是银行家,但很好地指出正在发生的事情。
- 我认为Math.Round有一个超负荷,它允许您指定是要中点定位还是从零开始。
- 这被称为"银行家的四舍五入",但不仅仅是针对银行家。如果你做过任何统计(或者做过相关的银行业务),你就会知道这种形式的四舍五入有多有用。
这是在一个奇怪的事实和特征,它使得总感如果你想想它,但是给了我一个时刻,然而哇,EL T。 </P >
和C + +(和C #),但不能访问该基地的subclasses和保护成员在审的基地。 </P >
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Base {
protected:
m_fooBar;
};
class Derived: public Base {
public:
void Test(Base& baseInstance) {
m_fooBar=1; //OK
baseInstance.m_fooBar = 1; //Badness
//This, however is OK:
((Derived&)baseInstance).m_fooBar = 1; //OK
}
}; |
- $x=mysql_num_rows($result);提供了超过40亿条查询服务!
subjunctive案例和英语。 </P >
哦,等等,你的意思languages做设计?然后利用(macro)和C预处理器#definemacro()旁路的学院。例如,如果有人有#define free(...),(free)(...)会在自己的free(...)是王牌。 </P >
- 你在编程之前有数学背景吗?
- @埃里克,你说得对:)!
- 如果您愿意,可以用函数语言编写x = x + 1。代码板.org/7n69c5kc
- @但它仍然给人的印象是0=1:。
- +因为当我刚开始的时候,这也让我有点不知所措。
- 几年前我开始编程之前发现这个奇怪的东西…现在我习惯了,我真的很喜欢。
- 一种解释是,这实际上是x''=x'+1,但时间在编程中是隐式的(从源代码的底部到顶部),而它必须在数学中显式。
- 有人知道这是为什么wirth用pascal做了:=赋值操作符吗?
- @格林马特:沃思可能是从阿尔戈尔那里买来的,为了避免上述情况,阿尔戈尔很可能已经买了。
- +我从来没有很好的数学背景,所以这对我来说并不难适应,但我知道情况会怎样。
- …所有的变种…就像PHP中的$x++;或$x.=1;。(不是$x.='1'btw,完全不同的说法!)
- 是的,我强烈希望:=用于赋值,=用于等式检查。
- @大卫,@greenmatt-algol使用了:=,就像bcpl一样。不管出于什么原因,汤普森和/或里奇决定使用=和==表示b,然后使用c。还要注意,使用LET X=X+1所需的旧行号基础。
- 如上所述,可能":"很难/不可能在PDP7和11键盘上键入!
- 是的,我甚至在代数之前学过编程,我完全同意这种句法传统是一个教学问题。f(我认为ocaml)使用<-进行分配,=用于持续声明和平等,我认为这更清楚。Pascal的:=一开始也让我很恼火,直到我试着教初学者C,发现=不平等对他们来说是非常令人沮丧的。
- 嗯,我一点也不觉得奇怪,但在我学习代数之前,我正在编程…事实上,这或许可以解释为什么我在代数课上度过了如此糟糕的一段时光。尽管我在其他方面一直很擅长数学…
红宝石…
1 2 3 4 5 6
| i=true
while(i)
i=false
a=2
end
puts defined?(a) // returns true |
- 不是真正的语言特性,因为它是框架特性。学究,我知道…
- 我称之为框架设计监督-但它绝对是一个WTF
- 它与C 4.0一起工作,因为有了新的协变和逆变特性。
- 因为接口差异和协同差异在框架4之前没有出现,并且它没有采用1行代码。是的,这感觉应该是可行的,但如果你仔细想想,它完全有道理,默认情况下不会这样。
- @丹尼斯:你自己试试。这一行代码确实解决了这个特殊的例子,因为它基本上是在模仿协方差(或者说逆方差,我永远不知道哪一行是协方差)。
- 微软没有在.NET 2.0中做过,因为它要求你每次使用AddRange
()时都要指定通用参数。只有引入了类型推断(与.NET 3.5一起),您才能省略类型参数,因此不再考虑语法问题。但到那时已经太晚了。不过,这是个巧妙的把戏。
- @allon:不,这不使用类型推断,因此已经在3.5之前工作过了。
逆波兰符号(RPN)。这意味着参数在函数之前。或者,换言之,您可以通过编写2 2 +来添加2和2。
具有wtf的语言包括forth、postscript(是的,激光打印机)和factor。
- +一个在场的人。考虑到过多的袖口答案,有人惊讶C C不能像C++那样工作,所以这个答案是令人耳目一新的。
- +一个勇敢地提到口齿不清的人。
- 人口齿不清,语法不通,真糟糕…
- @Biosci3c——它让我有点惊讶和高兴,因为我还没有看到任何Lisp条目。也许这意味着它没有太多意想不到的行为。
Perl的core::open和标准库,其对象定向元素被过程接口屏蔽:open ( my $fh, '>', 'foobar' );open是对my()返回的引用进行操作的构造函数,它接受参数">"和"foobar"。而且,作为一个幸运的typeglob对象(也就是说它不能在对象内保持状态)。
关于我的Perlmonks post io::file vs core::open here:http://www.perlmonks.org/?NoDyIID=763565
- cmccullo,这是有记录的特征,没什么奇怪的;)
- 是的,我想很多这些都被记录了…也许不是。在我看来,这仍然是一个奇怪的语言特征。
- 这里真正的wtf是参数不是数组。
- 对于允许可变长度参数似乎是典型的。有点像php的func_get_args()函数,但实际上您必须输入$arguments = func_get_args();。如果你真的不喜欢把函数声明和参数混在一起,让那些重用你代码的人讨厌你,你可以这样做:function do_something() {list($var1, $var2, $var3) = func_get_args();}。
- @CMCCullo:希望所有这些都能在某个地方记录下来,至少在官方语言规范中是这样。
- @安德烈·什切金:我不确定你说的是这里的世贸组织。传递给函数的参数存储在一个数组的幕后。这很好,因为在JavaScript中,数组只是一个数字表示的项集合(不管它们的类型是什么,如果您需要,它们都可以是不同的类型)。数组"arguments"只是按传递的顺序保存对传入的每个参数的引用。它真的很聪明,很有道理。这并不妨碍您声明您的函数将接受的参数,而是仅仅是工具箱的另一个工具。
- @cmccullo我的意思是参数不使用数组原型(所以它们没有任何可用于数组的内置或扩展方法)。
- @安德烈·什切金:啊哈!我错了。它们不是作为数组存储在幕后的,它们只是一个普通的普通对象。编辑了答案以反映这一点。我从来没有意识到这一点,是的,奇怪的是,他们把参数变成一个数字指示对象,而不是一个完整的数组…谢谢你指出这一点!
几年前我使用的Fortran编译器有一个有趣的特性:(a)数字首先存储在高位字节;(b)数字通过地址传递给子例程;(c)没有编译时长度检查。
所以你可以写一个这样的程序:(对不起,如果我把语法搞乱了。我很久没写过Fortran了。)
1 2 3 4 5 6 7 8 9
| INTEGER*2 FUNCTION TIMESTWO (INTEGER*2 N)
RETURN N*2
... THEN CALL THIS SOMEWHERE WITH A LONG INTEGER ...
INTEGER*4 I, J
I=42
J=TIMESTWO(I) |
j的最终值是…零!
为什么?因为传入值是4个字节,但被调用函数只查看前两个字节。因为前两个是零,所以它将零加倍并返回它。然后将返回值转换回四个字节。
当我第一次遇到它时,这是非常神秘的。我传递给某些函数的几乎每个数字都被解释为零!
- 真正的世界跆拳道…那么我们应该如何指定a=b+c…我们应该写A=(B+C)
很小的事情,这是我在annoyed COBOL,那里是没有于取模运算。你可以做的,而不是一个师,你只想specifying全数字结果和伟大的《A进入不同的变量。 由于COBOL冰非常敏感,当它是对变量的均值,你那端和一个可变的DPS,你不真的需要的实际结果,即部分。这是一次秘密的故事》中的"useless名叫A变",那是"最适当的名称是可以的。 </P >
- 为了继续解析,编译器必须假设一些未定义的符号。对于未声明的函数,最合理的猜测是使用未指定参数返回int。
- 我同意解析器在解析时假设的那样,但是稍后,当所有符号都被解析时,它应该会导致一个错误,而不是通过完整的编译管道传播。
- 啊,"后一步"是有趣的地方——原来的C编译器是一个单通程序。参见代码,输出组件。这就是为什么所有函数都假定接受使用的任何参数,并在k&r c中返回int,除非编译器另有说明。不用说,iso c原型是一个巨大的可靠性改进,代价是迫使编译器变得更聪明,假设更少。
- -在海湾合作委员会,不是吗?这应该能帮你解决一些问题…
有点奇怪——vbscript有一个Null关键字和一个Nothing关键字(Null缺少数据,Nothing缺少对象)。为什么不只用一个关键词…?大多数其他语言似乎对一种语言很好!
当然,VisualBasic6.0和"Classic ASP"代码(因为它使用vbscript)具有相同的商业性。在VisualBasic的新旧版本中,我们也有DBNull。
然而,情况正在改善,就像在Visual Basic.NET中一样,Null最终消失了,因此Null未使用,只使用Nothing和DBNull。
- F90+也有这个"特性",但是您可以用IMPLICIT NONE语句来抑制它。另外,隐式类型也适用于函数名;我花了一个特别不愉快的晚上,试图弄明白为什么我为数值方法课程编写的INTEGRATE函数总是返回0。
- 感谢您对F90+和函数名的评论。我知道IMPLICIT NONE,希望Fortran社区的每个人都知道他们应该使用它。
- 上帝是真实的,除非声明为整数。
- 很好的引言,亚当。
- IMPLICIT NONE也被移植到许多Fortran 77编译器中。
- 这让我不寒而栗——在不改变程序语义的情况下重命名字母数字变量名的能力在我心中根深蒂固。对于我来说,这就意味着未声明的变量是否为整数,取决于当前行号是否可被7整除。
- 是的,从那以后我们在编程语言方面取得了长足的进步。尽管我认识一些喜欢用FORTRAN编程的人:在科学编程界,它仍然很常见。
- 我相信,fortran是当今最古老的通用语言,早于algol(仍然存在于pascal、lisp和cobol等重命名的后代中)。后来的版本试图减少奇怪的数量,但当您想要向后兼容时,这是很困难的。
- Fortran是目前仍在使用的第一种编译语言,它总是用第一个字符来定义变量。D为双精度实数*8,I、J、K、L、M、N为整数(*2或*4),其余为实数*4
- 戴夫:是的。当隐式声明和令牌连接最终隐藏bug时,就会出现问题。
- Fortran忽略所有空白!DO10I=1.10和D O 1 0 I = 1 . 1 0的处理方法相同!
- 我认为你和编译器最好在处理(昂贵的)太空任务时就代码应该做什么达成一致:—)
- 听起来好像是谁设计的语言是一个ID 10 T。
- @戴夫:哪个编译器隐式地将以d双精度开头的变量生成?这不在任何Fortran标准中。我怀疑它是编译器的非标准扩展。
- 同意——肯定是非标准的,但是因为我在20多个不同的平台上工作过,有些平台上有多种版本的Fortran,我不记得了。我的大部分工作都是在12月的PDP-11S上进行的,这与标准非常接近。
回想起来,Fortran的计算goto非常奇怪。维基百科告诉了我一些超越它的基本知识。
另一个最受欢迎的是algol 60的按名称调用参数传递。
- 先生,您一定很老了。
- 但不像Fortran那么古老。
- 我最难忘的一次调试经历涉及到一个基本程序,其中大量地散布了计算goto。最后,我重新编写了整个程序。
移位;
有时,您会在Perl方法的第一行看到它来读取自指针。
- 真的。太疯狂了。有用吗?还是只是疼痛?
- 嗯,我从来没有遇到过任何重新定义数字的程序——仅仅因为它是可能的并不意味着这是一个好主意,毕竟。不过,有些单词以数字开头,比如0BRANCH。至于接管解析器,这是很常见的,因为该语言非常倾向于构建DSL。
- 我试着回想80年代中期的时候,我用过了。你用定义来理解语言。因为它就在自制电脑俱乐部的时间和地点附近,所以有一些真正的字符和福斯以及配套的电脑,如Z80S100总线。后来,在阿塔里2600号和64号准将的6502次会议上,有了另一个选择——现在的孩子们不知道总的可寻址RAM是64K,就是这样!
在javascript中,2.0 - 1.1 = 0.8999999999999999。这是在规范中实现浮动的结果,所以它总是这样。
- 这是众所周知的行为,几乎每种语言都是如此。
- docs.sun.com/source/806-3568/ncg_goldberg.html文件
- 不正确,在Java 2.01.1==0.9中是正确的。但在javascript 2.0-1.1中,==0.9是错误的。
- @泽基:如果你使用float,你得到0.9;如果你使用double,你得到0.899999999999999。由于EDCOX1 6是Java的默认浮点类型和浮点在实践中很少使用,所以很安全地说,这也确实发生在Java中。
- @斯莱克斯:不是每一种语言。只有那些使用了IEEE浮点的…
- @配置器:与什么相反?有没有其他语言没有?
- @slaks:使用定点小数或有理数的语言。例如,SQL使用固定点,而Lisp的一些实现使用理性(并将使用0.9或9/10对此查询作出答复)。
- 我不知道,谢谢!
在Python中,至少对我来说,这是非常棒的!我第一次看到它的时候:
1 2
| >>>"ja" * 5
'ja ja ja ja ja ' |
你可以增加字符串!世界跆拳道联盟??
附:我认为这是因为x * n的意思是:n times x所以,5 times"ja"是"ja""ja""ja""ja""ja"并且因为可以像这样连接字符串:
1 2
| >>>"ja""ja""ja""ja""ja"
'ja ja ja ja ja ' |
两个代码有相同的结果(可能是相同的)
- 我爱APL。啊,花了整整一个下午写半行代码的乐趣!当我得到一个可以编程显示哪些字母的键盘时,我要做的第一件事就是用APL重新获取自己。
- 丹尼尔-为什么?!
- 是的,但是如果你的工作效率是由每天的代码行来衡量的,这会让你看起来像一个糟糕的程序员!
- 看起来像是希腊人的语言。
- 我喜欢这样,埃斯科。是的,里面有很多古怪的希腊字母。
- APL是一种终末期疾病。(安农?)
- @埃里克:在编写代码时,你会感到很高兴,这仅仅是关于你想要什么,而不是关于如何到达那里。将代码表示为单个表达式。就像终极完美的卡塔纳式剪裁。当然,在真正的战斗中,我宁愿有枪。
- @杰伊:生产力是由代码行来评定的,就像飞机设计中生产力是由重量来评定的一样!
- 哇,为什么不给高尔夫球手编密码呢?
- 是的,就像一个洞!我喜欢高尔夫和编程,如果我能一杆完成…无论如何,为什么不……除了当你在其中一个洞里钻了个洞,你应该给你所有的朋友买一杯饮料(而不是另一种方式)。
- @丹尼尔:你花了一整个下午来写一行代码…读一整周的代码。;-)
- APL的设计是写的,而不是读的。
- 在科幻动作片里看APL真是太棒了。我可以想象有人坐在三色终端上喃喃自语:"改变敌人的导弹矢量……转置……π乘以对数……升级——然后——执行!"接着是爆炸声和欢呼声。
- @丹尼尔·C·索布拉尔·埃多克斯(Daniel C.Sobral EDOCX1)(3)已经存在了。
我一直想知道这个函数在Java核心库的数学类中的用途:
1
| static double expm1(double x); // Returns e^x - 1. |
- E^X-1在统计中有点多。
- 也许吧,但是你可以用exp(x)-1代替expm1(x),它甚至没有更多的字母。
- 您应该尝试使用另一个很酷的特性javadoc。对于x 0附近的值,ExpM1(x)+ 1的精确和比EXP(x)更接近真实的结果:"java. Sun.com/JavaSe/ 6 /DOCS/API/Java/Lang//Helip;
- (2^32-1)可能溢出一个32位的无符号中间值,但在这种情况下,可以编写一个函数来执行正确的操作。
- e^x-1是一个函数,在物理和工程中经常出现,而且x也经常很小。在这种情况下,明显的math.exp(x)-1.0非常不精确。对于small x,使用y的math.exp(x)得到1.0000000yyyy…期望的结果。如你所见,领先的1.0只会浪费准确性。
呼叫/抄送。call/cc将表示程序其余部分的函数传递给它的主体。
Smalltalk:
在类测试中有一个类方法,它返回一个常量字符串:
您应该期望这个方法不断地返回字符串"niko",不管发生什么。但事实并非如此。
(将S设置为"Niko"。)
(将S设置为"NIKI"。)
(再次将S设置为"Niki"。)
因此,发生的情况是,第二行代码永久性地更改了method1,返回"niki"而不是"niko",即使该方法的源代码没有更新。
- 它不是一个WTF,它非常有用(也是合乎逻辑的)。
- 可能有用,逻辑上很难。
- 为什么?因为它不完全像C或PHP?
- @里科:完全合乎逻辑。
- 我觉得很干净。但这是个惊喜。说真的,在我了解到这一点之前,我已经用JavaScript编写了6年。这就是我贴出来的原因。真是个惊喜。
- Lua也会这么做。
- 如果您在设计时知道您要的是什么数据成员,但仍然允许使用数组语法进行动态访问,那么它会使语法更好一些。
- 真正奇怪的是,您可以使用数组语法来表示关键字,但不能使用点表示法:a["if"]有效,但a.if无效。这在ecmascript 5中得到了修复。你也可以这样做:a["foo.bar.qux"]和a.foo.bar.qux不一样。实际上,对象键可以是任何有效字符串:a["_%foo@@*(bar)"]。
在Java的声明和标记连续打破。P></
they allow to break out of You多重调控与单-块打破。P></
- 我能解释一下吗?
- 原因很简单:在haskell中(和大多数其他语言一样),您可以简单地在本地重新定义函数(haskell对运算符的处理方式与"普通"函数完全相同),这样就可以隐藏外部运算符。之后,他只是将模式与值2和2进行匹配,就像在Haskell中一样。例如,let 2 + 2 = 5 in 2 + 3将产生模式匹配失败。
- 与let (+) = \2 2 -> 5 in (+) 2 2相同
- 它也适用于f:let (+) 2 2 = 5 in 2 + 2。
我不知道它是否仍然是真的,但是我们偶然发现vs fortran(66或77)不支持递归。递归是意外的,我们的默认f77非常支持它,但是当我们把源代码放到ibm-whatta混乱的地方时。
- TMS2810 DSP从闪存执行时不能修改闪存控制寄存器。ti将寄存器集函数复制到RAM,然后调用它初始化这些寄存器。他们在一个叫做"ramfuncs"的区域保留空间。我创建了一个局部变量数组,并复制了函数来执行它。这样我就不用担心函数在RAM中的位置了——它只占用堆栈空间,直到调用函数返回。假设您的wtf()将wtf2()复制到buf[]中并调用它。在那种情况下,它非常有用。
- 这就是为什么我们有"pragma warning(disable:xxx)"。因此,在某些特殊情况下,我们可以忽略其他有用的警告。
- 试图读取未初始化的内存会产生随机结果,即11点的胶片。
- 我有个教授认为这是正确的。返回未初始化的内存部分和返回的堆栈值部分。我不骗你。
在C语言中,a[b]与c[b[a]]完全相同。
- 它是做什么的?
- 这有什么奇怪的?那不只是(function is a function) is false吗?
- 对象引用不匹配,没有什么奇怪的
- 每次执行{}时,都会创建一个新的对象指针。两个新的对象指针不相同,因为它们不在同一位置。
- 不奇怪,就像Python中的( object() == object() ) == False
- @esko-函数是对象,对象不是函数。
- @代码:当我理解你说的话时,这句话怎么适用于这个"怪事"?毕竟,这基本上不是关于元素标识的,而且对于所有编程语言来说都是通用的——除非有特殊的规则规定,否则x不是x。
- @德兰·阿扎巴尼:绝对不是,你把对象和引用搞得一团糟。{}不是指针。它是一个新的空对象,可以通过一个常规引用变量来引用。此外,指针在任何语言中都可以是"相同的",并且可以多次指向相同的对象。
- 但是,如果我这样做:a = {}; b = a;,我们实际上设置了一个指针,因为它们指向同一个对象,而不是一个副本。通过设置a.c并确保b.c也已设置,来进行尝试。
- @德拉恩·阿扎巴尼:我说过复制吗?我认为你受到C/C++的启发。术语pointer不适用于js,因为可以说是引用。所有的JavaScript对象都是通过引用传递的——一个隐含在C++术语中的指针。你说过,每次你创建一个新的对象指针。这不是真的,因为您可以编写例如function(){/*NO REF*/new CustomObject();}(我选择了customObject,因为它的构造函数可以显示某些内容,但JS优化器可能会发出一个简单的命令),其中一个新创建的对象根本不被引用。
在# has called"特征的C扩展的方法",which are roughly analogous to Ruby插件组合的本质,You can add a method to any existing class定义(预审文件oould for You",逆向(字符串)"如果你是知道的倾向)。that is the"Weird光环结束部分is that"You can add方法,这些方法的扩展,与身体的一切,to an interface。在一个方面,this can be as a Way to add a方便单身method to a Whole of which是T类swath part of the same继承树。on the other,增了你所有的方法fleshed to,of an非常本质通过定义的接口。P></
我在试图找出一个完全没有意义但仍然有效的宏时遇到了这个问题。这对于objective-c是正确的,但对于其他类型的c(或者至少是gcc编译器)也可能是正确的。
1
| NSString *oneString = @"This" @"is" @"just" @"one" @"normal" @" string"; |
等于
1
| NSString *oneString = @"This is just one normal string"; |
对于C样式的字符串也是如此
1
| char* str ="this""also""works"; |
- 我假设这个例子什么也没做?如果你能用这种句法写一个叉形炸弹,就可以得到加分。
还有哈斯克尔:
在haskell中,您可以处理任意大小的文件,就好像它是一个简单的String。如果实际使用了字符串,则只能读取该文件。由于haskell令人难以置信的懒惰,不管文件大小,这样的程序都将在恒定的空间中运行:
1 2 3 4
| main = interact (>>= \x -> if x == '
' then"
" else [x]) |
(此程序将文件从stdin转换为stdout,并用crlf替换lf,interact函数输入将整个stdin转换为函数,并将输出移动到stdout。)
这种懒惰也可能导致问题,因为如果关闭文件句柄,就不能完全舒尔,不管lazy haskell是否已经解析了其中的所有数据。
- 很有名,但还是很酷。
- 此外,增加"z"表示"aa"。
除了其他的尝试,
1 2 3 4
| try: pass
except: pass
else: pass
finally: pass |
如果没有其他的例外是计数executed is the part。P></
让意识在第一,但我真的没有任何线索它does。P></
实例:P></
1 2 3 4 5 6 7
| def show_square(string):
try:
n = int(string, 10)
except ValueError:
print"I can't do that, Dave."
else:
print n * n |
在awk中,数组从索引1开始,这至少让人困惑。
- 真正奇怪的是:不知何故你永远不会错过。
- Perl也。有一些解决办法,但它们都比较冗长,不太清楚。
- 实际上,Perl确实与switch一起提供(perldoc.perl.org/switch.html)。然而,这是一个"源过滤器",在5.10中添加了新的给定/何时(从perl6中借用)语句(perldoc.perl.org/5.10.0/perlsyn.html switch语句)
- Lua也没有…
- 您可以有一个条件字典:每个键都是一个文本,每个值都是一个lambda,如果输入值等于键,则执行其lambda并中断。
进入统一, </P >
1
| GameObject.Find("MyObject") |
你normally将返回的对象。然而,如果你像这样: </P >
1 2 3 4 5 6
| GameObject.Find("MyObject").active = false;
//do other stuff
if (GameObject.Find("MyObject").active)
{
//do stuff
} |
然后你会得到一个空的参考。进入统一的iPhone,这个代码会经常没有精细的工作,但会造成SIGBUS当从iPhone上运行。的问题,这是gameobject.find(只读)会主动对象的地理定位,所以即使是如果你再看如果它检测到的主动,你是effectively呼if(null.active)。 </P >
要使它工作,好了,好了,你有伟大的计算机到计算机的不活动的前期制作。 </P >
1 2 3 4 5 6 7
| GameObject obj = GameObject.Find("MyObject");
obj.active = false;
//do other stuff
if (obj.active)
{
//do stuff
} |
是的,arguably最好的实践方式,但不管怎样,统一treats不活动的对象一般的冰quite怪异。它appears卸载到一大份的不活动的对象(textures等),但不是所有的信息,所以不活动的对象可以静静地吃上很多内存。 </P >
- 好消息是,你还没有遇到过强制执行int的~~a。
- 好吧,你可以用+a做int,这也比较短。
- 在C、C++、Perl、Tcl中也是如此。wtf应该是:什么语言不能做到这一点?(我认为一种语言有正确的真和假类型/对象)
- javascript有正确的真/假对象。另一方面,Perl没有,所以!!在Perl中没有那么有用。
- @安德烈·什切金:+A不做智力强迫,它只做数字合作。
珀尔
1 2
| my %h1 = map { $_ => 1 } qw/foo bar baz/; // construct an 'is_member' type lookup table
my %h2 = map {"$_" => 1 } qw/foo bar baz/; |
第二行是一个语法错误,即使对于一个有经验的Perl程序员来说,它看起来是相同的。Perl的缺点总是试图做到你想做的,而不是你说的。
- 我怀念C中的这个功能。如果您有一个需要包装的长字符串,这非常有用——您不需要记住添加显式连接。
- 实际上,在我做了一些事情之后,我意识到我一直在使用这个特性来处理长字符串,我从来没有在同一行中尝试过它,当它在同一行中时,它看起来很奇怪。
很久以前,我用but子句构建了一种语言。
在国外,J(!:)是各种函数的捆绑在一起。我的论点是一个类,在为右是经常(但不总是)为不同的增量值。的东西。例如: </P >
1 2 3 4 5
| 2!:55 NB. Close console
9!:10 NB. Set print precision
6!:0 NB. Actual time
6!:2 NB. Execution time
4!:3 NB. Loaded scripts |
大学课程,"聪明的事情对他们的冰包,但一些你刚刚提交到存储器。BTW,所有的这些问题,来考虑它,三元,与2的论点和一个右到左。没有人会在杂志的工作除非你给他们最终有效的论点。 </P >
- with块是怎样的一个奇怪的特性?用于设置数据类的许多属性。
- 我同意,这很方便。我想我的意思是"奇怪",因为它是独一无二的。javascript有一个with()块,但它实际上并不工作(或者工作得不好)。
- 一个独特的特征并不一定奇怪……我希望C和其他语言也有这个特性。
- VB6也有。
在PHP中,您必须显式地引用全局变量,并对类变量显式地使用这个->。使重构变得有趣。在未找到所有使用点的情况下,无法将变量/参数提升为全局成员或类成员。
- 呵呵?什么是奇怪的?
- "奇怪"是tcl从字符串中解析变量的方式,我猜是…,但脚本语言不常见吗?
- 我同意科尔多拉斯的观点,对我来说并不奇怪。
- 同意,这是脚本语言所期望的。
TCL在解释器中虚拟化时间感非常奇怪:网址:http://www.tcl.tk/cgi-bin/tct/tip/233.html
基本上,它允许您让解释器使用一些其他的时间数据源,例如,首先在模拟器中运行硬件测试,而不是稍后只替换计时器函数,并针对实际情况运行相同的测试。
Go的伪常量iota:
1 2 3 4 5
| type ByteSize float64
const (
_ = iota; // ignore first value by assigning to blank identifier
KB ByteSize = 1<<(10*iota); MB; GB; TB; PB; YB;
) |
在J,最primitives(又名函数)是一元(一个参数)或式(双的论点,一左一右,to the)。但amend基元以3(我认为这唯一的一站,此外外国人)。它的understandable,它会把3,但它只是看起来…………………实习的第一个错误。 </P >
1 2
| vector =: i. 10 NB. Vector will be 0 1 2 3 4 5 6 7 8 9
(10) (0) } vector NB. Will yield 10 1 2 3 4 5 6 7 8 9 |
- 是否将其视为某种浮点值?
- 是的,我想是的,如果你再加一些1111,会更明显。
- ecmascript中的所有数字都是Nubmbers,这是一个IEEE浮点。
这让我很震惊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #define _ -F<00||--F-OO--;
int F=00,OO=00;main(){F_OO();printf("%1.3f
",4.*-F/OO/OO);}F_OO()
{
_-_-_-_
_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_
_-_-_-_
} |
- 我觉得这非常酷和有用,不是真正的"奇怪"。
- 我同意这是有用的。这对我来说很奇怪,因为这是出乎意料的,考虑到我多年来的编码历史中的语法错误,我从来没有想过这些是有效的。
- 我不知道是给你投赞成票,还是给你投反对票,让你加入一些并不奇怪的东西。
- 我总是用逗号结尾。这样,就可以轻松地在中间或末尾添加/删除/注释一个枚举值。
- 使用脚本生成列表时非常有用。它消除了删除尾随逗号的麻烦。
- 并不奇怪。奇怪的是,Internet Explorer坚持在遇到尾随逗号时生成错误或彻底崩溃(所有其他的javascript解释程序都能容忍尾随逗号)。
- 回复:我想我的评论是,"你用上面的语言之一编写代码有多少年了,而且不知道后面的逗号特征存在?"对我来说,只是凡人,很容易就有15年了。我认为使用某个东西已经15年了,突然发现一个你可能从未想到过的新特性,在语法上是有效的,这可以说是"令人惊讶的"。
- 我同意,鲁伊姆,我不知道这一点,我觉得很惊讶。
C预处理器及其用法。特别是预处理器元编程和使用预处理器生成可移植代码——total mindfcuk。
哈斯克尔使用了Maybe和Just。Maybe a是返回Just a类型的类型构造函数,但Maybe Int不只接受Int类型,它要求它是Just Int或Nothing类型。所以在本质上,用haskell的话说,Just Int和苹果是橙色差不多。唯一的连接是Just 5返回一个Maybe Interger类型,它可以用函数Just和整数参数构造。这很有道理,但理论上解释起来也很难,哈斯克尔的目的是什么?江户十一〔7〕真的是江户十一〔19〕年,江户十一〔6〕真的是江户二十一〔21〕年,又是江户一〔21〕年。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| -- Create a function that returns a Maybe Int, and return a 5, which know is definitly Int'able
> let x :: Maybe Int; x = 5;
<interactive>:1:24:
No instance for (Num (Maybe Int))
arising from the literal `5' at <interactive>:1:24
Possible fix: add an instance declaration for (Num (Maybe Int))
In the expression: 5
In the definition of `x': x = 5
> Just 5
Just 5
it :: Maybe Integer
-- Create a function x which takes an Int
> let x :: Int -> Int; x _ = 0;
x :: Int -> Int
-- Try to give it a Just Int
> x $ Just 5
<interactive>:1:4:
Couldn't match expected type `Int' against inferred type `Maybe t'
In the second argument of `($)', namely `Just 5'
In the expression: x $ Just 5
In the definition of `it': it = x $ Just 5 |
祝你读完这本书好运,我希望它是对的。
- 这在NaN的定义中,在任何使用IEE浮点的语言中都应该是正确的。如果值不是数字,则不能等于任何值。
- 不管背后的原因是什么,当我看到if (x!=x) ...时,我的第一个想法是"wtf",所以我会说它符合这个主题:)顺便说一句,Eclipse编译器同意这是一个wtf——它为它生成一个警告。
- 绝对是一个奇数值和WTF值
C中的"动态"。
对于必须与rad或python受害者一起工作的所有人来说,这一天都会被破坏,因为intellisense、类型安全和确定性会在第一次使用"dynamic"关键字时立即消失。
这里是一个关于Python。 </P >
1 2 3 4 5 6 7
| >>> print 07
7
>>> print 08
File"<stdin>", line 1
print 08
^
SyntaxError: invalid token |
不是,但美吗? </P >
当你把especially unthoughtful人如何写日期,它有以下效果: </P >
1 2
| datetime.date(2010,02,07) # ok
datetime.date(2010,02,08) # error! |
一个原因是,0x是interpreted作为octal,print 010prints 8!) </P >
Ruby中的隐含变量常量和可变常量
- +1,我想说这是Python的主要WTF
- 要成为一个主要的世界贸易基金会,它必须是一些常见的问题。
- @罗杰·帕特:每一个单独的Python程序员都会在某个时刻被它咬到,之后他们必须不断地将它记在心里。这正是语言gotcha的组成部分(ferg.org/projects/python-gotchas.html contents_item_6)。
- 你不能这样做。你必须接受l.append(1); return l,因为list.append什么也不返回。
- 谢谢克里斯,修好了。
- fwiw,你不能散列a。一个元组的每个元素都必须是可散列的,以便您散列它。我之所以提到这一点,是因为散列性是元组等不可变类型的主要原因。
在MySQL中,字符串比较不区分大小写。
1 2 3
| > SELECT * FROM blah WHERE foo = 'BAR';
> SELECT * FROM blah WHERE foo = 'Bar';
> SELECT * FROM blah WHERE foo = 'bAr'; |
都是平等的。不仅它们将匹配任何看起来像"bar"的foo值(例如,如果foo='bar',它将匹配bar、bar、bar等)。
- 它准确地代表了一些利益相关者的商业模式,当他们说了什么,但实际上意味着其他一些事情。多好的特色啊!D
- 如果我看到的话,我会拔出一支猎枪。
- 对于只需要运行一次Label:ALTER Label TO GOTO InitializedLabelInitializedLabel:的静态初始值设定项来说,听起来很有用。
- 我同意@configurator,我认为这里真正的wtf只是goto。
- @configurator——修改goto仍然允许通过原始路径,只有goto标签会继续初始化dlabel。此外,对于许多预处理器使用的静态初始值设定项,COBOL有一个更好的meme——设置一个硬Goto到初始化结束,并在初始化结束之前立即条件跳转到初始化,从而防止执行失败的风险。
- 哦,还有一件事——修改后的goto使编译器或第三方优化器几乎不可能自动优化代码,因此使用它会产生一些意想不到的副作用。
冷融合
结构(AKA Java HASMAP)通过引用传递。
您可能认为其他数据类型的行为类似Java…
数组是按值传递的,wtf!
列表只是一个普通的旧逗号分隔字符串!
- 分号插入是JavaScript中最邪恶的部分之一。
- 在设计语言特性时,你总是会遇到一些问题,假设你的用户大多是白痴。
- 你一定会喜欢的:评论看不见的代码!
- 这就是你所说的有用和有趣!
- 实际上,我有这个问题,作为C开发人员,我把支撑放在了新行中。我花了好几个小时才意识到问题出在哪里。即使我已经解决了这个问题,直到我读到你的答案,我才知道是什么问题!
- 我认为这个答案是假的。第一个和最后一个都是语法错误,至少在火狐中是这样。
- JasonOrendorff:你说得对,因为意外的JSON,它实际上会产生语法错误。我更正了它,并提供了一个例子,它确实会无声地返回未定义的内容。第三个例子确实不适用于Firefox,但它最适用于Chrome。这是一件众所周知的艺术品,不幸的是,它根本不是假的。
- 我现在正在学习javascript,这一个对我来说是一个很大的wtf。分号插入?你开玩笑吧!(+1 BTW)
- 这些被称为JS的坏部分,为了避免这些,每个JavaScript开发人员都应该阅读道格拉斯·克罗克福德的好部分。
- "特色"?我认为这个项目属于"最奇怪的语言错误"。
- Kyralessa:隐式分号插入应该是一种使非程序员更容易使用JavaScript的功能。
- 这不是一个bug,这是一个特性!真的?
- 为什么会有人投这个票?这将发生在任何有重要新行的语言中,例如Ruby和Python。为什么会有人知道换行很重要就生成这个代码?
- NickRetallack:因为,由于JavaScript的C型花括号和分号语法,新行的意义并不明显。
- 这听起来更像是一个文化问题,而不是语言问题。如果人们不认为他们应该使用分号,他们不会感到困惑,因为他们的语句也尽可能用换行符分隔。因为两个语句分隔符是多余的,所以我从不以分号结束行(循环除外,循环需要一个语句)。可能会抱怨Lisp中的括号或Haskell或python中的缩进——这是语法的一部分,而且是设计出来的。
- 我不明白这怎么可能达到它拥有的最高票数。在用JavaScript编程时,试图使用C样式的人只能感到惊讶。我希望人们放弃"首选"风格的概念,使用他们正在编程的语言/项目所固有的风格。
- 我同意最后几条评论。无论如何(在任何语言中)都不应该在行首打开大括号,如果知道行尾的分号是可选的,那么这种行为会变得非常明显。
- 我希望人们不再告诉别人该怎么做。你看,我们都是成年人。
- @Jokepu医生……WTF……真的!!!!
- 如果在用JavaScript编程时不应该使用C样式,那么JavaScript语言设计人员选择C样式语法是相当不正常的。
- @Nick Retallack,@mcv:我觉得让人困惑的是,只有一些新行被当作分号,而其他的则没有。例如,a = myFunc[newline](1)与a = myFunc;(1)不同。在第一种情况下,a等于myFunc(1)返回的值,但在第二种情况下,a等于函数myFunc。
- @MCV:另外,我不同意你在任何语言的行首不使用大括号。这是在大多数C样式语言中使用的一个完全有效的约定,并且(与制表符结合)具有将每个左大括号与匹配的右大括号对齐的优势。此外,一些大学的计算机科学系也有此要求。但是,我同意对于javascript来说这是一个坏主意,特别是因为分号插入。
- 你可能想看面团克罗克福德关于这个的视频,第32分钟:goo.gl/zm5t
- 严格的javascript语法不是一种风格偏好,它是良好的Web开发。编制了C/C++/C/Java语言。javascript不是。每个空间都是另一个字节(两个用于Windows换行符),供用户下载。把它扩展到html/css,它就加起来了。有些DotNetNuke页面有20%的页面重量(不包括图像)来自多余的空白;它们使用4个空格作为制表符的位置。现在越来越多的移动用户以类似调制解调器的速度上网,这促使谷歌增加页面重量/下载时间,作为今年搜索引擎排名的标准——是时候说废话了。
- @Matt:Fair Point,但是我相信现在,在生产环境中,您只会提供由JSmin和Closing工具等工具预处理的javascript,因此原始源代码与实际提供的javascript不太相似。
- 当你试图缩小一个生产环境的代码时(删除CR和额外的空间等,使其变小),这个爆炸的特性确实会把事情搞得一团糟。当然,你可以尝试"修复"你的迷你代码,但wtf!
- @迈克:只适用于幼稚的迷你们。@蒂姆:是的,这是我唯一知道它在哪里断裂的情况。ECMAScript规范(第7.9.2节的最后一个示例)中特别指出了这一点。那应该是这里真正的世贸组织。
有很好的保留identifiers和计划。这是继evaluates 1的表达 </P >
1
| ((lambda (lambda) lambda) (let ((let 1)) let)) |
他是一个音符,有无意思联络数限制在一给定范围:好的定义可能redefine一标识符,用来define identifiers范围内,下面是一个语法错误。 </P >
1
| (begin (define define 1) define) |
- 它与C/C++、Python或任何其他语言中的基转换有什么不同?
- 我不确定我明白,但这是指自动氧化吗?
- 我指的是简单的基本转换函数——比如十六进制到二进制,或者二进制到十进制。Java在整数类中具有这些权限。很高兴在这附近见到葡萄牙的人:D
和Java的,有一些是如何处理这inconsistency作为字符串的= =运算符depending他如何它是constructed。 </P >
1 2 3 4 5 6
| String a ="Hello";
String b ="Hello";
System.out.println(a == b ); // prints true.
String c = new String("Hello");
String d = new String("Hello");
System.out.println(c == d ); // prints false |
foo是什么数据类型?
1 2 3 4 5 6
| SELECT TOP 1
NULL AS foo
INTO
dbo.bar
FROM
sys.columns --trivial |
为什么一切都归零了?
1
| SELECT CAST('' AS int), CAST('' AS datetime), CAST('' AS float) |
……除了这个
1
| SELECT CAST('' AS decimal) |
- 为什么投票否决?
- 如果您了解静态方法的真正含义,这并不奇怪
- 你忘了用吗??!;)
- @果加:是的,但看到什么看起来像空指针引用(尽管我们知道事实上不是这样)是令人惊讶的。
- 实际上,它正在取消对空指针的引用,因此未定义行为。它只是碰巧与取消引用的结果无关,所以程序不会崩溃。此外,一般来说,不保证取消引用NULL会使程序崩溃。
- 在我看来,这种混淆是由这样一个事实引起的,即可以使用指向对象的指针引用静态方法,而不仅仅是使用类名。
- 在某些实现中,可以在空指针上调用非静态方法,前提是该方法可能是静态的(即,不是虚拟的,并且不访问任何实例成员变量)。
- @高加瑞格派对贵宾:)
不久前,当我第一次在我的CS课程中描述C语言时,看到指针的行为方式是非常奇怪的。我们只是编写程序,猜测它会做什么,直到他们得到正确的行为。
在C中,为什么这是不合法的?
1 2 3 4 5
| public class MyClass<T>
where T: Enum
{
} |
如果能够在枚举上添加扩展方法,以及func,其中t将是您要扩展的枚举,这样您就可以在该枚举上得到类型推断,这将是非常酷的。
回复注释:是的,您可以扩展实际的枚举,但区别如下:
您可以这样做:
1 2 3 4
| public static void DoSomethingWithEnum(this Enum e)
{
//do whatever
} |
但是,如果您希望使用与枚举类型相同的方法获取func,该怎么办?
1 2 3 4 5
| public static void DoSomethingWithEnum<T>(this T e, Func<T,bool> func )
where T: Enum
{
//do whatever
} |
这样,您可以这样调用您的方法:
1 2
| DayOfWeek today = DayOfWeek.Monday;
today.DoSomethingWithEnum(e => e != DayOfWeek.Sunday); |
或者类似的。你明白了…那是不可能的,我也不知道为什么…
- 这么多代码,你还是搞错了。;)close()调用最好位于finally节内,以确保在引发异常时也释放文件句柄。
- 够公平的,固定的。有希望地。-)
- 现在它不编译,因为"in"不能被初始化;因此您还需要将其初始化为空并最终签入(还有3行!)除此之外,还应处理close()错误!
- 不要将其初始化为空,最后将资源获取从尝试中取出。
- 我增加了我将如何写它。我把另一个版本留在了里面,因为很难找到正确的答案正是关键所在。
- Perl的while(<>)print;从来没有看起来更好。
- @萨诺尔-安全!!!!
好吧,这第一件事来到我的想法是"noop",我的大脑没有一样东西的时候,我第一次来到在它! </P >
C让步声明,不奇怪,但很有用。
http://msdn.microsoft.com/en-us/library/9k7k7cf0(vs.80).aspx
这并不奇怪,也不令人惊讶,但正是这件事让我总是说:
语法或标识符名称中区分大小写。
大多数拥有它的语言似乎都拥有它,因为C拥有它。没有充分的理由。
- php有一堆语法不一致的垃圾,就像你不能这样做一样,function()[$index]
- 最让我困扰的是字符串插值。您可以插入以$开头的任何变量,但模块不以$开头。
- 字符串还可以用作类名:$ob=new$class name();
- @肯德尔·霍普金斯:你可以定义function elem($array, $key) { return $array[$key]; }来绕过这个问题,然后在没有php抱怨的情况下说elem(someFn(), $index);。我有一个关于这些东西的图书馆:github.com/olliesaunders/fluidics
- 真正的wtf使用"在php中进行函数调用。
- …和#代替//征求意见。
- 您使用的是$'foo'()。
- 天啊!!什么鬼东西?
python的三元运算符
在Python中,C三元运算符(C++示例:EDCOX1〔5〕)可用作句法糖:
1 2 3 4 5 6
| >>> i = 1
>>>"It is positive" if i >= 0 else"It is negative!"
'It is positive'
>>> i = -1
>>>"It is positive" if i >= 0 else"It is negative!"
'It is negative!' |
这并不奇怪,只是一个特征。奇怪的是,与C(条件)中的(imo更符合逻辑)顺序相比,更改的顺序(a if条件,否则b)是什么?答:
在SQL Server中,如果在生产代码中使用select *,最终可能会遇到令人讨厌的意外。不管怎样,使用select *并不被认为是一种好的实践,但是了解一些有趣的行为是很好的。
有关更多详细信息,请参阅sqlserver2005中的问题"从表中选择*与"从表中选择cola、colb等"有趣的行为。
- JScript也有它们(不是关于javascript的Sute)。
在C中,以下代码生成编译器错误"无法从方法组转换为委托"。虽然背后的逻辑是合理的,但我还是觉得很奇怪。
1
| control.BeginInvoke(delegate { DoSomething(); }); |
- 1是令人毛骨悚然的。大声笑
- 我也笑了+1
- 早期的Infocom游戏(文本冒险)也有类似的限制。因此,如果你试图引用一个游戏没有预料到的对象,有时你会得到一个提示,关于一个项目,将在游戏稍后浮出水面。就像:>偷夹克>你在这里看不到一个强大的锤子!
在ColdFusion中,文本值会自动转换为各种数据类型以用于各种目的。我遇到了一个奇怪的问题,"00a"和"000"是相等的。事实证明,ColdFusion将"00a"解释为时间,将其转换为某种数字时间格式,并将其转换为0。000"被转换为0。所以他们都被认为是等价的。那是我学习字符串比较函数的时候。
- 呵呵?当然可以。同样的情况发生在Java中,我在大多数语言中想象:"ABC"。包含("")是真的,也就是"abc"。
- 哎呀!我想我忘了。自从我完成Java代码以来,已经有一段时间了。谢谢你让我直截了当。
- 空集是每个集的子集(不是成员)
一个Java源文件可以结束与角色\u001a(控制)。 </P >
- 嗯,我不认为这是一个特色。编译器应该如何知道差异?
- 它不需要知道区别。但它应该是一个警告,并且只有当"class/struct"名称重复时才会出错。
- 如果你做了System.Exception就可以了。
对于那些从未使用过COBOL的人来说,这是一行常见的代码,但它并不能实现您可能想到的功能。
PIC XXX
- 它是做什么的?
- 嘿,我真是太笨了,从字面上看(pic xxx),原来cobol里全是XXX Pic的。
在PHP中:
1 2 3 4
| <?php
$o = new stdClass;
echo count($o);
?> |
打印1。没弄明白为什么。
- 但是非常有用。IE:尝试查找未实现的代码?ack '\.{3}'
- ACK"尚未实现"更易于维护。
- @伯克斯,如果有人一次说"这还没有实现",但另一次说"还没有实现"。
PHP(又一次)?
第一种:(unset)型铸造。
1 2 3 4
| $a = 1;
$b = (unset)$a;
var_dump($a); // 1
var_dump($b); // NULL |
用法:http://www.php.net/manual/en/language.types.type juggling.php 89637
二是= NULL与unset()功能的区别。
1 2 3 4 5 6 7 8 9 10 11 12
| $c = 10;
$d = &$c;
$c = NULL;
var_dump($c); // NULL
var_dump($d); // NULL
$e = 10;
$f = &$e;
unset($e);
var_dump($e); // NULL
var_dump($f); // 10 - WTF? |
- 你的var_dump在第一个例子中是向后的吗?另外,= NULL和unset之间的区别很有趣,是否有意义?我不想说这是世贸组织。
- 不,这只是一个类型转换,它不会真正取消$A。
- 在第二个例子中,$d引用的是$c的值,因此如果您将$c的值设置为空,那么$d将跟随其后。因为它们指向相同的值。如果你不付E元,F元无论如何都会指向10元。这是因为$F不是指向$E,而是指向$E的值。它写在手册上。但这让人困惑。
- 好的,对不起。我刚意识到我有打字错误,我是说,但这是有道理的。我想我是在打电话:)那个(unset)的演员阵容真的没用。在您链接到的示例中,它真正保存一行的唯一原因是某种独特的情况。
Delphi不关心像"word"这样的类型转换,它将在arr[0..65535]数组外部读取,其中pos=65535:arr[word(pos + 10)]
此C程序在x86与x86-64上打印不同的结果:
1 2 3 4 5 6 7 8 9
| #include <stdio.h>
int main (void)
{
long a = -1;
unsigned b = 1;
printf ("%d
", a > b);
return 0;
} |
α:
1 2
| var a = Double.Parse("10.0", CultureInfo.InvariantCulture); // returns 10
var b = Double.Parse("10,0", CultureInfo.InvariantCulture); // returns 100 |
在不变区域性中,逗号不是小数点符号,而是组分隔符。
正如我所知,对于来自某些地区的初学者来说,这是一个常见的错误。
- 在C语言中,这不是一个奇怪的语言特征;在阿拉伯数字中,这是一个奇怪的语言特征。
在C中,
1 2 3
| int x = 1;
int y = x++ + ++x;
printf("%d", y); |
不明确,打印的内容取决于编译器。编译器可以在计算+X之前或在语句末尾存储X++的新值。
在C++中,我发现"虚拟"MI(多重继承)允许"菱形"类层次结构"工作"是奇怪和令人厌恶的。
1 2 3
| A : Base class, e.g."Object"
B, C: both derive (virtually or not) from Object and
D: derives from both B and C |
问题:"正常"继承导致d是2种不明确的a。"虚拟"mi将b的a和c的a折叠到单个共享基a对象。
所以,即使你的轮子是一个物体,而你的左前轮是一个轮子,而你的车继承了四种轮子,你的车仍然只是一种带有虚拟mi的物体。否则,你的车不是一个物体,而是四个Y轴物体。
这是一个奖励糟糕的类设计、惩罚编译器编写者的语言特性,并让您在运行时怀疑对象到底在哪里——以及是否有任何虚拟MI包放错了位置。
如果您真的需要类层次结构中的菱形模式,可以使用常规的mi和委托给单个a基的"approxy"来完成。
1 2 3 4 5
| A : Base class, e.g."Object"
AProxy: Base class, constructs with other A to bind to
B : derives from A
C : derives from AProxy
D : derives from both B and C (passing B's A to C's AProxy at construction) |
对于那些真正喜欢Diamond Mi的人来说,这需要做更多的工作,让我们的其他人拥有更易于处理的语言特性。
- 这个问题很容易用一个好的IDE来检测,但是在遗留系统中很难检测到…
- 我不明白这有什么奇怪的?
- 或者它是如何成为一个特性的。= P
- @戴卡姆:穿过棉线。@埃里克:多行注释作为C的一个特性是不唯一的。但是,有些语言(如python)不支持多行注释,以避免由该特性引起的这个问题。
- 有人能解释一下问题是什么吗?当然,我会假设i+=1不是在多行注释中执行的(这对我来说不是一个奇怪的概念),但我也模糊地记得一些关于不允许嵌套注释的规则。但是突出显示的语法正是我理解它的方式——多行注释真的是这么大的"wtf"吗?对人?
- @迈克尔·斯图姆:是的,错误终止的多行注释是一个完整的WTF。语法突出显示是一种非常新的技术。它确实有帮助。然而,在语法突出显示的发明之前,我们中的许多人已经进行了几十年的编程。
- 这就是为什么您不使用文本编辑器来完成IDE的工作。
- @布鲁拉贾:当我学习C的时候,IDE还没有被发明出来。说真的。当我学习COBOL时,文字处理器并没有被发明出来。很高兴地说,"工具解决了这个问题"。他们解决不了这个问题。他们把问题暴露得更清楚一点。这个问题仍然存在,在Java等语言中的相关问题仍然在帮助NWBS时引起WTF时刻。
- 我喜欢这里突出显示的代码,这样问题就很清楚了!
- 我过去所依赖的是一个编译器或lint消息(不记得当时是哪个),它将在注释中标记/*作为警告。这是一个值得注意的好警告。
- @大卫·索恩利:如果你有这样的警告,那就太好了。当我没有这样的警告的时候。
- 用指针特别危险:x = *p/*q;。
- 嗯…我不明白,在没有突出显示语法的情况下,是程序员认为它已经关闭了,还是什么?
- @支持-多语言SO。在非语法突出显示编辑器中进行尝试。告诉我你看到了什么。
- 如果我尝试使用// comment... */而不是*/,我的编辑器将显示wtf,因为如果它有评论,关闭评论可以跳过。还有一个很好的。
- @S.lott,我就是这么想的,:)
用Java语言
1 2 3
| String("aaa")==String("aaa") //false
//you need to use
String("aaa").equals(String("aaa")) // true |
- 这是因为小数字是预定义的或缓存的对象。因此,x = 4实际上是对已经存在的数字的引用,而y则是默认情况下要存储的big,因此这两个常量都会创建新的对象。
- @不重要,为什么,还是疯了
- @阿替企鹅:只是不要用is比较这些原始值,你就没事了。
我觉得这很奇怪:
在C/C++中,至少可以在MS C++中拥有尽可能多的分号:
1 2 3 4 5 6
| int main(void)
{
cout<<"Hello World";;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;
return 0;;;;;;;;;;;;;;;;;;;;;;;
} |
- 这是按设计和可配置的
- 这些奇怪的语言特征大多是设计出来的。为什么要指出这一点?
- 如前所述,它是可配置的,而不是开发人员做出的明确决定。使其可配置和选定的默认值没有什么奇怪的。
- 对于SQL Server也是如此
PHP
PHP对实例变量和方法的重载处理不一致。考虑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Foo
{
private $var = 'avalue';
private function doStuff()
{
return"Stuff";
}
public function __get($var)
{
return $this->$var;
}
public function __call($func, array $args = array())
{
return call_user_func_array(array($this, $func), $args);
}
}
$foo = new Foo;
var_dump($foo->var);
var_dump($foo->doStuff()); |
$var工程弃土场。尽管$var是私有的,但是对任何不存在或不可访问的成员调用__get()并返回正确的值。doStuff()的情况并非如此,它失败的原因是:
1
| Fatal error: Call to private method Foo::doStuff() from context"." |
我认为这些语言中有很多是用C语言编写的,但我不确定。
将此处文档作为函数参数传递:
1 2 3 4 5 6 7 8 9 10 11 12
| function foo($message)
{
echo $message ."
";
}
foo(<<<EOF
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc
blandit sem eleifend libero rhoncus iaculis. Nullam eget nisi at
purus vestibulum tristique eu sit amet lorem.
EOF
); |
可以在参数列表中指定变量。
1 2
| foo($message ="Hello");
echo $message; |
这是因为赋值是返回赋值的表达式。这是最常见的C样式错误之一的原因,执行一个分配而不是比较。
Python
在python中,可变的默认函数参数会导致意外的结果:
1 2 3 4 5 6 7 8 9 10 11 12
| def append(thing, collection=[]):
collection.append(thing)
return collection
print append("foo")
# -> ['foo']
print append("bar")
# -> ['foo', 'bar']
print append("baz", [])
# -> ['baz']
print append("quux")
# -> ['foo', 'bar', 'quux'] |
空列表是在函数定义时初始化的,而不是在调用时初始化的,因此对它所做的任何更改都会在函数调用之间持久存在。
MySQL区分大小写
MySQL有非常不寻常的区分大小写规则:表区分大小写,列名-字符串值不:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| mysql> CREATE TEMPORARY TABLE Foo (name varchar(128) NOT NULL);
DESCRIBE foo;
ERROR 1146 (42S02): Table 'foo' doesn't exist
mysql> DESCRIBE Foo;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name | varchar(128) | NO | | NULL | |
+-------+--------------+------+-----+---------+-------+
1 row in set (0.06 sec)
mysql> INSERT INTO Foo (`name`) VALUES ('bar'), ('baz');
Query OK, 2 row affected (0.05 sec)
mysql> SELECT * FROM Foo WHERE name = 'BAR';
+------+
| name |
+------+
| bar |
+------+
1 row in set (0.12 sec)
mysql> SELECT * FROM Foo WHERE name = 'bAr';
+------+
| name |
+------+
| bar |
+------+
1 row in set (0.05 sec) |
- 实际上,实际的存储类型是完全动态的,所以即使您说X列是整数,您仍然可以在其中放入一个blob。
- 真的。关联只是强制值的首选类型。
在C:
1 2 3 4 5 6
| int main() {
int i = 0;
int array[] = {1,2};
return (i[array] + 1 == array[i]);
} |
此程序将返回1(真)。
- 但是,如果它们是只写变量,另一个如何读取它?
- 嗯,为什么投两票?你不觉得这是一个奇怪的语言特征吗?在我看来。RCIX变量是声明它的进程的writeonly–只是编译器检查它的注释。它可以是只读的,也可以是读/写的。当然,它是一个全局变量,在编译单元之间共享。
- 或者内存映射的IO。
不知道它是不是一个特性。对一些人来说,是的,但对其他人来说,这可能是一种令人讨厌的行为。不管怎样,我觉得值得一提。
在Python中,内置函数round()在python 2x和python 3x之间的行为稍有不同。
对于Py 2x,
1 2 3 4 5 6 7 8
| >>> round(0.4)
0.0
>>> round(0.5)
1.0
>>> round(0.51)
1.0
>>> round(1.5)
2.0 |
对于Py 3x,
1 2 3 4 5 6 7 8
| >>> round(0.4)
0
>>> round(0.5)
0
>>> round(0.51)
1
>>> round(1.5)
2 |
我只是不熟悉Py3x中的round()与0的工作方式。
PY 2X和PY 3X中的round()文件。
- 可以使用实际的扩展方法扩展枚举。
- 对于您的特定示例(dayofweek),我将显式扩展dayofweek枚举(this dayofweek e),而不是基本枚举类型。这样就根本不需要泛型类型(或约束)。然后指定一个func—所有的都会很好。
- 这个例子只是一个证明我观点的例子。如果您想创建一些可用于任何枚举的方法,该怎么办?那么呢?
- &zwnj;&8203;-c中的stackoverflow.com/questions/1331739/enum类型约束
- 嘿,我不是唯一的一个-p
- @斯莱克斯:一定要阅读埃里克答案中的评论。事实上,他说CLR不支持它是错误的。它在规范中,并且有一个具有此类约束的库的工作实现(code.google.com/p/unrestrained melody)
任何东西都会自动地将任何类和成员名称复数或奇点化。
例如,Linq to SQL
- C++中的模板和C语言中的泛型也是一样的,尽管我相信下一个(现在可能是现在的?)C版本允许这样做。它不是一个wtf,这是由于编译器不知道模板/泛型参数是协变的还是反变的。
- 我认为Java通过使它的数组协变而破坏了整整一代程序员。
- 使用Java泛型的实际WTF是类型擦除
- 关于Java泛型最糟糕的部分是他们不想麻烦扩展JVM,所以他们只是把它们全部编译成编译器…在我看来,Java中的泛型问题很多。
- @rmeador:是的,C 4在接口类型参数中有协方差和逆方差。但是,由于米奇所显示的问题,江户十一〔六〕不会是其中的一个变化。但江户十一〔七〕是合法的。
- 这有什么奇怪的?首先你说2是非法的,然后你继续证明它也是不安全的。好。。。JAVA的好工作!
在Python中:
打印"1"。行"++i"的计算结果为+(+i)(python不支持递增运算符)
- 应该说:"在许多编程语言……"因为它在C/C++、Perl、PHP、TCL、JavaScript、Ruby、Python中是相同的…我说是C的错。
- 这是第n个重复的"在[插入喜欢或讨厌的语言和八进制文字在这里]010是8"。请删除并改进原始答案。
- 马蒂尼奥说的。@尽管我不得不提到python 3.x删除了它。是的,它不会将前导0解释为八进制(您可以使用"0o"前缀,类似于"0x")。事实上,带前导零的数字是一个错误。
在C中,您可以在接口上使用新的操作符。
- 想解释一下怎么做吗?
- 不能实例化接口。对不起的。
- 您可以在F中创建接口的匿名实现。但是谁会评论呢?
- @帕特里克:看看你如何愚弄编译器/运行时,并让它们实例化一个接口:msmvps.com/blogs/jonskeet/archive/2009/07/07/&hellip;。
- stackoverflow.com/questions/1093536/&hellip;也提供了一个很好的例子。
今天的所有语言:
1
| TypeA a = (TypeA)some_operation_returning_TypeB(1,2,3); // TypeB is not inheriting TypeA |
运行时失败,出现"强制转换为类型A失败异常"-消息(或类似消息)。这告诉我们程序员是多么的懒惰。他们无法生成消息"无法为类型A的变量"a"赋值,值为"some"operation"返回类型B的"u typeb(1,2,3)"。Noooo…他们的座右铭是"犯错误的人必须受苦"。
- 这太奇怪了!为什么有效?
- 它是一元正符号的序列,所以它类似于1++(+(…+(1)…)))
- 这是双倍加上好!
find JavaScript的约会对象的爱的delightful 110年。 尝试它。 </P >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| <Script language ="JavaScript">
<!--
var now = new Date()
var dia = now.getDay()
var mes = now.getMonth()
var fecha
//Day of the week
if(dia==0){
fecha="Domingo,";
}else if(dia==1){
fecha="Lunes,";
}else if(dia==2){
fecha="Martes,";
}else if(dia==3){
fecha="Miércoles,";
}else if(dia==4){
fecha="Jueves,";
}else if(dia==5){
fecha="Viernes,";
}else{
fecha="Sábado,";
}
fecha = fecha + now.getDate() +" de"
//Which month is it?
if(mes==0){
fecha=fecha +"Enero"
}else if(mes==1){
fecha=fecha +"Febrero"
}else if(mes==2){
fecha=fecha +"Marzo"
}else if(mes==3){
fecha=fecha +"Abril"
}else if(mes==4){
fecha=fecha +"Mayo"
}else if(mes==5){
fecha=fecha +"Junio"
}else if(mes==6){
fecha=fecha +"Julio"
}else if(mes==7){
fecha=fecha +"Agosto"
}else if(mes==8){
fecha=fecha +"Septiembre"
}else if(mes==9){
fecha=fecha +"Octubre"
}else if(mes==10){
fecha=fecha +"Noviembre"
}else{
fecha=fecha +"Diciembre"
}
//Year
fecha = fecha +" del" + now.getYear()
document.write(fecha);
//--> |
剧本是在西班牙-对不起,如果你不明白的代码。为你的思想"冰"110到看到结果。 </P >
- 在Perl中处理文件句柄是不可想象的尴尬。它们不是标量值或对象,而是第三类,缺乏良好的语法支持。因此,创建了一组Perl模块,比如IO::Handle,以使它们更加合理——除了这些对象不能在真正的文件句柄所能做到的任何地方工作。很好,程序员不需要经常处理文件。
一般来说,打字不好。
丙:
1 2
| printf("%c
", 'a' + 3); |
PHP:
还有太多的其他语言。
- -1乞求发动一场火焰战争——这是一场激烈辩论,被称为"奇怪的"
- 在C语言中,这对我来说并不奇怪。如果‘3’+3等于6。但是你对PHP的看法是对的。
- 在C语言中,任何单引号中的字母都会给出我们的ASCII码,如果您知道这一点,那么"A"+3不是"wtf",也不是"b"],"d"-"a")/4。
- -1错误地声明C示例是弱类型。在C语言中,常数'a'和3分别是值为97和3的ints,加上它们,生成的int为100,传递给printf()作为参数%c的参数(采用char类型的参数,int很容易转换成),打印"d"(ascii valUE 100)。任何混淆都是由于对C语言的误解造成的。如果"a" + 3在C语言中是这样工作的,那么对于打字来说,这是一个有效的抱怨,但它的作用完全不同。
- PHP是一种为Web设计的无状态语言,所有变量都作为字符串从浏览器中传递,这就是为什么该语言能够为您处理大量类型转换的原因。
- @JCasso:实际上,"3"+3等于"6"。
- @chris lutz:printf()是一个变量函数,这意味着没有什么可以作为char or a short或float传递。这意味着'a'是一个int,3是一个int,'a' + 3是一个int,它作为int传递给%c期望int并作为字符值打印出来。在那个例子中没有任何类型转换。
- 在c中,'a' + 3可以等于,也可以不等于'd'。
- @大卫-我的错是没有检查手册页。%c将int转换为unsigned char进行打印,但它作为int传递(当然,这取决于您的体系结构)。@这是真的,但从实际的角度来看,即使是在EBCDIC的'a' + 3 == 'd'中(在EBCDIC中,您只会遇到'l'和'm'的问题)。
模-2没有elseif或else if;它有elsif。
- 事实上,我希望不是这样。在WTF表上,与Java相比,这是非常小的变化。
- 我喜欢你能定义正确的关联操作符。它是一种类型推断的功能语言。
Java的整数类的基数转换静态方法。:p似乎很少有语言内置了这种功能。
PHP
1 2
| $ php -r '::'
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM |
世界跆拳道联盟?http://en.wikipedia.org/wiki/scope_resolution_operator
为什么不说unexpected T_SCOPE_RESOLUTION_OPERATOR?
- 这是C 4?+char〔15〕
- 同样在Java数据库和生活.com / & Helip;
comefrom是我见过的最奇怪,也可能是最无用的语言特性。
亚军将是三元运算符,因为它违反了优化规则1。它所造成的伤害比解决问题更大。它会造成更大的危害,因为它会降低代码的可读性。
不是真正的语言功能,但有趣/很棒的功能使用是达夫的设备。
- 是否解释三元运算符是如何优化的示例?
- 怎么会是无用的(除了成为国际社会的一部分之外)?你见过穿线的Intercal吗?comefrom用于创建线程。
- 我觉得三元运算符很好。在很多情况下,我认为它清理的东西比它伤害更多。
- 因为这样就省去了你写东西的麻烦。(a是python中的三元运算符,编写三元运算符的任何人都需要更多的内容)
- 三元运算符有很多(好吧,可能不是很多,但是你知道了)。任何接受三个参数的运算符都是三元运算符。C语言中唯一的三元运算符是条件运算符。
- comefrom是一个复制品,三元是有用的,达夫的装置…是的,很酷。
在python中,每个字符串都包含空字符串。
1 2 3
| answer = input("Enter 'Y[es] or N[o]:")
if answer in 'YyNn': # verify input
process(answer) |
只要在上面的查询中点击返回,就会将answer设置为空字符串,通过if answer in ...测试,并作为正确答案进行处理。简而言之:
1 2
| >>>"ABCDEFGHIJ".__contains__("")
True |
和往常一样,这里的python行为在数学和逻辑上都是无可挑剔的。正如我在很久以前的集合论课上所记得的:空集合是每个集合的一个成员。
当我被它咬了几次的时候,这仍然是令人惊讶的,但我不会有任何其他的方式。
在MODY重写中
1 2
| RewriteRule ^([a-zA-Z0-9_-]+)\.php$ $1/ [R,NC]
RewriteRule ^([a-zA-Z0-9_-]+)/$ $1\.php [NC,L] |
将导致:
1
| "file.php > file > file.php > file > file.php > file > ..." |
最后:
1
| Error 500 Too Many Redirects |
(一般来说,我发现编辑.htaccess文件就像构造一个正常工作的正则表达式一样乏味。)
- 这里的问题是你让一辆车继承了一个轮子。汽车是一种轮子吗?不,一辆车有四个轮子。在这种情况下使用继承根本是不合理的。
在C.
国际会计准则;
(&;A)[0]=10;/*将值10赋给*/
(&A)[0]相当于*(&A+0),它给了我们*(&A),它只不过是a。
Objective-C对字符串使用@。示例:@"这是一个字符串。"
- C也这样做,以禁用作为转义符。但是它有什么问题?
- @REI它用于Objective-C中的所有字符串。但是,这非常棒,因为否则编译器将不知道我们是指以空字符或nsstring对象结尾的字符数组。
- 啊。是的,过去的某些Windows框架(我认为是MFC)使用类似于T"string"的东西来区分库的字符串对象和以空结尾的字符数组。我想这是基于C语言/库的常见速记功能。
C中:A =康德?B:C;如果"b"和"c"是"分配不兼容",则即使"a"是对象,也永远不会得到结果。它是MS中经常使用和最愚蠢实现的运算符。要进行比较,请参阅D语言中的实现(关于类型推断的注释)。
- 江户十一〔十〕号!='{$foo';!="\{\$foo";号……叹息
2000年Perl Journal的模糊Perl竞赛的最佳展示条目:
1 2 3 4 5
| #:: ::-| ::-| .-. :||-:: 0-| .-| ::||-| .:|-. :||
open(Q,$0);while(<Q>){if(/^#(.*)$/){for(split('-',$1)){$q=0;for(split){s/\|
/:.:/xg;s/:/../g;$Q=$_?length:$_;$q+=$q?$Q:$Q*20;}print chr($q);}}}print"
";
#.: ::||-| .||-| :|||-| ::||-| ||-:: :|||-| .:| |
代码完全由其作者在http://mysite.verizon.net/les.peters/id2.html上解释。
- -1因为我很喜欢这个功能。它允许我在TCL中发明语法。
- …或C++/CLI,出现在2005(IIrC)中。
- 这太棒了,它确实说明了这是一个UI决策,而不是一个实现决策,它帮助用户区分前台和后台的不同级别。
- @夸克:这是一个单独的答案!;)…(是的,你可以用英语编程,只需把它作为.ppt部署给其他开发人员即可。;)
- @路易里奇一组水牛并不是明显来自水牛,它们只是一种难以形容的水牛。
- 或者FORTRAN,其中不仅没有保留字,而且空格也不重要(END语句被定义为一张卡片,依次为"e"、"n"和"d",其他地方都有空格)。解析一个if语句是很困难的,因为IF(可能意味着if的一个变体的开始,或者对if数组的赋值。
- 詹姆斯曾经去过的约翰对老师的影响更好。
- 前几天,我在本和杰瑞冰淇淋厂外看到了一些标牌制作者。我批评了他们的工作,我告诉他们本和和和和和杰瑞之间没有足够的空间。
- 也许这将是未来的临时项目所需要的。如果then=now&;where=here,那么when=then else now=otherwhere
- @凯莉:但是当现在=巴黎时会发生什么?
- @配置器,巴黎是一个全球常数。为什么?因为"我们将永远拥有巴黎"……
- @凯莉:如果现在=巴黎,那一定是星期二。
- 呃,应该是@configurator
在C++(或Java)中没有封装的事实。任何对象都可能违反任何其他对象的封装,扰乱其私有数据,只要它是相同的类型。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <iostream>
using namespace std;
class X
{
public:
// Construct by passing internal value
X (int i) : i (i) {}
// This breaks encapsulation
void violate (X & other)
{
other.i += i;
}
int get () { return i; }
private:
int i;
};
int main (int ac, char * av[])
{
X a(1), b(2), c(3);
a.violate (c);
b.violate (c);
cout << c.get() << endl; //"6"
} |
Perl。P></
打印"foo"N"foo除非美元;P></
在Java中(这是一个导致赋值的if语句)
1
| result = (Boolean condition) ? (if Boolean is true) : (if Boolean is false); |
或
1 2 3 4 5 6
| data Nat = Z|S Nat deriving Show
nattoInt Z = 0
nattoInt (S a) = 1 + nattoInt a
buildNat 0 = Z
buildNat a = S (buildNat (a - 1)) |
在Haskell…我还是不太明白这是如何定义自然数的(我完全理解这个理论):-p
- 第一个是三元if运算符。为什么这是一个奇怪的语言特征?我经常用多种语言。
- 真的?你理解这个理论,但是你没有得到一个简单的自然数的归纳定义?
- @戴卡姆:三叉戟是新鳍海豚的语言。;-)
- 噢,实际上是三元的意思。
- @马蒂尼奥·费尔南德斯不…我理解这个理论。我从来没有对语法给予足够的关注来理解语句的每个部分意味着什么。
- @我以为你认识哈斯克尔。那么,我很抱歉。第一行将Nat定义为与自然数同构的类型:它是零(Z)或Nat的继承者(S Nat)的一组值。例如1是S Z,2是S (S Z)等,其余的只是糖,可以打印Nat值(deriving Show),以及使用递归将实际数字转换为Nat和Nat值的函数。哦,顺便说一下,Haskell中的IFS与Java中的条件运算符的工作方式相同:EDCOX1(12)。
在C++中
1 2 3 4 5 6
| const char* wtf()
{
char buf[100];
return buf;
}
string s = ... + wtf() + ...; |
在s.party string、party stack contents中创建有趣的值,并与零混合,以便s.length()!=strlen(s.c_str())。最奇怪的是,编译器在返回指向堆栈的指针方面绝对没有问题——如果他在堆栈中添加警告,编译器程序员的手可能会掉下来。
- 我想7号通告是用来讲故事的
- @RCIX:过去被称为文本冒险,现在被相对较小的社区称为互动小说,具体来说。
- 不通知用牛津逗号吗?!这不是英语!
JavaScript:
- 切换到python 3的另一个原因--"print(07)"也是一个语法错误。
- 它总是幸运的七号,不是吗?
我肯定会给Perl带来许多可怕的例子:
或
1
| if($mystring =~ m/(\d+)/) { |
- 第二个是Regex吗?如果是这样,我不能怪珀尔。一开始Regex看起来很奇怪。
- 抱歉,伙计们,但是Perl所有的"讨厌"特性都是最有用的,尤其是在凌晨3点,当你需要一个3行程序来启动和再次运行所有东西时。除了regex语法早于perl本身之外,您可以(也应该!)用更长更显式的语法编写所有Perl快捷方式的代码,以便于阅读。
- -1这个答案抱怨的是一种语言的语法,而不是任何实际行为。
- 强制Perl计算$var的左值行为可能会不必要地降低性能。这可能是"除非(@var)"。
- 我发现标量(@var)更清晰。
- 第二个怎么了?如果字符串与模式匹配,请执行以下操作。有什么大不了的?
- 是的,我也不知道第二个有什么问题
- 除了@anonymous'点关于un-perl ness(几乎不可能是一种语言wtf)之外,我看不出这两个例子有什么问题。
- @詹姆斯-拉尔斯(不是我)没有说这些功能没有用。他回答了一个关于"最令人惊讶、最奇怪、最奇怪"语言特征的问题。而且,如果你已经知道它们的意思,它们只有在凌晨3点才有用。如果您试图在凌晨3点修改别人的代码,而您不是Perl程序员,那么这些代码非常反实用。尽管如此,我不认为这些是令人惊讶(或模糊)的Perl语法的最佳示例。
和JavaScript。 </P >
2 = = [ 2 ] </P >
甚至stranger / / 2 = = [ [ [ 2 ] ] ] </P >
/ /和井下的坚果 var a = { 1 }:"ABC"; [ [ [ [ ] ] ] ]"ABC"= = ="abc"[一] / /这是真也; </P >
luckily的类folks在stackoverflow.com explained全我的东西:stackoverflow.com /问题/ 1724255 /为什么不- 2 - 2 -和- JavaScript </P >
- 这有什么奇怪的?
- 我想他是不是有点困惑了?
- heh,int(15)将15转换为整数。所以代码行实际上设置了t=15,而不是指向大小为15的int[]的指针。所以当你删除t时,它会导致一个错误。
- @乍得,这不会在符合条件的编译器上产生错误,而int(15)确实将15强制转换为整数,new int(15)将创建一个动态分配的整数,并将值15赋给它。t将是指向包含15的整数的指针。
- 谢谢你,彼得。谢谢其他人向我扔土。这是一个您可能不知道的WTF功能。
这是我的2美分。在C++中:
1 2
| int* t = new int(15);
delete t; |
- 这有什么奇怪的?你还怎么计算复数的绝对值?
- 奇怪的是,正如我提到的,母语支持复数,这带来了一些奇怪的语法结构。
- 为什么是j而不是i?
- 显然,它遵循的是工程惯例而不是数学惯例。在工程上,i已经被采用,所以他们用j代替。我找不到comp.lang.python的帖子,但可以看到,例如,这个python教程线程。
tcl中的串联将添加两个字符串,它将变为一个字符串:
1 2 3 4
| set s1"prime"
set s2"number"
set s3 $s1$s2
puts s3 |
输出是
primenumber
- 啊,是的。好的旧复活节日期()。导致了我职业生涯中最早的"黑客"之一。学期计划,第二天到期。代码已就绪:部署。不起作用,因为宿主提供程序已编译了没有此函数的PHP。怎么办?解决方案:未来30年的硬编码!
你可以在Java中投掷任何可投掷的东西。
1 2 3 4 5 6 7 8 9 10 11
| class YourBoss extends Throwable {
}
public class Main{
public void main(String[] s) throws YourBoss {
try{
throw new YourBoss();
}catch(Exception e){
}catch(Error e){
}
}
} |
- 我喜欢这个。Bodmas总是混淆imho,而且大多数人都使用方括号,所以从左到右直接执行是很好的。
- 好吧,只要你能用parens来指定优先级
- 奇怪的。不知道为什么有人会喜欢这个。也许是因为我有点数学呆子。
愚蠢的语言。真的!
- 不过,这并不是什么"奇怪的特征",是吗?作为一种语言,它实际上非常简单,而且还有很多更复杂的语言(例如malbolge:en.wikipedia.org/wiki/malbolge)。
- 对于编程语言线程和提到bf的人,应该有某种godwin定律。
- 编辑:随着有关编程语言的在线讨论时间的延长,有人提到或发布解决方案的概率会增加1。
- 不太公平。Brainfuck是为了证明你可以有一种工作的、图灵完整的语言,这种语言几乎是人类无法阅读的。其目的是使"它的图灵完整,它编译"对于一种构造不良的语言来说是不可接受的防御。