Khái niệm thử thách này khá đơn giản. Tất cả bạn phải làm là viết một chương trình sẽ biên dịch thành cả C hợp lệ và C ++ hợp lệ! Vâng, có một số sản phẩm khai thác. Chương trình phải hành xử khác nhau khi được biên dịch trong mỗi ngôn ngữ. Chương trình phải có đầu ra khác nhau cho mỗi ngôn ngữ để được coi là "hành xử khác nhau".
Quy tắc
- Chương trình phải có cả C và C ++ hợp lệ
- Chương trình phải có các đầu ra khác nhau dựa trên ngôn ngữ được biên dịch.
#ifdef __cplusplus
hoặc các thủ thuật tiền xử lý "dễ dàng" khác không được khuyến khích! (Tuy nhiên, các hoạt động tiền xử lý khác là hoàn toàn tốt.)- Cố gắng không làm cho nó trông hoàn toàn rõ ràng rằng chương trình làm một cái gì đó khác nhau.
Đây là một cuộc thi nổi tiếng , vì vậy ai có giải pháp thú vị và đáng ngạc nhiên nhất sẽ chiến thắng. Chúc vui vẻ!
Thí dụ:
Tôi đã tạo chương trình của riêng mình để xem liệu điều này thậm chí có thể thực hiện được với các #ifdef
thủ thuật không:
#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;
}
Chương trình này xuất ra C++ rules!
khi được biên dịch trong C ++ và C++ stinks
khi được biên dịch trong C.
Giải trình:
Điều gây ra sự khác biệt giữa các ngôn ngữ là
tr()
chức năng. Nó tận dụng một trong những khác biệt giữa C và C ++, cụ thể là cách xử lý chữ char. Trong C, chúng được coi là số nguyên, vì vậysizeof('!')
trả về 4, trái ngược với 1 trong C ++. Phần((...+1)&1)
này chỉ là một phần của thao tác bitwise đơn giản sẽ trả về 1 nếusizeof('!')
trả về 4 và 0 nếu trả về 1. Số kết quả đó được nhân với số nguyên trong mảngt
và sau đó sản phẩm đó cuối cùng được thêm vào ký tự cụ thể được chuyển đổi. Trong C ++, sản phẩm sẽ luôn bằng 0, do đó chuỗiC++ rules!
vẫn không thay đổi. Trong C, sản phẩm sẽ luôn là giá trị trongt
và do đó chuỗi thay đổi thànhC++ stinks
.