En garip dil ​​özelliği


974

Sizce karşılaştığınız en şaşırtıcı, garip, garip veya gerçekten "WTF" dil özelliği nedir?

Lütfen cevap başına yalnızca bir özellik.


5
@gablin Eğer LISP sınırlayıcılarını javascript ayrıştırma kullanarak PERL normal ifadesiyle birleştirirseniz, WTF'nin% 90'ını
kaplarsınız

Yanıtlar:


1859

C'de diziler şu şekilde dizine eklenebilir:

a[10]

ki bu çok yaygın.

Bununla birlikte, daha az bilinen form (gerçekten işe yarar!):

10[a]

bu yukarıdakiyle aynı anlama gelir.


758
çünkü [10] * (a + 10) anlamına gelir ... 10 [a] * (10 + a) anlamına gelir :)
Michel Gokan

77
"Merhaba Dünya" yı unutmayın [i]. Veya ben ["Merhaba Dünya"]
Richard Pennington

167
Veya, daha yararlı bir şekilde, "0123456789abcdef" [x & 0xf]
Seviye

17
@frunsi: Her zaman beklendiği gibi çalışır. İşaretçi ekleme, adreslere basit tamsayı ekleme ile aynı değildir. Söz konusu tip ne olursa olsun değişmeli .
R. Martinho Fernandes

12
@mcv - a [10], "* (a + 10)" ile aynıdır, burada "a + 10" ifadesi işaretçi aritmetiğidir (ve a kısa olduğu için, örneğinizde bir + 10 ' a adresini girin ve 10 şort taşıyın, örneğin 20 bayt '). 10 [a] ifadesi "* (10 + a)" olarak yorumlanır, burada "10 + a" da işaretçi aritmetiğidir ve tam olarak aynı şekilde işlenir.
Edan Maor

1292

JavaScript'te:

 '5' + 3 gives '53'

Buna karşılık

 '5' - 3 gives 2

81
Javascript ilk kez bu tür tekniği kullanarak dizeleri sayılar eklemek için kullanmaya başladığımı hatırlıyorum: "111" - - "222" 333 verirken "111" + "222" "111222" verir.
Callum Rogers

112
+dize birleştirme için korkunç
Matteo Riva

416
+ concat için sorun değil. Zayıf yazma.
FogleBird

270
@FogleBird Hiçbiri gerçekten sorun değil. Bu sadece ikisinin tutarsız baskı kuralları ile birleşimi .
TM.

70
Temel olarak, + bir dize dahil edildiğinde concat olur. Neden '123456' - 456 = '123' gibi bir şeyi kodlayamıyorlar? Bu ilginç olurdu.
Jimmie Lin

872

JavaScript'te aşağıdaki yapı

return
{
    id : 1234,
    title : 'Tony the Pony'
};

returnundefined , sonraki satırsonuna gizli gizli noktalı virgül eklenmesi nedeniyle bir sözdizimi hatasıdır return. Ancak, beklediğiniz gibi çalışır:

return {
    id : 1234,
    title : 'Tony the Pony'
};

