Apa, menurut Anda, fitur bahasa yang paling mengejutkan, aneh, aneh atau benar-benar "WTF" yang Anda temui?
Harap hanya satu fitur per jawaban.
language-agnostic
programming-languages
Robert Harvey
sumber
sumber
Jawaban:
Di C, array dapat diindeks seperti:
yang sangat umum.
Namun, bentuk yang kurang dikenal (yang benar-benar berfungsi!) Adalah:
yang artinya sama dengan di atas.
sumber
Dalam JavaScript:
Sedangkan
sumber
+
untuk rangkaian senar itu mengerikanDalam JavaScript, konstruk berikut
kembaliadalah kesalahan sintaksis karena penyisipan titik koma implisit licik pada baris baru setelahundefined
return
. Berikut ini berfungsi seperti yang Anda harapkan:Lebih buruk lagi, ini juga berfungsi (setidaknya di Chrome):
Berikut adalah varian dari masalah yang sama yang tidak menghasilkan kesalahan sintaksis, hanya gagal secara diam-diam:
sumber
Tabel kebenaran JavaScript:
sumber
==
di mata perancang bahasa?==
memiliki arti===
, dan kemudian ada operator lain, sesuatu seperti~=
itu memungkinkan pemaksaan tipe.Trigraph dalam C dan C ++.
Ini akan dicetak
LOL|
, karena trigraph??!
dikonversi menjadi|
.sumber
Bersenang-senang dengan tinju otomatis dan cache integer di Jawa:
Penjelasan
Intip sekilas kode sumber Java akan muncul sebagai berikut:
Catatan:
IntegerCache.high
default ke127
kecuali ditentukan oleh properti.Apa yang terjadi dengan tinju otomatis adalah bahwa baik foo dan bar objek integer yang sama diambil dari cache kecuali dibuat secara eksplisit: misalnya
foo = new Integer(42)
, sehingga ketika membandingkan persamaan referensi, mereka akan benar daripada salah. Cara yang tepat untuk membandingkan nilai Integer adalah menggunakan.equals;
sumber
Mengutip Neil Fraser (lihat bagian akhir halaman itu),
(di Jawa, tetapi perilaku tampaknya sama dalam JavaScript dan Python). Hasilnya dibiarkan sebagai latihan untuk pembaca.
Diedit: Selama kita membahas hal ini pertimbangkan juga ini:
sumber
Control cannot leave the body of a finally clause
return
difinally
klausa.APL (selain SEMUA itu), kemampuan untuk menulis program apa pun hanya dalam satu baris.
mis . Permainan Kehidupan Conway dalam satu baris dalam APL :
alt teks http://catpad.net/michael/APLLife.gif
Jika garis itu bukan WTF, maka tidak ada apa-apa!
Dan ini sebuah video
sumber
Hal-hal aneh yang dapat digunakan templat C ++, paling baik ditunjukkan oleh "Literal Analog Multi-Dimensi" yang menggunakan templat untuk menghitung area bentuk "digambar". Kode berikut ini valid C ++ untuk persegi panjang 3x3
Atau, contoh lain dengan kubus 3D:
sumber
Banyak variabel bawaan Perl:
$#
- bukan komentar!$0
,,$$
dan$?
- sama seperti variabel shell dengan nama yang sama$ˋ
,,$&
dan$'
- variabel pencocokan aneh$"
dan$,
- variabel aneh untuk pemisah daftar dan keluaran-bidang$!
- Sepertierrno
sebagai angka tetapistrerror(errno)
sebagai string$_
- yang variabel siluman, selalu digunakan dan tidak pernah terlihat$#_
- nomor indeks argumen subrutin terakhir ... mungkin@_
- nama (bukan) dari fungsi saat ini ... mungkin$@
- pengecualian terakhir%::
- tabel simbol$:
,$^
,$~
,$-
, Dan$=
- ada hubungannya dengan format output$.
dan$%
- masukan nomor baris, nomor halaman keluaran$/
dan$\
- pemisah rekaman input dan output$|
- Pengontrol buffering keluaran$[
- ubah basis array Anda dari berbasis 0 ke berbasis 1 menjadi berbasis 42: WHEEE!$}
- tidak ada sama sekali, anehnya!$<
,$>
,$(
,$)
- UID yang nyata dan efektif dan Gids@ISA
- nama superclasses langsung paket saat ini$^T
- waktu mulai skrip dalam beberapa detik$^O
- nama sistem operasi saat ini$^V
- versi Perl ini apaAda lebih banyak dari mana mereka berasal. Baca daftar selengkapnya di sini .
sumber
$[
variabel kejahatan sebagian besar dari mereka semua.perldoc perlvar
setiap lima detik. (Meskipun saya mengakui bahwa separuh waktu saya mengeceknya dengan berpikir "Saya tahu ada variabel khusus yang dapat melakukan ini untuk saya, saya hanya tidak ingat yang mana ..." = P)use English;
adalah itu mempengaruhi kinerja RegExp. Saya tidak mengada-ada. perldoc.perl.org/English.html#PERFORMANCE/$foo[bar]/
, apakah[bar]
bagian kelas karakter atau subskrip ke array@foo
? Grep perldata untuk jawaban yang menakutkan.PHP menangani nilai numerik dalam string . Lihat jawaban sebelumnya untuk pertanyaan berbeda untuk perincian lengkap tetapi, singkatnya:
Jika Anda memiliki dua string yang berisi jumlah karakter berbeda, mereka tidak dapat dianggap sama. Angka nol di depan penting karena ini adalah string bukan angka.
PHP tidak suka string. Ia mencari alasan apa pun yang dapat ditemukan untuk memperlakukan nilai Anda sebagai angka. Ubah sedikit karakter heksadesimal dalam string itu dan tiba-tiba PHP memutuskan bahwa ini bukan string lagi, mereka adalah angka dalam notasi ilmiah (PHP tidak peduli bahwa Anda menggunakan tanda kutip) dan mereka setara karena nol terkemuka diabaikan untuk angka. Untuk memperkuat poin ini Anda akan menemukan bahwa PHP juga mengevaluasi
"01e4" == "10000"
sebagai true karena ini adalah angka dengan nilai yang setara. Ini perilaku yang terdokumentasi, hanya saja tidak terlalu masuk akal.sumber
Mari kita pilih semua bahasa (seperti PL / I) yang mencoba menghilangkan kata-kata yang dipesan.
Di mana lagi Anda bisa menulis ekspresi lucu seperti:
(
IF
,THEN
,ELSE
Adalah nama-nama variabel)atau
(
IF
adalah variabel,THEN
danELSE
merupakan subrutin)sumber
'Fitur' konversi oktal JavaScript bagus untuk diketahui:
Lebih detail di sini .
sumber
Perangkat Duff di C!
Dalam C satu dapat mengaitkan do / while dengan pernyataan switch. Berikut ini contoh memcpy menggunakan metode ini:
sumber
while
di bagian akhir adalah (bersyarat)JMP
kembali kedo
, yang menjelaskan mengapa Anda dapat melewatkando
dan masih berakhir di loop.Algol lulus dengan nama (diilustrasikan menggunakan sintaks C):
sumber
def f(j : => int)
)... 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]; } }); }
?Dengan Python:
Bukan WTF, tetapi fitur yang bermanfaat.
sumber
(10 > 5 > 1) != ((10 > 5) > 1)
dalam Python.(funct_a(5)+5 > b > funct_a(5))
hanya memanggilfunct_a(5)
sekali. Ini adalah fitur HEBAT!funct_a
akan dipanggil dua kali dalam contoh itu. Dib > funct_a(5) > c
dalamnya hanya akan dipanggil sekali, sebagai lawanb > funct_a(5) and funct_a(5) > c
.Di Jawa:
Dapat ditulis sebagai:
sumber
const T*
danT const*
setara, ituT* const
yang mengarahkan pointer. Juga, saya benci font sans.numbers()[2]
adalah pernyataan hukum.INTERCAL mungkin adalah ringkasan terbaik dari fitur bahasa yang paling aneh. Favorit pribadi saya adalah pernyataan COMEFROM yang (hampir) kebalikan dari GOTO.
sumber
PLEASE
cukup sering menggunakan pengubah!Bukan fitur bahasa, tapi cacat implementasi: Beberapa kompiler Fortran awal mengimplementasikan konstanta dengan menggunakan kumpulan konstan. Semua parameter dilewatkan dengan referensi. Jika Anda memanggil suatu fungsi, mis
Kompiler akan meneruskan alamat konstanta 1 di kumpulan konstan ke fungsi. Jika Anda menetapkan nilai ke parameter dalam fungsi, Anda akan mengubah nilai (dalam hal ini nilai 1) secara global dalam program. Menyebabkan beberapa kepala menggaruk.
sumber
2+2
bisa sama5
(untuk nilai yang sangat besar2
tentunya!).2+2
akan sama5
dengan nilai kecil5
).2 + 2 = 5
; itu akan menjadi kesalahan sintaksis. Apa yang akan benar adalah2 + 2 .EQ. 5
.Tidak tahu apakah itu dapat dianggap sebagai fitur bahasa, tetapi, di C ++ hampir semua kesalahan kompiler yang terkait dengan templat memberikan WTF ke banyak programmer C ++ di seluruh dunia setiap hari :)
sumber
std::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> >)
Banyaknya ruang nama C:
Atau dengan karakter:
sumber
Saya akan mengatakan seluruh ruang putih Python adalah fitur WTF terbesar saya. Benar, Anda lebih atau kurang terbiasa dengan itu setelah beberapa saat dan editor modern membuatnya mudah untuk ditangani, tetapi bahkan setelah sebagian besar pengembangan python penuh waktu selama setahun terakhir, saya masih yakin itu adalah Ide Buruk. Saya sudah membaca semua alasan di baliknya tetapi jujur, itu menghalangi produktivitas saya. Tidak banyak, tapi masih duri di bawah pelana.
edit: menilai dari komentar, beberapa orang tampaknya berpikir saya tidak suka membuat indentasi kode saya. Itu penilaian yang salah. Saya selalu membuat indentasi kode apa pun bahasanya dan apakah saya dipaksa atau tidak. Apa yang saya tidak suka adalah bahwa itu adalah lekukan yang menentukan apa yang menghalangi suatu baris kode. Saya lebih suka pembatas eksplisit untuk itu. Di antara alasan lain, saya menemukan pembatas eksplisit membuatnya lebih mudah untuk memotong dan menempelkan kode.
Misalnya, jika saya memiliki blok indentasi 4 spasi dan tempel di akhir blok yang diberi indentasi 8 spasi, editor saya (semua editor?) Tidak tahu apakah kode yang ditempelkan milik blok 8-ruang atau bagian luar blok. OTOH, jika saya memiliki pembatas eksplisit, sudah jelas kode mana yang menjadi milik blok dan bagaimana seharusnya (ulang) indentasi - ia melakukannya dengan secara cerdas mencari pembatas blok.
sunting 2: beberapa orang yang memberikan komentar sepertinya berpikir ini adalah fitur yang saya benci atau yang saya pikir menjadikan python bahasa yang buruk. Sekali lagi, tidak benar. Meskipun saya tidak terlalu menyukainya, itu intinya. Pertanyaannya adalah tentang fitur bahasa yang paling aneh , dan saya pikir ini aneh, karena itu menjadi sesuatu yang sangat, sangat sedikit (tetapi> 0) bahasa yang digunakan.
sumber
Saya berjuang sedikit tentang ini:
Dalam perl, modul perlu mengembalikan sesuatu yang benar .
sumber
'Cogito ergo sum';
yang seperti yang diketahui semua orang adalah terbukti dengan sendirinya di semua alam semesta yang memungkinkan. Ini memastikan portabilitas maksimum."<?=1;?>
mengembalikan 1.<?=true;?>
mengembalikan 1.<?=false;?>
mengembalikan null.Saya terkejut bahwa tidak ada yang menyebutkan 7 loop konstruksi Visual Basic .
Karena menempelkan! di depan kondisimu terlalu rumit!
sumber
While
danWhend
", karena ada beberapa orang yang mengucapkan kata "sementara" dengan aproksimasi velar yang tidak bersuara yang tidak bersuara. Dan tentu saja itu berbaris lebih baik, dan kode yang berbaris itu bagus.Bagi mereka yang tidak tahu,
bc
adalah "bahasa kalkulator presisi arbitrer", dan saya menggunakannya cukup sering untuk perhitungan cepat, terutama ketika jumlah yang terlibat besar ($
adalah prompt):bc
telah menjadi perintah standar Unix untuk waktu yang lama.Sekarang untuk "fitur WTF". Ini dari
man bc
(penekanan milikku):sumber
bc
sebelum itu, dan ingin menulis tentangbc
di posting saya karena kutipan hebat dari halaman manual.echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc
(meskipun Anda mungkin sudah tahu ini).Saya selalu bertanya-tanya mengapa program paling sederhana adalah:
Padahal bisa jadi:
Mungkin ini untuk menakuti siswa ilmu komputer di tempat pertama ...
sumber
JavaScript berorientasi objek, bukan? Jadi menjalankan metode pada string dan angka literal harus bekerja. Suka
"hello".toUpperCase()
dan3.toString()
. Ternyata yang kedua adalah kesalahan sintaks, mengapa? Karena parser mengharapkan angka diikuti oleh titik menjadi titik mengambang literal. Itu bukan WTF, WTF adalah Anda hanya perlu menambahkan titik lain untuk membuatnya bekerja:Alasannya adalah bahwa literal
3.
ditafsirkan sebagai3.0
, dan3.0.toString()
berfungsi dengan baik.sumber
3..__add__(4)
). Kemudian lagi saya pikir(3).__add__(4)
adalah cara yang jauh lebih sedikit kerusakan otak untuk melakukannya :)3.0.toString()
membuat mataku gatal.Dalam JavaScript:
Untungnya orang-orang baik di stackoverflow.com menjelaskan semuanya kepada saya: Mengapa 2 == [2] dalam JavaScript?
sumber
===
.Number(n)
untuk melakukan hal serupa. Sayangnya di kedua solusi kami===
break = (.Fitur terbesar saya yang paling dibenci adalah sintaksis file konfigurasi yang menyertakan logika kondisional. Hal semacam ini marak di dunia Jawa (Semut, Maven, dll. Anda tahu siapa Anda!).
Anda baru saja mengakhiri pemrograman dalam bahasa ac ** p, dengan debugging terbatas dan dukungan editor terbatas.
Jika Anda membutuhkan logika dalam konfigurasi Anda, pendekatan "Pythonic" dalam mengkode konfigurasi dalam bahasa nyata jauh lebih baik.
sumber
powerbasic (www.powerbasic.com) termasuk arahan kompiler:
ini meningkatkan ukuran dari executable
<bloatsize>
bytes yang dikompilasi . ini dimasukkan ke dalam kompiler kalau-kalau orang membuat executable tidak suka ukuran kecil executable yang dihasilkan. itu membuat EXE tampak lebih besar untuk bersaing dengan bahasa pemrograman yang membengkak :)sumber