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
.
sumber
Jawaban:
Apakah kue itu bohong?
Karena ada banyak perdebatan tentang apakah kue itu bohong atau tidak, saya menulis program ini untuk menjawab pertanyaan yang kontroversial ini.
Apa hasilnya nanti?
C:
C ++:
sumber
Hanya beberapa bools
http://codepad.org/dPFou20W
http://codepad.org/Ko6K2JBH
sumber
Saya bisa melakukan ini dengan program 3 baris tetapi kemudian akan menjadi jelas mengapa menghasilkan hasil yang berbeda untuk C dan C ++. Jadi alih-alih saya mulai menulis program yang lebih besar dengan beberapa stegonografi yang mendapat hasil berbeda dalam C dan C ++ ...
Anda perlu menentukan baris perintah. Ketika saya menjalankannya pada salinan gcc saya, saya mendapatkan hasil ini:
Bagaimana hal-hal buruk bisa terjadi?
sumber
sumber
Yang ini bekerja dengan C ++ 11 dan yang lebih baru dan C apa pun sejauh ini (sebelum C11).
Lihat di sini: C ++: http://ideone.com/9Gkg75 dan C: http://ideone.com/eECSmr
Itu mengeksploitasi fakta bahwa dalam C ++ 11 kata kunci otomatis mendapat makna baru. Jadi, sementara di C adalah tipe int disimpan di lokasi OTOMATIS itu adalah tipe char di C ++ 11.
EDIT: Seperti yang dikatakan FUZxxl int implisit telah dihapus di C11.
sumber
int
aturan implisit .Program yang menggambarkan diri sendiri
Ini akan mencetak "Program ini ditulis dalam bahasa C!" jika dikompilasi menggunakan kompiler C; jika tidak, itu akan mencetak "Program ini ditulis dalam C ++!". Perlu kompiler C99.
sumber