在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?
请每个回答只回答一个特征。
在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?
请每个回答只回答一个特征。
当前回答
在c++中,“虚”MI(多重继承)允许“菱形”类层次结构“工作”,这让我觉得奇怪和讨厌。
A:基类,例如:“对象” B, C:两者都(实际上或不是)源于对象和 D:起源于B和C
问题:“正常”继承导致D是2种不明确的A。“虚拟”MI将B的A和C的A折叠为一个共享基对象A。
所以,即使你的车轮是一个对象,你的左前轮是一个车轮,你的汽车继承了四种车轮,你的汽车仍然只是一种具有虚拟MI的对象。否则,你的汽车不是一个对象,而是4个车轮对象。
这是一种奖励糟糕的类设计、惩罚编译器编写者的语言特性,并让您在运行时怀疑对象到底在哪里——以及是否有任何虚拟MI行李放错了地方。
如果在类层次结构中确实需要菱形模式,可以使用常规MI和委托给单个A基的“AProxy”来完成。
A:基类,例如:“对象” AProxy:基类,与其他A绑定的构造 B:源自A C:来源于AProxy D:源自B和C(在构造时将B的A传递给C的AProxy)
对于那些真正喜欢diamond MI的人来说,这需要做更多的工作,而我们其他人则可以安心地使用一组更易于处理的语言特性。
其他回答
VBScript的日期/时间文字(为什么这个仍然如此罕见?):
mydate = #1/2/2010 5:23 PM#
If mydate > #1/1/2010 17:00# Then ' ...
编辑:日期文字是相对的(那么它们在技术上是文字吗?):
mydate = #Jan 3# ' Jan 3 of the current year
VB。NET,因为它是编译的,所以不支持相对日期文字。只支持日期或时间字面量,但缺失的时间或日期被假定为零。
编辑[2]:当然,有一些奇怪的极端情况会出现相对日期……
mydate = #Feb 29# ' executed on 2010-01-05, yields 2/1/2029
我为客户端编写了一种编程语言(用于实验驱动定制硬件),其中包含一些定制类型(Curl, Circuit,…),每种类型只有2个值。它们可以隐式地转换为布尔值,但是(在客户机的请求下)可以在运行时更改此类类型常量的确切布尔值。
例如: Curl类型有2个可能的值:CW和CCW(顺时针和逆时针)。在运行时,你可以通过一个简单的赋值语句改变布尔值:
ccw := true
所以你可以改变所有这些类型值的布尔值。
JCL条件返回执行。
//STEP02 EXEC PGM=PROG02,COND=(4,GT,STEP01) .
该特性允许您根据前面步骤的返回代码运行或不运行某个步骤。真是个不错的功能。
除了一些小功能,把逻辑颠倒过来。
首先,如果条件为真,则不运行步骤。
其次,4 GT,STEP01实际上意味着“如果STEP01的返回码大于4”
因此,整个过程意味着“如果来自STEP01的返回代码大于4,则不要运行此步骤”。这与“如果4大于来自STEP01的返回代码,则运行步骤”的简单解释几乎相同,但并不完全相同。
考虑到你唯一认真看待这些事情的时间是凌晨2点30分左右,电话另一端是一个疯狂的夜班接线员,这种双重模糊会导致严重的头痛。
这可能已经被提到了,但是——
PHP对八进制值的处理:
$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
还要注意关于这个错误的评论——Derick称其为一个特性(引用“fix”表示),而不是一个错误,他声称它会“在脚本中使用数字的所有情况下显著降低PHP的速度”——但是,为什么PHP会引发一个0A错误呢?
我认为人们可以写一整本书来讲述PHP的古怪之处……
c++模板机制是图灵完备的:只要在运行时不需要输入,就可以在编译时进行任意计算。任意的。或者你可以很容易地编写一个永远不会编译的c++程序——但是语法是正确的。