Bu zorluğun konsepti oldukça basittir. Yapmanız gereken tek şey hem geçerli C hem de geçerli C ++ olarak derleyecek bir program yazmak! Eh, bazı yakalamalar var. Program her dilde derlendiğinde farklı davranmalıdır. Program, “farklı davranmak” olarak değerlendirilmek için her dil için farklı çıktılara sahip olmalıdır.
kurallar
- Program geçerli C ve C ++ olmalı
- Program, derlendiği dile göre farklı çıktılara sahip olmalıdır.
#ifdef __cplusplus
veya diğer "kolay" önişlemci numaralar önerilmez! (Diğer önişlemci işlemleri olsa da gayet iyi.)- Programın farklı bir şey yaptığını tamamen açık göstermemeye çalışın.
Bu bir popülerlik yarışmasıdır , bu nedenle en ilginç ve şaşırtıcı çözümü olan kim kazanır. İyi eğlenceler!
Örnek:
Bunun #ifdef
püf noktaları ile yapılmasının mümkün olup olmadığını görmek için kendi programımı oluşturdum :
#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;
}
Bu program C++ rules!
C ++ 'da ve C' C++ stinks
de derlendiğinde çıktı verir.
Açıklama:
Diller arasındaki farka neden olan
tr()
fonksiyondur. C ve C ++ arasındaki farklardan bir tanesinden, özellikle char değişmezlerine nasıl davranıldığından faydalanır. C'de, tamsayı olarak değerlendirilir, bu nedenlesizeof('!')
C ++ 'da 1 yerine 4 döndürür.((...+1)&1)
Eğer bölümü 1 dönmek basit bir bit-bazında işlemin sadece bir parçasısizeof('!')
döner 4 ve 0 numarayı olarak dizide ints ile çarpılır bu 1. dönerset
ürün son olarak belirli bir karakter dönüştürülmüş olan ilave edilmesidir ve daha sonra. C ++ 'da ürün daima sıfır olacaktır, bu yüzden diziC++ rules!
değişmeden kalır. C'de, ürün her zaman değeri olacaktırt
ve bu nedenle dize değişirC++ stinks
.