在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?
请每个回答只回答一个特征。
在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?
请每个回答只回答一个特征。
当前回答
在Matlab中,以下内容可能会让你感到惊讶,特别是如果你习惯了Python:
>> not true
ans =
0 0 0 0
>> not false
ans =
0 0 0 0 0
这里有两个奇怪的特征。第一个是a b被解释为a('b'),因此非真被解释为not('true')。第二个奇怪的特征是没有任何字符返回0(大概是因为在matlab中没有false或true,只有0或1)。
其他回答
在SQL
NULL不等于NULL
所以你不能:
WHERE myValue == NULL
这将总是返回false。
NULL != NULL
在MATLAB(交互式数组语言,目前是TIOBE 20)中,有一个关键字end来表示数组的最后一个元素(它对应于NumPy -1)。这是一个众所周知的MATLAB语法:
myVar = myArray(end)
要从数组中间获取一个元素,通常可以这样写:
myVar = myArray( ceil( length(myArray)/2 ) )
令人惊讶的是,关键字end根本不是一个关键字,而是一种变量:
myVar = myArray( ceil( end/2 ) )
ActionScript 3:
当一个对象被它的接口使用时,编译器不识别从object继承的方法,因此:
IInterface interface = getInterface();
interface.toString();
给出一个编译错误。 解决方法是将类型转换为Object
Object(interface).toString();
PHP:
. 和+运算符。它有其合理的解释,但“a”+“5”= 5仍然显得尴尬。
Java(以及任何IEEE754的实现):
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
Java的访问修饰符对我来说是最近的一个WTF(因为我必须学习一点)。
显然,包比类层次结构更亲密。我不能定义对子类可见但对包中的其他类不可见的方法和属性。为什么我要将一个类的内部共享给其他类呢?
但是我可以定义对包内的每个类可见的属性和方法,但对包外的子类不可见。
不管我怎么想,我还是看不出其中的逻辑。切换访问修饰符,使受保护的行为就像它在c++中工作一样,并保持包的私有修饰符,这是有意义的。但现在不是了。
In C
a[i++] = i;
它会编译,但很少执行您认为它应该执行的操作。优化更改会产生截然不同的结果。它在不同平台上的运行方式也不同。
然而,编译器对此非常满意。