แนวคิดของความท้าทายนี้ค่อนข้างง่าย สิ่งที่คุณต้องทำคือเขียนโปรแกรมที่จะรวบรวมเป็นทั้ง C ที่ถูกต้องและ C ++ ที่ถูกต้อง! มีบางอย่างที่จับได้ โปรแกรมจะต้องทำงานแตกต่างกันเมื่อรวบรวมในแต่ละภาษา โปรแกรมจะต้องมีเอาต์พุตที่แตกต่างกันสำหรับแต่ละภาษาเพื่อที่จะได้รับการพิจารณาว่า "ประพฤติแตกต่างกัน"
กฎระเบียบ
- โปรแกรมจะต้องเป็นทั้ง C และ C ++ ที่ถูกต้อง
- โปรแกรมจะต้องมีผลลัพธ์ที่แตกต่างกันขึ้นอยู่กับภาษาที่รวบรวมไว้
#ifdef __cplusplus
หรือเทคนิค preprocessor "ง่าย" อื่น ๆ จะหมดกำลังใจ! (การดำเนินการตัวประมวลผลล่วงหน้าอื่น ๆ นั้นใช้ได้อย่างสมบูรณ์แบบ)- พยายามอย่าทำให้มันดูชัดเจนว่าโปรแกรมทำสิ่งที่แตกต่าง
นี่คือการประกวดความนิยมดังนั้นใครก็ตามที่มีทางออกที่น่าสนใจและน่าประหลาดใจมากที่สุดชนะ มีความสุข!
ตัวอย่าง:
ฉันสร้างโปรแกรมของตัวเองเพื่อดูว่ามันเป็นไปได้ที่จะทำโดยใช้#ifdef
เทคนิค:
#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;
}
โปรแกรมนี้แสดงผลC++ rules!
เมื่อรวบรวมใน C ++ และC++ stinks
เมื่อรวบรวมใน C
คำอธิบาย:
สิ่งที่ทำให้เกิดความแตกต่างระหว่างภาษาคือ
tr()
ฟังก์ชั่น ใช้ประโยชน์จากหนึ่งในความแตกต่างระหว่าง C และ C ++ โดยเฉพาะอย่างยิ่งวิธีปฏิบัติต่อตัวอักษรถ่าน ใน C พวกเขาจะถือว่าเป็นจำนวนเต็มดังนั้นsizeof('!')
ส่งกลับ 4 เมื่อเทียบกับ 1 ใน C ++((...+1)&1)
ส่วนหนึ่งเป็นเพียงส่วนหนึ่งของการดำเนินการระดับบิตง่ายที่จะกลับ 1 ถ้าsizeof('!')
ผลตอบแทน 4 และ 0 ถ้ามันกลับ 1. ส่งผลให้จำนวนคูณ ints ในอาร์เรย์t
แล้วว่าผลิตภัณฑ์เป็นที่สุดที่เพิ่มให้กับตัวละครที่เฉพาะเจาะจงถูกเปลี่ยน ใน C ++ ผลิตภัณฑ์จะเป็นศูนย์เสมอดังนั้นสตริงC++ rules!
จะยังคงไม่เปลี่ยนแปลง ใน C ผลิตภัณฑ์ที่จะเป็นค่าในและเพื่อให้สายการเปลี่ยนแปลงt
C++ stinks