Daha da kötüsü, bu da işe yarıyor (en azından Chrome'da):

return /*
*/{
    id : 1234,
    title : 'Tony the Pony'
};

İşte aynı sorunun bir sözdizimi hatası vermeyen bir çeşidi, sessizce başarısız oluyor:

return
    2 + 2;

225
Noktalı virgül ekleme, JavaScript'in en kötü kısımlarından biridir.

230
Kullanıcılarınızın çoğunlukla salak olacağı varsayımıyla dil özelliklerini tasarlarken her zaman sorunla karşılaşıyorsunuz.
Rob Van Dam

8
Aslında bu sorun vardı, c # geliştirici olarak, küme ayracı yeni bir satıra koydu. Sorunun ne olduğunu anlamak için bana saatler sürdü. Sorunu çözdüğümde bile, cevabınızı okuyana kadar sorunun ne olduğunu bilmiyordum!
Fedor Hajdu

24
Nick Retallack: Çünkü JavaScript'in C-benzeri kıvırcık parantezleri ve noktalı virgül sözdizimi nedeniyle, yeni satırların önemli olduğu pek belli değil.
Tamas Czinege

19
JavaScript'te programlama yaparken C stilini kullanmamanız gerekiyorsa, C stili sözdizimini seçmek JavaScript dili tasarımcılarının sapkınlığıydı.
Ryan Lundy

795

JavaScript doğruluk tablosu:

''        ==   '0'           // false
0         ==   ''            // true
0         ==   '0'           // true
false     ==   'false'       // false
false     ==   '0'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
" \t\r\n" ==   0             // true

Kaynak: Doug Crockford


237
Javascript === operatörüne sahiptir.
İsimsiz

65
Peki ==dil tasarımcısının gözünde hangi amaca hizmet ediyor?
Chris S

137
İnsanları şaşırtmak.
Javier

123
Eğer ==anlamı olsaydı iyi olurdu ===, ve sonra başka bir operatör vardı, böyle bir ~=zorlamaya izin veren bir şey vardı .
TM.

18
@Otto Aslında, dışarı çıktığımız için, örneği == 'nin simetrik olmadığını gösteriyor. Şu anda, ikili ilişkide değişimin nasıl belirleneceğini görmedim.
PeterAllenWebb

660

C ve C ++ 'daki trigraflar.

int main() {
   printf("LOL??!");
}

LOL|Üçgen ??!dönüştürüldüğünden , bu yazdırılacaktır |.


71
Hızlı! Tüm C / b / programcılarına söyleyin!
Esteban Küber

235
Trigraflar şaşırtıcı, çünkü kimsenin ne olduğunu bulamayacağından emin olabilirsiniz ??! adı bilmeden Google’dan gelir.
zaratustra

56
Trigraflar GCC'de varsayılan olarak devre dışıdır.
sastanin

360
Bunlar "WTF operatörünü" kullanmanıza izin verir: (foo ()! = HATA) ??! ??! cerr << "Hata oluştu" << endl;
user168715

57
Trigraflar tanıtıldığında gerekli bir kötüydü. Bazı platformlar dilin belirli karakterlerini içermiyordu, bu yüzden ya "trigraflar" ya da "C derleyicisi deyim sonu deyimine sahip olamıyorsunuz, bu yüzden derleyici kullan". Stroustrup'un "C ++ Programlama Dili" bölümündeki açıklamasına göz atın.
Euro Micelli

573

Otomatik boks ve Java'da tam sayı önbellek ile eğlenceli:

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

açıklama

Java kaynak koduna hızlı bir bakış aşağıdakileri sağlayacaktır:

/**
 * 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 <code>int</code> 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);
}

Not: bir özellik tarafından ayarlanmadığı sürece IntegerCache.highvarsayılan 127olarak kullanılır.

Otomatik boks ile olan şey, açıkça oluşturulmadıkça hem foo'nun hem de çubuğun önbellekten alınan aynı tamsayı nesnesinin olmasıdır: örneğin foo = new Integer(42), referans eşitliğini karşılaştırırken, yanlış yerine doğru olacaktır. Tamsayı değerini karşılaştırmanın doğru yolu.equals;


31
Java'nın neden -128 ile 128 arasındaki değerler için bir Tamsayı örnekleri havuzu tutması gerektiğini görmek için birkaç saniye sürdü, aksi halde yeni bir Tamsayı atar, değil mi?
Mike Akers

18
ancak, yeni Tamsayı (42) belirtirseniz, havuzdaki örneği kullanmayacağını unutmayın, bu nedenle foo == bar, false
z -

10
Mümkünse her zaman Tamsayılar yerine ints kullanıyorum, ancak bir nedenle Tamsayıları kullanmak zorunda kalsaydım, == yerine sadece .equals () kullanmalıyım?
MatrixFrog

246
Çok mutluyum ben bir C # programcısıyım.

87
@Will: C # çok benzer gotchas var. Bkz blogs.msdn.com/jmstall/archive/2005/03/06/386064.aspx
spookylukey

373

Neil Fraser'den alıntı (o sayfanın sonuna bakın),

try {
    return true;
} finally {
    return false;
}

(Java'da, ancak görünüşe göre JavaScript ve Python'da aynıdır). Sonuç okuyucuya bir alıştırma olarak bırakılır.

DÜZENLENEN: Konuyla ilgili olduğumuz sürece şunu da dikkate alın:

try {
    throw new AssertionError();
} finally {
    return false;
}

42
+1. Nedense bunu komik buluyorum ve kıkırdayarak duramıyorum.
outis

153
Neyse ki C # böyle bir deliliğe izin vermiyor ...Control cannot leave the body of a finally clause
Richard Ev

64
Bu geri döner, yanlış, değil mi? Bir WTF gibi görünebilir (ve muhtemelen birdir), ama kuralla yaşıyorum: Daha önce Makineyi çökmedikçe, sonunda her zaman kazanır.
Michael Stum

28
: Fuarı olmak için, sana güç kablosunu yank sürece nihayet her zaman kazanır olduğunu hatırlamak için TDWTF en güzel açıklama suçluyorum thedailywtf.com/Articles/My-Tales.aspx
Michael Stum

22
Kodun bu durumda ne dönmesi gerektiğinden emin değilim. Ama kesinlikle emin koymak gerektiğini değilim returnde finallyfıkra.
jfs

325

APL (TÜMÜ dışında), herhangi bir programı tek bir satırda yazma yeteneği.

örneğin APL'de bir satırda Conway'in Hayat Oyunu :

alternatif metin http://catpad.net/michael/APLLife.gif

Bu çizgi WTF değilse, hiçbir şey!

Ve işte bir video


19
APL'yi seviyorum. Ah, öğleden sonrasını yarım satır kod yazmak için harcamanın sevinci! Hangi harflerin görüntüleneceğini programlayabileceğim bir klavye bulduğumda yapacağım ilk şey, kendimi tekrar APL ile yeniden tanımlamak.
Daniel C.Sobral

24
Yunanlılar için bir dil gibi görünüyor.
Esko

45
@Erik: Oraya nasıl yazacağınızla ilgili değil, sadece istediğiniz şeyle ilgili kod yazmada bulunmaktan mutluluk duyuyoruz. Kodunuzu tek bir ifade olarak ifade etme. Nihai mükemmel katana kesimi gibi. Tabii ki, gerçek bir dövüşte silahımı tercih ederim.
Daniel C.Sobral

7
@Daniel: Öğleden sonra bir kod satırı yazmak için ... ve bir hafta boyunca bir kod satırı okumak için harcıyorsunuz . ;-)
Jürgen A.Erhard

93
APL bir bilimkurgu aksiyon filminde görmek harika olurdu. "Düşman füze vektörünü yeniden şekillendir ... devrik ... pi kez logaritma ... not - ve - yürüt!" Diye çırpınan üç renkli bir terminalde oturan birini hayal edebiliyorum. ardından patlamalar ve tezahürat.
Joey Adams

321

C ++ şablonlarının kullanılabileceği garip şeyler, en iyi şekilde "çizilmiş" şekiller alanını hesaplamak için şablonlar kullanan "Çok Boyutlu Analog Değişmezler" tarafından gösterilebilir . Aşağıdaki kod 3x3 dikdörtgen için geçerli C ++

#include"analogliterals.hpp"
using namespace analog_literals::symbols;

          unsigned int c = ( o-----o
                             |     !
                             !     !
                             !     !
                             o-----o ).area;

Veya, 3D küp içeren başka bir örnek:

  assert( ( o-------------o
            |L             \
            | L             \
            |  L             \
            |   o-------------o
            |   !             !
            !   !             !
            o   |             !
             L  |             !
              L |             !
               L|             !
                o-------------o ).volume == ( o-------------o
                                              |             !
                                              !             !
                                              !             !
                                              o-------------o ).area * int(I-------------I) );

18
Eelis'in analog değişimleri harika olsa da, garip bir dil özelliği mi , yoksa yalnızca bir özelliği kullanmanın garip bir yolu mu?

85
Gerçek WTF, hatalı biçimlendirilmiş olanlardan biri tarafından oluşturulan derleyici hatası olacaktır.
Andrew McGregor

6
Ne kadar hasta .. Eclipse'de X, Y ve Z ekseni etrafında değişmezi çevirmeyi destekleyen bir AnalogLiterals sürümü olduğunda beni tekrar uyandır ... şimdi "görsel programlama" yı yeni bir anlam verecek.
TheBlastOne

2
O'ların ve L'lerin sıralaması ve |
Ming-Tang

4
Şablonlar operatörün aşırı yüklenmesini yaratıcı bir şekilde kullandığından, sıralama önemlidir. (Bunu gerçek kodla yapmayın, operatörleri kötüye kullanmak kodu okumayı zorlaştırır)
josefx

292

Perl'in birçok yerleşik değişkeni:

  • $#- yorum değil !
  • $0, $$ve $?- tıpkı aynı ada sahip kabuk değişkenleri gibi
  • ,, $&ve $'- garip eşleşen değişkenler
  • $"ve $,- liste ve çıktı alanı ayırıcıları için garip değişkenler
  • $!- errnosayı gibi , ancak strerror(errno)dize gibi
  • $_- gizli değişken, her zaman kullanılır ve hiç görülmemiş
  • $#_ - son altyordam argümanının dizin numarası ... belki
  • @_ - geçerli işlevin (non) adları ... belki
  • $@ - son istisna
  • %:: - sembol tablosu
  • $:, $^, $~, $-, Ve $=- şey çıktı formatları ile ilgisi
  • $.ve $%- giriş satırı numarası, çıkış sayfası numarası
  • $/ve $\- giriş ve çıkış kayıt ayırıcılar
  • $| - çıkış tamponlama kontrolörü
  • $[- dizi tabanınızı 0 tabanlı yerine 1 tabanlı olarak 42 tabanlı olarak değiştirin: WHEEE!
  • $}- hiçbir şey, garip bir şekilde!
  • $<, $>, $(, $)- gerçek ve etkili UIDs ve Gıd'ler
  • @ISA - mevcut paketin doğrudan üst sınıflarının isimleri
  • $^T - dönem saniye olarak komut dosyası başlangıç ​​zamanı
  • $^O - mevcut işletim sistemi adı
  • $^V - Perl'in hangi sürümü

Bunların nereden geldiği çok daha fazlası var. Listenin tamamını buradan okuyun .


83
$[Değişken hepsini en kötülüktür.
Brad Gilbert

24
Perl 6, perldoc perlvarher beş saniyede bir kontrol etmek zorunda kalmadan kodlayabileceğiniz bir şey olsaydı kesinlikle takdir ediyorum . (Kontrol ettiğim zamanın yarısını "Bunu benim için yapabilen özel bir değişken olduğunu biliyorum, hangisini hatırlamıyorum ..." = P)
Chris Lutz

17
Sorun use English;RegExp performansını etkilemesidir. Bunu telafi etmiyorum. perldoc.perl.org/English.html#PERFORMANCE
Dave Webb

13
@Dave: bağladığınız sayfadaki -no_match_vars seçeneği nedeniyle sorun değil. @Brad: $ [çok kötü. Arkasındaki niyet kötüdür, evet, ama aynı zamanda işe yaramıyor! @Artem: perlvar'dan "Rakamlar, kontrol karakterleri veya noktalama işaretleri ile başlayan Perl tanımlayıcıları paket bildiriminin etkilerinden muaftır ve her zaman paket ana içinde olmaya zorlanır; katı 'vars' hatalarından da muaftırlar." Bu, @ $ 'ın darlık altında bile hatasız oluşturulacağı ve atanacağı anlamına gelir. Ihh!
rjh

4
@Brian: Resmi belgelerin kendisi Perl yorumlayıcısının sezgisel olarak bir dizi dizinin ne anlama geldiğini tahmin ettiği durumlar olduğunu sözdizimi nasıl öğrenirsiniz ? Örneğin /$foo[bar]/, [bar]bölüm bir karakter sınıfı mı yoksa diziye abone @foomi? Korkunç cevap için perldata Grep.
j_random_hacker

289

PHP'nin dizelerdeki sayısal değerleri işlemesi . Tüm ayrıntılar için farklı bir soruya verilen bu önceki cevaba bakın , ancak kısaca:

"01a4" != "001a4"

Farklı sayıda karakter içeren iki dizeniz varsa, bunlar eşit sayılamaz. Baştaki sıfırlar önemlidir, çünkü bunlar sayı değil dizelerdir.

"01e4" == "001e4"

PHP dizeleri sevmez. Değerlerinizi sayı olarak ele almak için bulabileceği herhangi bir mazeret arıyor. Bu dizelerdeki onaltılı karakterleri biraz değiştirin ve aniden PHP bunların artık dizge olmadığına karar verir, bilimsel gösterimdeki sayılardır (PHP tırnak kullandığınız umurumda değildir) ve eşdeğerdir çünkü önde gelen sıfırlar sayılar için yok sayılır. Bu noktayı güçlendirmek için PHP'nin de "01e4" == "10000"doğru olarak değerlendirildiğini göreceksiniz çünkü bunlar eşdeğer değerlere sahip sayılardır. Bu belgelenmiş davranış, pek mantıklı değil.


56
=== ve! == tuşlarını kullanın. Gevşek tip karşılaştırması gerekmedikçe yine de kullanılmalıdır.
Dykam

14
@Dykam, daha eksiksiz cevap bağlantısını takip ederseniz === operatörünün kullanımına hitap ettiğimi göreceksiniz.
Dan Dyer

18
Zayıf yazma grevleri tekrar!
gillonba

43
PHP'nin günah olduğunu hep biliyordum. Şimdiye kadar bunun
unutulmaz

2
İnsanları herhangi bir programlama kitabında veya öğreticide === kullanmaları için teknoloji kullanmalıdırlar. Ek not: Kötü yazılmış bir PHP uygulamasında aynı numara olarak ayrıştırılmış her şeyi şifrem olarak sağlayabildim.
Pepijn

282

Ayrılmış kelimeleri ortadan kaldırmaya çalışan tüm diller (PL / I gibi) için bir oy verelim.

Başka nerede yasal olarak eğlenceli ifadeler yazabilirsiniz:

IF IF THEN THEN = ELSE ELSE ELSE = THEN

( IF, THEN, ELSEDeğişken isimler)

veya

IF IF THEN THEN ELSE ELSE

( IFbir değişkendir THENve ELSEaltyordamlardır)


1
@quark: bu ayrı bir cevap! ;) ... (ve evet, İngilizce ile programlayabilirsiniz, sadece diğer geliştiricilere .ppt olarak konuşlandırın.;)
Macke

28
Bir grup bufalo açıkça Buffalo'dan değil, sadece sıradan buffalo.
Jürgen A.Erhard

18
James'in sahip olduğu John'un öğretmen üzerinde daha iyi bir etkisi olmuştu.
GameFreak

4
Geçen gün Ben ve jerrys dondurma fabrikası fabrikasının dışında bazı işaretçiler gördüm. Çalışmalarını eleştirdim, onlara ben ve ve ve ve jerrys arasında yeterli alan olmadığını söyledim.
Tom Gullen

9
Belki gelecekteki geçici programlar için gerekli olacaktır. EĞER ŞİMDİ = ŞİMDİ && NEREDE = BURADAN SONRA = SONRA BAŞKA BİR ŞEY = BAŞKA BİR YERDE
Kelly S. Fransızca

282

JavaScript sekizlik dönüşüm 'özelliği' bilmek iyi bir şeydir:

parseInt('06') // 6
parseInt('07') // 7
parseInt('08') // 0
parseInt('09') // 0
parseInt('10') // 10

Daha fazla ayrıntı burada .


60
8 ve 9 hariç tüm sayıları çalıştı bir hata sıkışmış var! Deli oluyor !!! Teşekkürler Brian!
Faruz

10
@ Ocada Bunu mu demek istediniz? Onaltılık 0x.
luiscubal

48
Bu nedenle parseInt (isteğe bağlı) ekstra bir argüman alır :).
LiraNuna

10
0 önde gelen sekizli sayı anlamına gelir. 8 geçerli bir sekizli rakam olmadığından sonuç 0 olmalıdır.
devio

22
... ve parseInt ('010') -> 8 sadece sizi şaşırtmak için.
Richard Gadsden

213

Duff'ın cihazı C!

C'de bir do / while anahtar deyimi ile geçebilir. İşte bu yöntemi kullanan bir memcpy örneği:

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);
    }
}

9
Duff'ın cihazı muhtemelen switch deyiminin varsayılan olarak bir mola vermemesi için iyi bir neden ;-) Ancak, henüz titreşimli anahtar ve loop'un başka bir iyi kullanımını görmedim - ama muhtemelen bir tane var. Oh bekleyin, evet, başka bir kullanım daha var: coroutines ve protothreads.
Frunsi

16
@frunsi: "Duff'ın cihazı muhtemelen switch deyiminin varsayılan olarak bir ara vermemesi için iyi bir nedendir" - Her zaman ortak durumu varsayılan yapın. Ben tam olarak bu ortak bir durum olduğunu söyleyemem ..
BlueRaja - Danny Pflughoeft

6
@mcv, montaj kodu olarak okumaya çalışırsanız muhtemelen en kolay olanıdır, yani whilesonunda, JMPgeri doatlayıp neden dodöngüde kaldığınızı açıklayan bir (koşullu) 'a geri döner .
wds

14
Duff Cihazının genellikle modern derleyiciler için normal döngü ifadesinden daha WORSE kodu ürettiğini ve bu işlemin elle nasıl yapabileceğinizden (daha iyi) döngü açmayı bileceğini unutmayın.
Billy ONeal

37
@frunsi: Duff'ın kendisi, onu yayınlıyor, şöyle bir şey iddia etti: "Bu, tartışmada anahtarın varsayılan olarak düşüp düşmeyeceği konusunda kesinlikle bir argüman sağlıyor, ancak argümanın buna karşı mı yoksa karşı olup olmadığından emin değilim."
SF.

204

Algol isme göre geçiş (C sözdizimi kullanılarak gösterilmiştir):

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]);
}

33
Bunu düşünürseniz, aslında bir çeşit bükülmüş mantıklı
RCIX

90
Bu nihai "referansla geçiştir" dir.
Dykam

3
Scala'da olsa mümkündür ( def f(j : => int))
Dario

10
Peki bu böyle bir şey ... template<typename T> struct by_name { virtual operator T&() = 0; }; void f(by_name<int> j) { ... } int main() { f(struct : by_name<int> { operator int&() { return a[i]; } }); }mi?
Simon Buchan

2
Aslında oldukça basittir: Bu durumda & a [i] ifadesinden kaynaklanan adresi hesaplayan küçük bir kod parçası (genellikle "thunk" olarak adlandırılır, bu nedenle yukarıdaki puncum) üretirsiniz. Bu işleve bir işaretçi çağrılan işleve iletilir ve bu işlev, parametreye her erişildiğinde geçerli adresi hesaplamak için kullanır.
Richard Pennington

189

Python'da:

>>> x=5
>>> 1<x<10
True
>>> 1<x<3
False

WTF değil, kullanışlı bir özellik.


176
Keşke diğer tüm diller bu özelliğe
sahipse

32
Hemen hemen her havalı Python özelliğinde olduğu gibi, Guido da sadece serin bir Lisp özelliğinin sözdizimini ALGOL izledi gibi görünüyor. :-)
Ken

4
Geoffrey, bir özellik ve (10 > 5 > 1) != ((10 > 5) > 1)Python'da.
sastanin

18
Ayrıca, sadece bir kez değerlendirir, bu yüzden (funct_a(5)+5 > b > funct_a(5))sadece bir funct_a(5)kez arar . BÜYÜK bir özellik!
Khelben

57
@Khelben: Hayır, funct_abu örnekte iki kez çağrılacak. İçinde b > funct_a(5) > caksine, sadece bir kez çağrılacaktır b > funct_a(5) and funct_a(5) > c.
Baffe Boyois

189

Java dilinde:

int[] numbers() {
  return null;
}

Şu şekilde yazılabilir:

int numbers() [] {
  return null;
}

23
Vaov! Keşke bu dizi sözdizimi tasarlandığında duvarda bir sinek olabilseydim!
Adam Paynter

29
Bunu söylemekten nefret ediyorum ama WTF C tipi sistemin tutarlı bir uzantısı. C işlevlerinin dizileri döndürmesine izin verilmiş olsaydı, bu şekilde görünecektir. Daha güzel olanı, daha okunabilir hale getirmek için bir tutarlılık ihlalidir. "Const char * var" vs "char const * var" gibi.
Gordon Wrigley

15
@Adam - Değişken bildirimin benzer şekilde hem "int şeyler []" hem de "int [] şeylere izin verdiğini düşündüğünüzde anlamlıdır. Sadece aynı kuralların yöntem bildirimi için çalışmasına izin verirler.
Brandon Yarbrough

2
@lImbus: Aslında const T*ve T const*eşdeğerdir, bu T* constişaretçiyi sabitler. Ayrıca, sans yazı tiplerinden nefret ediyorum.
Simon Buchan

3
Sonuçta, numbers()[2]yasal bir açıklama.
badp

184

INTERCAL muhtemelen en garip dil ​​özelliklerinin en iyi özeti. Benim kişisel favorim GOTO'nın (neredeyse) tam tersi olan COMEFROM ifadesidir.

COMEFROM, yürütme durumunu koddaki herhangi bir keyfi noktadan bir COMEFROM deyimine götürebilmesi nedeniyle GOTO'nın kabaca tersidir. Durum aktarımının gerçekleştiği koddaki nokta genellikle COMEFROM'a bir parametre olarak verilir. Aktarımın, belirtilen aktarım noktasındaki talimattan önce veya sonra gerçekleşip gerçekleşmediği kullanılan dile bağlıdır. Kullanılan dile bağlı olarak, aynı kalkış noktasına gönderme yapan birden fazla COMEFROM, geçersiz olabilir, belirleyici olmayabilir, belirli bir tür öncelikte yürütülebilir, hatta Dişli Aralıklı'da görüldüğü gibi paralel veya başka bir şekilde eşzamanlı yürütme indükleyebilir. "COMEFROM x" ifadesinin basit bir örneği, "tuzak kapısı" görevi gören x etiketidir (karşılık gelen COMEFROM'un yakınında fiziksel olarak herhangi bir yere yerleştirilmesi gerekmez). Kod yürütme etikete ulaştığında, kontrol COMEFROM'dan sonra ifadeye aktarılır. Bunun etkisi, hata ayıklamayı (ve programın kontrol akışını anlamak) son derece zorlaştırmaktır, çünkü etiketin yanında, kontrolün gizemli bir şekilde programın başka bir noktasına atlayacağına dair bir gösterge yoktur.


16
Oldukça kötü - etiketleri GOTO'lara dönüştürür. Bir dil özelliği hackerlar için yalvarır gibi görünüyor ...
RCIX

114
Tamam, ama INTERCAL komik olmalı - bu gerçekten şaşırtıcı bir “gotcha” değil. INTERCAL derleyicisi, PLEASEdeğiştiriciyi yeterince kullanmıyorsanız programı derlemeyi reddedebilir !
Groo

10
AOP gibi geliyor :)
akuhn

6
Beni en çok şaşırtan şey, "Ticari TI Dünyası" ndaki sistem gereksinim analizinde, COMEFROM'ların aslında Kullanım Durumlarını açıklayan metin dosyalarında kullanılmasıdır. (ciddi olarak: buradaki bazı analistler, MS Ofisi yerine OpenOffice'e kurumsal olarak geniş bir geçişi ertelediler, çünkü eski, bir bağlantıda gerekli ayrıntı düzeyine sahip bir "gelen" ifadesine düzgün bir şekilde başvuramadı)
jsbueno

5
Groo: Daha kötü. LÜTFEN çok sık kullanın ve programladığınız için derleme yapmayı reddediyor (C-INTERCAL, LÜTFEN değiştiricilere sahip olmak için ifadelerin% 33 ila% 66'sını gerektirir).
Vatine

160

Gerçekten bir dil özelliği değil, bir uygulama hatası: Bazı erken Fortran derleyicileri sabit bir havuz kullanarak sabitleri uyguladı. Tüm parametreler referans ile geçti. Bir işlevi çağırdıysanız, ör.

f(1)

Derleyici, sabit havuzdaki sabit 1'in adresini işleve geçirir. İşlevdeki parametreye bir değer atarsanız, programdaki değeri (bu durumda 1 değerini) global olarak değiştirirsiniz. Bazı kafa çizilmelerine neden oldu.


124
Ooh. Sonra eşit 2+2 olabilir5 ( 2elbette çok büyük değerler için !).
Alok Singhal

12
hm, 2'nin hangi değeri "2 + 2" == "5" olur? Herhangi bir tamsayı değeri 2 bunun doğru olması için bilmiyorum.
Aaron

36
@earlz: Herhangi bir bit paterninin ayrılmaz bir değeri olarak ortaya çıkacağından şüpheleniyorum. Öte yandan, muhtemelen 5 ila 4'ü bu şekilde ayarlayabilirsiniz (böylece küçük değerlerine 2+2eşit olur ). 55
David Thornley

18
Affedersiniz, Alok, ama bahsettiğimiz erken FORTRAN. Bu doğru olmayacak 2 + 2 = 5; sözdizimi hatası olur. Gerçek olacak olan 2 + 2 .EQ. 5.
David Thornley

3
Haskell'de aşağıdaki pasaj 5 olarak değerlendirilir: "2 + 2'de 2 + 2 = 5 olsun" :)
Tirpen

153

Bir dil özelliği olarak kabul edilip edilemeyeceğini bilmiyorum, ancak C ++ 'da şablonlarla ilgili hemen hemen her derleyici hatası, dünyadaki birçok C ++ programcısına günlük olarak adil miktarda WTF sağlar :)


15
Sorun değil, şablonlarla ilgili çoğu kod zaten dünya çapında çok sayıda WTF oluşturuyor.
Joris Timmermans

43
Ah, şimdi gel. std :: basic_ostream <char, std :: char_traits <char>> & std :: operatörü << <std :: char_traits <char>> (std :: basic_ostream <char, std :: char_traits <char> > &, char const *) 'Mükemmel okunabilir!
Matt Greer

10
Bir zamanlar en kısa on yedi bin karakterden oluşan (şablon için klasik bir 'eşleşme yok' hatası) beş satırlık şablonla ilgili derleyici hatası aldım. Bu WTF, ilk etapta özellik değil, şablonlar harika.
Andrew McGregor

111
Hata olmasa bile, profillerinizle en uzun süren işlevleri bulmayı deneyin. Oh bak, bustd::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::vector< std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator>(std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::allocator<std::pair<int, std::complex> >)
rlbond

12
Bence bu uygun: Çıktı okunabilir hale getirmek için bdsoft.com/tools/stlfilt.html adresinden STLFilt'e bakın .
foraidt

150

C'nin birçok isim alanı:

typedef int i;

void foo()
{
    struct i {i i;} i;
    i: i.i = 3;
    printf( "%i\n", i.i);
}

Veya karakterlerle:

typedef char c;

void foo()
{
    struct c {c c;} c;
    c: c.c = 'c';
    printf( "%c\n", c.c);
}

Bu nasıl açık bir şekilde derleniyor !?
Earlz

13
+1 Numaralandırmalar ve yapılar için etiket tanımlayıcıları C imho'nun en kafa karıştırıcı kısmıdır. Bir yapıya bir işaretçi yazmak için kullanılan deyimin neden böyle göründüğünü çok az insan anlar.
Tadeusz A. Kadłubowski

11
Derler, çünkü her birinin içeriğinden dolayı açık bir isim alanı var.
Andrew McGregor

149

Python'un tüm beyaz alanı benim en büyük WTF özelliğim olduğunu söyleyebilirim. Doğru, bir süre sonra az ya da çok alışmaya başladınız ve modern editörler başa çıkmayı kolaylaştırıyor, ancak geçen yıl için çoğunlukla tam zamanlı python geliştirmesinden sonra bile bunun kötü bir fikir olduğuna ikna oldum. Arkasındaki tüm gerekçeleri okudum ama dürüst olmak gerekirse, üretkenliğimin önüne geçiyor. Çok değil, ama hala eyer altında bir çapak.

edit: yorumlara bakılırsa, bazı insanlar kodumu girintilemek istemediğimi düşünüyor. Bu yanlış bir değerlendirmedir. Dil ne olursa olsun ve zorlanıp zorlanmadığımdan bağımsız olarak kodumu her zaman girintili yaptım. Ne sevmiyorum hangi bir kod satırı içinde blok tanımlayan girinti olmasıdır. Bunun için açık sınırlayıcıları tercih ederim. Diğer nedenlerin yanı sıra, kodları kesip yapıştırmayı kolaylaştıran açık sınırlayıcılar buluyorum.

Örneğin, 4 boşluk girintili bir bloğum varsa ve 8 boşluk girintili bir bloğun sonuna yapıştırırsam, yapıştırılan kodun 8 boşluk bloğuna veya dış kısma ait olup olmadığı konusunda editörüm (tüm editörler?) blok. OTOH, açık sınırlayıcılarım varsa, kodun hangi bloğa ait olduğu ve nasıl (yeniden) girintili olması gerektiği açıktır - bunu akıllıca blok sınırlayıcıları arayarak yapar.

edit 2: yorum yapan bazı insanlar bunun nefret ettiğim bir özellik olduğunu veya python'u kötü bir dil haline getirdiğini düşünüyor gibi görünüyor. Yine doğru değil. Ben o kadar çok sevmesem de, konunun yanında. Soru en tuhaf dil özelliği ile ilgili ve bence bu çok garip, çok az (ama> 0) dilin kullandığı bir şey olması.


63
üretkenliğinize
engel olursa

27
Python'dan önce hangi dili kullandınız? Diğer insanlarla nasıl çalışabildiniz ve bu dili girintilemediniz? Herhangi bir dilde girintisiz kodla nasıl anlaşılabilir ? Kaynak kodda görsel ipuçlarına ihtiyaç duymayan dahilerle dolu bir odada mı çalıştınız?
S.Lott

53
+1 Daha fazla anlaşamadım, editörüm (Emacs) kodumu otomatik olarak farklı bir şeye (parantez / başlangıç, bitiş / isim verin) dayanarak girintilemezse, bu çok aptalca. "Daha büyük" bir işlev üzerinde yapacağınız herhangi bir yeniden düzenleme gerçekten kötü bir deneyim olabilir.
Dmitry

83
İşte anlaşma - başka bir dille, bir kod bloğunu vurgulayabilir ve herhangi bir düzenleyici tarafından düzgün bir şekilde girintilenmesini sağlayabilirim. Ancak beyaz boşluk tanım gereği doğru girintili olduğu için Python'da bu yeteneği kaybedersiniz. Bu yüzden kodu hareket ettirmek veya bir şeyleri yeniden düzenlemek daha zordur. Ve OP "bir sorun olduğunu iddia ilk kişi" olduğunu iddia eden kişi için, bir süre için bazı python kodunu korumak zorunda kaldı ve şimdi bu nedenle python üzerinde herhangi bir dil kullanacağım.
Kendall Helmstetter Gelner

38
Python'daki boşlukları önemsemiyorum. WTF, sürekli olarak uygulanmamasıdır. Girinti düzeylerini ve sekmelerini, kardeşleriyle tutarlı oldukları sürece karıştırabilirsiniz. Yani ilk girinti seviyesi bir boşluk olabilir ve ikincisi iki SEKME olabilir ve bu bir sözdizimi hatası değildir.
ieure

138

Bu konuda biraz mücadele ettim:

1;

Perl'de, modüllerin gerçek bir şey döndürmesi gerekir .


29
Bazı modüller çalışma zamanı işlemlerine göre değerler döndürebilir. Her zaman true değerini döndürürseniz, yine de bu konuda yaratıcı olmanız gerekmez: returnvalues.useperl.at
Anonim

8
Perl belleğim bana doğru şekilde hizmet veriyorsa, bir modülden true değerinin döndürülmesi, modülün başarıyla yüklendiğini gösterir. Yanlış bir değer döndürmek, bir şeyin yanlış gittiğini ve programın çalışmasını (yakalanmadıysa) önleyeceği anlamına geliyordu.
Barry Brown

Bu geçerli bir C ifadesidir, sadece hiçbir şey döndürülmez.
sigjuice

24
Mark Dominus, " 'Cogito ergo sum';Herkesin bildiği gibi olası tüm evrenlerde açıkça doğru olduğu çok nadiren kullandım . Bu, maksimum taşınabilirlik sağlar."
Greg Bacon

PHP <?=1;?>1. <?=true;?>döndürür 1. <?=false;?>döndürür null.
Talvi Watia

135

Hiç kimsenin Visual Basic'in 7 döngü yapısından bahsetmediğine şaşırdım .

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

Çünkü bir yapışma! Şartlı önünde olan yolu çok karmaşık!


47
Bunu " Whileve Whend" yapmalıydılar , çünkü sessizce labialised velar yaklaşımı ile "while" kelimesini telaffuz eden bazı insanlar var. Ve tabii ki daha güzel sıralar ve sıralayan kod güzel.
dreamlax

43
Neden bu kadar tuhaf davranıyorsun?
Erik Forbes

48
Vay. Bunu düşündüğümde nostaljik oluyorum. VB'yi ilk kez kullandığımda 9 yaşındaydım. İsveçliyim ve o zamanlar İngilizcede çok yetkin değildi. Şimdi, "vänd" adında İsveççe bir kelime var. Bu nedenle çok mantıklı olduğunu düşündüm ... :)
Emil H

61
! VB'de değil, "Değil". Yoksa öyle mi? Evet, değil!, Ama değil.
brianary

7
Evet, "Wend" İngilizce bir kelimedir, yani bir kursa veya yola devam etmek veya devam etmek ( google.com/search?q=define%3A+wend ). Bunun yararı olup olmadığından emin değilim.
Michael Myers

134

Bilmeyenler için, bc"keyfi bir hassas hesap makinesi dili" dir ve özellikle ilgili sayılar büyük olduğunda ( $istemdir) hızlı hesaplamalar için oldukça sık kullanırım :

$ bc -lq
12^345
20774466823273785598434446955827049735727869127052322369317059031795\
19704325276892191015329301807037794598378537132233994613616420526484\
93077727371807711237016056649272805971389591721704273857856298577322\
13812114239610682963085721433938547031679267799296826048444696211521\
30457090778409728703018428147734622401526422774317612081074841839507\
864189781700150115308454681772032

bcuzun zamandır standart bir Unix komutu olmuştur.

Şimdi "WTF özelliği" için. Bu man bc(benim vurgu):

quit : quit deyimi okunduğunda, quc deyiminin bulunduğu yerden bağımsız olarak bc işlemcisi sonlandırılır. Örneğin, "if (0 == 1) quit" bc'nin sonlanmasına neden olur.

halt : halt deyimi (bir uzantı), bc işlemcisinin yalnızca yürütüldüğünde çıkmasına neden olan yürütülen bir deyimdir. Örneğin, "if (0 == 1) dur" durma işlemi yürütülmediği için bc'nin sonlandırılmasına neden olmaz.


41
Bu şeyler için Haskell kullanıyorum.
Thomas Eding

8
Google hesap makinesi?
igul222

7
Python'u kendim kullanmaya başladım ve çevrimiçi iseniz google hesap makinesi güzel. Ama eskiden kullanıyordum bcve bcyazı sayfamdaki büyük alıntılardan dolayı yazımda yazmak istedim .
Alok Singhal

6
@Brian, o zaman seveceksiniz: echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc(bunu zaten biliyor olsanız da).
Alok Singhal

2
Ben irb (Ruby interaktif kabuk) kullanıyorum. Ama gün içinde, her zaman dc gibi m.ö.'e ulaştım, ancak ters cila kullanıyor. Geektastic!
tragomaskhalos

134

Her zaman en basit programın neden olduğunu merak ettim:

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Halbuki olabilir:

print "Hello World!"

Belki de bu bilgisayar bilimi öğrencilerini ilk etapta korkutmaktır ...


34
Bazı dillerde, "Merhaba Dünya!" geçerli bir programdır.
David Thornley

31
@SoMoS: Python, Ruby veya Perl gibi çoğu dinamik dilde "Merhaba Dünya!" veya bazı küçük değişiklikler (örneğin, baskı yerine koyar) geçerli ve eksiksiz bir programdır.
Dave Kirby

36
@Loadmaster: "tüm kod bir sınıfa ait" veya "tüm kod bir işleve ait" ifadesinin gereksiz kısıtlamalar olması
Jimmy

19
Bir dil nesnelerin kullanımını zorladığı için, bunun doğru nesne yönelimli programlama için kullanıldığı anlamına gelmez. Java veya C # ile prosedürel olarak programlamak mükemmel bir şekilde mümkündür. Statik yöntemler bunun içindir.
jdmichal

68
OOP'un her şeyin bir nesne olması gerektiği anlamına geldiğini düşünen insanları seviyorum.
Tor Valamo

132

JavaScript nesne yönelimli, değil mi? Yani değişmez dizgiler ve sayılar üzerinde çalışan yöntemler çalışmalıdır. Gibi "hello".toUpperCase()ve 3.toString(). İkincisinin bir sözdizimi hatası olduğu ortaya çıkıyor, neden? Ayrıştırıcı bir sayının ardından noktanın kayan nokta değişmezi olmasını beklediğinden. Bu WTF değil, WTF, çalışması için sadece başka bir nokta eklemeniz gerektiğidir:

3..toString()

Sebebi, edebi 3.olarak yorumlanır 3.0ve 3.0.toString()iyi çalışır.


8
Python'da da bu şekilde çalışır (deneyin 3..__add__(4)). Sonra tekrar ben bunu (3).__add__(4)yapmak için çok daha az beyin hasarlı yolu olduğunu düşünüyorum :)
badp

49
Sadece (3) .toString ()
Joseph Montanez

13
@ Gorilla3D: evet, ama bu garip bir dil özelliği değil, değil mi?
Theo

25
3.0.toString()gözlerimi kaşındırıyor.
Ben Blank

18
127.0.0.1.toInt ()
berkus

130

JavaScript'te:

2 == [2]

// Even stranger
2 == [[[2]]]

// And down-right nutty
var a = { "abc" : 1 };
a[[[["abc"]]]] === a["abc"]; // this is also true

Neyse ki stackoverflow.com'daki nazik insanlar bana her şeyi açıkladı: Neden JavaScript'te 2 == [2]?


6
Onun ===yerine kullanmalısınız .
Gumbo

10
Sayıyı döndüren bir işleviniz varsa ve onunla bazı ek meta veriler döndürmek istiyorsanız, bazı ek alanlar eklenmiş olarak [sayı] döndürebilirsiniz. Basit kod, bunun gerçek bir sayı olmadığını asla bilemez ve diğer kod gerekli meta verileri alabilir.
Andrey Shchekin

36
@Andrey, eğer önerdiğini yapan kodu korumak zorunda kalırsam, çok yakında yazarı üzerine ölüm diliyorum.
Breton

@Andrey, bu harika bir fikir! Number(n)Benzer bir şey yapmak için de kullanabilirsiniz . Ne yazık ki her iki çözümümüzde de ===mola = (.
Xavi

5
+1: Kendimi bilgili bir js programcısı olarak gördüm ve bunu hiç bilmiyordum: D
Thomas Eding

126

En çok nefret ettiğim özellik, koşullu mantık içeren herhangi bir yapılandırma dosyası sözdizimidir. Bu tür şeyler Java dünyasında yaygındır (Ant, Maven, vb. Kim olduğunu biliyorsun!).

Sınırlı hata ayıklama ve sınırlı editör desteği ile ac ** p dilinde programlamaya son verdiniz.

Yapılandırmanızda mantığa ihtiyacınız varsa, yapılandırmayı gerçek bir dilde kodlamak için "Pitonik" yaklaşım çok daha iyidir.


24
Tcl, Python doğmadan çok önce yeniden icat etti ve Lisp bunu ondan önce icat etti. Öyleyse buna Pythonic diyelim, buna Emacs-ish diyelim.
slebetman

46
Sadece doğru diyelim.
mletterle

30
AMİN. Yapılandırmanız veya oluşturma diliniz tamamlanıyorsa, yanlış yapıyorsunuz demektir. Sana bakıyorum CMake / autotools.
Joseph Garvin

16
Lua tam olarak bunun için tasarlandı
Cogwheel

1
Kodunuz Python'daysa, yapılandırma dosyanızın bir Python dosyası olması harika bir fikirdir, çünkü daha sonra dosyayı içe aktarın ve modülün niteliklerini okuyun. Yapılandırma dosyanızda Python'un% 100 Turing Complete gücünü elde edersiniz.
asmeurer

113

powerbasic (www.powerbasic.com) derleyici yönergesini içerir:

# BLOAT {bloatsize}

bu, derlenen yürütülebilir dosyanın <bloatsize>bayt boyutunu artırır . çalıştırılabilir öğeyi oluşturan kişilerin oluşturulan çalıştırılabilir öğenin küçük boyutlarından hoşlanmaması durumunda derleyiciye konulmuştur. EXE'nin şişirilmiş programlama dilleriyle rekabet etmek için daha büyük görünmesini sağlar :)


9
Haha yuk. Geliştiricilerin bazı işlemleri (örneğin bir arama) kasten yavaşlattığını duydum çünkü insanların gerçekten bir şey yaptığını düşünmelerine yardımcı oluyor. Benzer şey sanırım.
David

42
Bu bana son zamanlarda okuduğum bir şeyi hatırlatıyor. Bir FPS test ediyorlardı ve kötü adamların sahip olduğu isabet sayısını artırmaya karar verdiler. Daha sonra test uzmanlarına yapay zeka'nın nasıl olduklarını sordular ve bunun daha akıllı olduğuna yemin ettiler. Ama AI değişmemişti, sadece can puanları. İnsanların kafasında dünya hakkında belirli bir anlatı vardır ve beklentilerini anlar ve eşleştirirseniz, bunun anlatılarını doğruladığını varsayarlar.
Nate CK

5
Programlarıma karmaşık bir şey yapıyormuş gibi görünmelerini sağlamak için çok fazla ekstra yavaşlama eklerdim. İlkokulda, yani.
Matti Virkkunen

3
Okula geri döndüğümüzde 80286 makinemiz vardı ve aslında makul bir hız elde etmek için montajda bazı ekran çıktı rutinleri yazmak zorunda kaldım (yani tarama yapmadım).
berkus

7
@Nate CK, AI, AI'sını gösterecek kadar uzun yaşıyorsa , aslında daha akıllı olabilir , ancak bunu kanıtlamak için çok hızlı bir şekilde ölmüş olabilir.
zzzzBov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.