在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?
请每个回答只回答一个特征。
在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?
请每个回答只回答一个特征。
当前回答
PL/SQL允许将变量和函数名声明为关键字。下面是可编译的PL/SQL:
create or replace
function function
return number as
return number;
begin
function.return := 4;
return return;
end function;
/
这创建了一个名为function的函数。后:
SQL> select function from dual;
FUNCTION
----------
4
其他回答
Processing (processing.org)是一种基于Java的语言。简单来说,处理编译器是将特定于处理的语法转换为Java的Java预处理器。
由于语言的设计,它有一些惊喜:
Processing的类被编译成Java内部类,这会引起一些麻烦,比如私有变量并不是真正私有的
class Foo {
private int var = 0; // compiles fine
}
void setup() {
Foo f = new Foo();
print(f.var); // but does not causes compile error
}
同样缺少draw()函数会导致事件处理程序不被调用:
// void draw() {} // if you forgot to include this
void mousePressed() {
print("this is never called");
}
c# yield语句,并不奇怪,但非常有用。
http://msdn.microsoft.com/en-us/library/9k7k7cf0 (VS.80) . aspx
在C:
int main() {
int i = 0;
int array[] = {1,2};
return (i[array] + 1 == array[i]);
}
这个程序将返回1 (true)。
特点:Bash, Korn shell (ksh93)和Z shell都允许使用带或不带美元符号的变量下标数组:
array[index]=$value
array[$index]=$value
加上美元符号,会得到10000的期望值:
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
陌陌性:如果你从RANDOM中移除美元符号,总数将随机变化,甚至大于10000。
类似地,这将产生3而不是2:
a=1; ((r[a++]++)); echo $a
你不能在这里用美元符号,因为这是赋值运算(a在lhs上)虽然你可以用间接的方法,但是双重求值还是会发生。
原因:对于美元符号,变量展开在算术求值之前执行,因此只执行一次。如果没有美元符号,它将执行两次,一次是计算查找的索引,另一次是计算赋值的索引(因此,实际上,循环中第一步的赋值可能看起来像array[4] = $array[6] + 1,这完全打乱了数组)。
有些奇怪——VBScript有一个Null关键字和一个Nothing关键字(Null是丢失的数据,Nothing是丢失的对象)。为什么不只有一个关键词…?大多数其他语言似乎都可以用一个!
Visual Basic 6.0当然还有“经典ASP”代码(因为它使用VBScript)也有同样的奇怪之处。在Visual Basic的新旧版本中,我们都有DBNull。
然而,这种情况正在改善,就像Visual Basic一样。NET Null终于消失了,所以Null不再使用,只有Nothing和DBNull被使用。