[c++] सही और गलत मैक्रोज़ की अजीब परिभाषाएं


2 Answers

यह लिखने का एक और तरीका है

#define TRUE 1
#define FALSE 0

अभिव्यक्ति '/'/'/' स्वयं के '/' के चार मान को विभाजित करेगी, जो परिणामस्वरूप 1 देगी।

अभिव्यक्ति '-'-'-' स्वयं से '-' के चार मान को '-'-'-' करेगी, जो परिणामस्वरूप 0 देगी।

पूरे define अभिव्यक्तियों के चारों ओर ब्रैकेट्स गायब हैं, हालांकि इन मैक्रोज़ का उपयोग करके कोड में त्रुटियों का कारण बन सकता है। जय का जवाब बहुत अच्छी तरह से संबोधित करता है।

"वास्तविक जीवन" परिदृश्य का एक उदाहरण जहां ब्रैकेट को भूलना हानिकारक हो सकता है, इन मैक्रोज़ का संयुक्त उपयोग सी-स्टाइल कास्ट ऑपरेटर के साथ किया जाता है। अगर कोई उदाहरण के लिए सी ++ में इन अभिव्यक्तियों को bool करने का फैसला करता है:

#include <iostream>

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

int main() {
    std::cout << "True: " << (bool) TRUE << std::endl;
    std::cout << "False: " << (bool) FALSE << std::endl;
    return 0;
}

यहां हमें क्या मिलता है:

True: 0
False: -44

तो (bool) TRUE वास्तव में false मूल्यांकन करेगा, और (bool) FALSE true मूल्यांकन करेगा।

Question

मैंने कोडिंग पुस्तक में निम्नलिखित मैक्रो परिभाषाएं देखी हैं।

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

वहां कोई स्पष्टीकरण नहीं था।

कृपया मुझे बताएं कि यह TRUE और FALSE रूप में कैसे काम करेगा।




Jay पहले ही जवाब दिया है कि इन अभिव्यक्तियों के मूल्य 0 और 1

इतिहास के लिए, इन अभिव्यक्तियों '/'/'/' और '-'-'-' 1 9 84 में पहली अंतर्राष्ट्रीय Obfuscated सी कोड प्रतियोगिता की प्रविष्टियों में से एक से आते हैं:

int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}

( here कार्यक्रम से लिंक here , इस कार्यक्रम का उपरोक्त आईओसीसीसी पृष्ठ में क्या किया गया है इसका एक संकेत है।)

अगर मुझे सही और यादों के लिए obfuscated मैक्रोज़ के रूप में सही ढंग से याद आती है तो डॉन लिब्स (1 99 3) द्वारा "Obfuscated C और अन्य रहस्यों" पुस्तक में भी शामिल किया गया था।




यह True और False लिए मैक्रोज़ लिखने के लिए उल्लसित तरीका है।

जैसा कि कई स्पष्टीकरण प्रदान किए गए हैं / इसका अर्थ है 1 बाइट संख्या (एएससीआईआई के मुताबिक) जब खुद से विभाजित होता है तो यह आपको 1 जो True और इसी तरह व्यवहार करेगा - फिर एक बाइट संख्या है जब उसी मूल्य को घटाया जाता है तो यह आपको 0 देगा false रूप में व्याख्या की जानी चाहिए

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

इसलिए हम किसी भी चार को पसंद करते हुए / या - प्रतिस्थापित कर सकते हैं, उदाहरण के लिए:

#define TRUE  '!'/'!'
#define FALSE 'o'-'o'

मूल अभिव्यक्ति के समान अर्थ रखेंगे।




Related