Pertanyaan Fitur bahasa aneh


Apa, menurut Anda, fitur bahasa "WTF" yang paling mengejutkan, aneh, aneh, atau benar-benar Anda jumpai?

Harap hanya satu fitur per jawaban.


975


asal


Jawaban:


Di C, array dapat diindeks seperti ini:

a[10]

yang sangat umum.

Namun, bentuk yang kurang dikenal (yang benar-benar berfungsi!) Adalah:

10[a]

yang artinya sama seperti di atas.


1861



Di JavaScript:

 '5' + 3 gives '53'

Sedangkan

 '5' - 3 gives 2

1296



Dalam JavaScript, konstruk berikut

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

kembali undefined adalah kesalahan sintaks karena penyisipan titik koma implisit tersembunyi pada baris baru setelah return. Berikut ini berfungsi seperti yang Anda harapkan:

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

Lebih buruk lagi, ini juga berfungsi (di Chrome, setidaknya):

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

Berikut adalah varian dari masalah yang sama yang tidak menghasilkan kesalahan sintaks, hanya diam-diam gagal:

return
    2 + 2;

872



Tabel kebenaran JavaScript:

''        ==   '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

Sumber: Doug Crockford


797



Trigraph dalam C dan C ++.

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

Ini akan dicetak LOL|, karena trigraph ??! dikonversi menjadi |.


662



Kesenangan dengan tinju otomatis dan cache bilangan bulat di Java:

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

Penjelasan

Mengintip cepat kode sumber Java akan muncul sebagai berikut:

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

catatan:  IntegerCache.high default ke 127 kecuali ditetapkan oleh properti.

Apa yang terjadi dengan tinju otomatis adalah bahwa baik foo dan bar objek integer yang sama diambil dari cache kecuali secara eksplisit dibuat: mis. foo = new Integer(42), jadi ketika membandingkan kesetaraan referensi, mereka akan menjadi benar daripada salah. Cara yang tepat untuk membandingkan nilai Integer digunakan .equals;


574



Mengutip Neil Fraser (lihat akhir halaman itu),

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

(di Java, tetapi perilaku ini ternyata sama dalam JavaScript dan Python). Hasilnya dibiarkan sebagai latihan bagi pembaca.

EDITED: Selama kita berada di subjek pertimbangkan juga ini:

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

373



APL (selain SEMUA itu), kemampuan untuk menulis program apa pun hanya dalam satu baris.

misalnya Game Kehidupan Conway dalam satu baris di APL:

alt teks http://catpad.net/michael/APLLife.gif

Jika garis itu bukan WTF, maka tidak ada!

Dan ini dia video


325



Hal-hal aneh C ++ template dapat digunakan untuk, ditunjukkan oleh yang terbaik "Literal Analog Multi-Dimensi" yang menggunakan templat untuk menghitung luas bentuk "digambar". Kode berikut ini valid C ++ untuk persegi panjang 3x3

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

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

Atau, contoh lain dengan kubus 3D:

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

322