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 __cplusplus
atau 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 #ifdef
trik:
#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++ stinks
ketika 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 arrayt
dan 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
.