Jangan pernah menulis kode seperti itu.
Karena j<1000
, j/1000
adalah nol (pembagian integer). Begitu:
(&main + (&exit - &main)*(j/1000))(j+1);
setara dengan:
(&main + (&exit - &main)*0)(j+1);
Yang mana:
(&main)(j+1);
Yang menelepon main
dengan j+1
.
Jika j == 1000
, maka baris yang sama keluar sebagai:
(&main + (&exit - &main)*1)(j+1);
Yang intinya adalah
(&exit)(j+1);
Yang mana exit(j+1)
dan meninggalkan program.
(&exit)(j+1)
dan exit(j+1)
pada dasarnya hal yang sama - mengutip C99 §6.3.2.1 / 4:
Designator fungsi adalah ekspresi yang memiliki tipe fungsi. Kecuali ketika itu adalah operan dari sizeof operator atau unary & operator , penunjuk fungsi dengan tipe " function return type " dikonversi ke ekspresi yang memiliki tipe " pointer ke function return type ".
exit
adalah penunjuk fungsi. Bahkan tanpa &
operator alamat- unary , itu diperlakukan sebagai pointer ke fungsi. ( &
Hanya membuatnya eksplisit.)
Dan panggilan fungsi dijelaskan dalam §6.5.2.2 / 1 dan berikut:
Ekspresi yang menunjukkan fungsi yang dipanggil harus memiliki tipe pointer untuk berfungsi mengembalikan kekosongan atau mengembalikan tipe objek selain tipe array.
Jadi exit(j+1)
berfungsi karena konversi otomatis dari tipe fungsi ke tipe pointer-to-function, dan (&exit)(j+1)
bekerja dengan konversi eksplisit ke tipe pointer-to-function.
Yang sedang berkata, kode di atas tidak sesuai ( main
mengambil dua argumen atau tidak sama sekali), dan &exit - &main
, saya percaya, tidak terdefinisi sesuai dengan §6.5.6 / 9:
Ketika dua pointer dikurangi, keduanya harus menunjuk ke elemen dari objek array yang sama , atau satu melewati elemen terakhir dari objek array; ...
Penambahan itu (&main + ...)
akan berlaku dengan sendirinya, dan dapat digunakan, jika jumlah yang ditambahkan adalah nol, karena §6.5.6 / 7 mengatakan:
Untuk keperluan operator-operator ini, sebuah penunjuk ke objek yang bukan merupakan elemen dari array berperilaku sama dengan sebuah penunjuk ke elemen pertama dari array yang panjangnya dengan tipe objek sebagai tipe elemennya.
Jadi menambahkan nol &main
akan baik-baik saja (tapi tidak banyak digunakan).
main
C ++.