Konsep tantangan ini cukup sederhana. Yang harus Anda lakukan adalah menulis program yang akan dikompilasi sebagai C yang valid dan C ++ yang valid! Ya, ada beberapa tangkapan. Program harus berperilaku berbeda saat dikompilasi dalam setiap bahasa. Program harus memiliki keluaran yang berbeda untuk setiap bahasa agar dianggap "berperilaku berbeda".
Aturan
- Program harus C dan C ++ yang valid
- Program harus memiliki keluaran yang berbeda berdasarkan bahasa yang dikompilasi.
#ifdef __cplusplusatau trik preprosesor "mudah" lainnya tidak disarankan! (Namun, operasi preprosesor lainnya baik-baik saja.)- Cobalah untuk tidak membuatnya terlihat jelas bahwa program melakukan sesuatu yang berbeda.
Ini adalah kontes popularitas , jadi siapa pun yang memiliki solusi paling menarik dan mengejutkan akan menang. Selamat bersenang-senang!
Contoh:
Saya membuat program saya sendiri untuk melihat apakah ini bahkan mungkin dilakukan dengan #ifdeftrik:
#include <stdio.h>
#include <string.h>
char *m="C++ rules!";
int t[11]={0,0,0,0,1,-1,-3,9,-8,82,0};
char tr(char c,int i)
{
return c+((sizeof('!')+1)&1)*t[i];
}
int main()
{
int i = 0;
for(;i<strlen(m);i++)
{
printf("%c",tr(m[i],i));
}
printf("\n");
return 0;
}
Output program ini C++ rules!ketika dikompilasi dalam C ++ dan C++ stinksketika dikompilasi dalam C.
Penjelasan:
Apa yang menyebabkan perbedaan antar bahasa adalah
tr()fungsinya. Itu mengambil keuntungan dari salah satu perbedaan antara C dan C ++, khususnya, bagaimana literal char diperlakukan. Dalam C, mereka diperlakukan sebagai bilangan bulat, jadisizeof('!')mengembalikan 4, yang bertentangan dengan 1 di C ++. Bagian((...+1)&1)ini hanya bagian dari operasi bitwise sederhana yang akan mengembalikan 1 jikasizeof('!')mengembalikan 4, dan 0 jika mengembalikan 1. Angka yang dihasilkan dikalikan dengan int dalam arraytdan kemudian produk itu akhirnya ditambahkan ke karakter spesifik yang sedang diubah. Dalam C ++ produk akan selalu nol, sehingga stringC++ rules!tetap tidak berubah. Dalam C, produk akan selalu menjadi nilait, dan string berubah menjadiC++ stinks.