मैंने निम्नलिखित मैक्रो परिभाषाओं को एक कोडिंग पुस्तक में देखा है।
#define TRUE '/'/'/'
#define FALSE '-'-'-'
वहां कोई स्पष्टीकरण नहीं था।
कृपया मुझे समझा कि कैसे इन के रूप में काम करेंगे TRUE
और FALSE
।
मैंने निम्नलिखित मैक्रो परिभाषाओं को एक कोडिंग पुस्तक में देखा है।
#define TRUE '/'/'/'
#define FALSE '-'-'-'
वहां कोई स्पष्टीकरण नहीं था।
कृपया मुझे समझा कि कैसे इन के रूप में काम करेंगे TRUE
और FALSE
।
जवाबों:
चलो देखते हैं: '/' / '/'
साधन char
शाब्दिक /
, से विभाजित char
शाब्दिक '/'
ही। परिणाम एक है, जो उचित लगता है TRUE
।
और शाब्दिक '-' - '-'
अर्थ है , स्वयं से घटाया हुआ। यह शून्य ( ) है।char
'-'
FALSE
इसके साथ दो समस्याएं हैं: पहला, यह पठनीय नहीं है। का उपयोग करना 1
और 0
बिल्कुल बेहतर है। इसके अलावा, जैसा कि टार्टनलामा और केरेकेएसबी ने बताया है, यदि आप कभी भी उस परिभाषा का उपयोग करने जा रहे हैं, तो कृपया उनके चारों ओर कोष्ठक जोड़ें, ताकि आपको कोई आश्चर्य न हो:
#include <stdio.h>
#define TRUE '/'/'/'
#define FALSE '-'-'-'
int main() {
printf ("%d\n", 2 * FALSE);
return 0;
}
यह char
शाब्दिक '-'
(मेरे सिस्टम पर 45) के मूल्य को प्रिंट करेगा ।
कोष्ठक के साथ:
#define TRUE ('/'/'/')
#define FALSE ('-'-'-')
कार्यक्रम सही ढंग से शून्य प्रिंट करता है, भले ही यह एक पूर्णांक द्वारा एक सत्य मूल्य को गुणा करने के लिए बहुत अधिक समझ में नहीं आता है, लेकिन यह सिर्फ उस तरह के अप्रत्याशित कीड़े का एक उदाहरण है जो आपको अपने मैक्रोज़ को छोटा नहीं करने पर काट सकता है।
if
गुणा करने के बजाय स्पष्ट (और वैचारिक रूप से समझ में आने वाला) होगा TRUE
।
notx = TRUE- x;
और ठीक काम करता है। सिवाय इसके कि TRUE-FALSE
-44 (ASCII को मानते हुए)
यह लिखने का एक और तरीका है
#define TRUE 1
#define FALSE 0
अभिव्यक्ति स्वयं '/'/'/'
के चार मूल्य को विभाजित करेगी '/'
, जो परिणाम के रूप में 1 देगी।
अभिव्यक्ति स्वयं '-'-'-'
के चार मूल्य को बदल '-'
देगी, जो परिणाम के रूप में 0 देगा।
संपूर्ण define
अभिव्यक्तियों के आसपास की ब्रैकेट गायब हैं, हालांकि, इन मैक्रोज़ का उपयोग करके कोड में त्रुटियां हो सकती हैं। जय का जवाब बहुत अच्छी तरह से मानता है।
"वास्तविक जीवन" परिदृश्य का एक उदाहरण जहां कोष्ठक को भूल जाना हानिकारक हो सकता है, सी-स्टाइल ऑपरेटर के साथ इन मैक्रोज़ का संयुक्त उपयोग। अगर कोई bool
उदाहरण के लिए C ++ में इन भावों को डालने का फैसला करता है :
#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
।
यह लिखने के बराबर है
#define TRUE 1
#define FALSE 0
'/'/'/'
वास्तव में जो अभिव्यक्ति करता है वह चरित्र को विभाजित करता है /
(जो भी इसका संख्यात्मक मान है), इसलिए यह बन जाता है 1
।
इसी तरह, अभिव्यक्ति '-'-'-'
चरित्र -
को खुद से घटाती है और उसका मूल्यांकन करती है 0
।
लिखना बेहतर होगा
#define TRUE ('/'/'/')
#define FALSE ('-'-'-')
अन्य उच्च-पूर्वता ऑपरेटरों के साथ उपयोग किए जाने पर मूल्यों के आकस्मिक परिवर्तन से बचने के लिए।
जे पहले से ही उत्तर क्यों इन भाव के मूल्यों हैं 0
और 1
।
इतिहास के लिए, ये अभिव्यक्तियाँ '/'/'/'
और 1984 में 1 अंतर्राष्ट्रीय Obfuscated C कोड प्रतियोगिता'-'-'-'
की प्रविष्टियों में से एक हैं :
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);}
( यहां कार्यक्रम से लिंक करें , ऊपर आईओसीसीसीसी पृष्ठ में यह कार्यक्रम क्या करता है, इसका एक संकेत है।)
इसके अलावा, अगर मैं के लिए समझ से परे मैक्रो के रूप में इन सही ढंग से भाव याद TRUE
और FALSE
भी कवर किया गया "अस्पष्ट सी और अन्य रहस्यों" डॉन लाइब्स (1993) द्वारा पुस्तक।
यह True
और के लिए मैक्रोज़ लिखने के लिए प्रफुल्लित करने वाला तरीका है False
।
जैसा कि कई स्पष्टीकरण प्रदान किए गए हैं, /
एक 1 बाइट संख्या (एएससीआईआई के अनुसार) का अर्थ है जब स्वयं द्वारा विभाजित किया जाता है 1
जो आपको दिया जाएगा True
और इसी तरह -
फिर से एक बाइट नंबर है, जब उसी मूल्य को घटाया जाता है 0
जो आपको देता है जिसकी व्याख्या की जाएगीfalse
#define TRUE '/'/'/'
#define FALSE '-'-'-'
इसलिए हम उदाहरण के लिए किसी भी चार्ट को बदल सकते हैं /
या उसके -
साथ कर सकते हैं :
#define TRUE '!'/'!'
#define FALSE 'o'-'o'
मूल अभिव्यक्ति के समान ही अर्थ रखेंगे।
चलो सच के साथ शुरू करते हैं। आप इसे पढ़ सकते हैं '/' / '/'
, जिसका अर्थ है "वर्ण" / 'वर्ण से विभाजित "/'। चूंकि प्रत्येक वर्ण, C में, एक संख्यात्मक मान है (एक बाइट पर), इसे "उसी चरित्र के ASCII मान से विभाजित" / "ASCII वर्ण का मान" के रूप में पढ़ा जा सकता है, जिसका अर्थ है 1 (क्योंकि, जाहिर है,) x / x 1) है। इसलिए, TRUE
1 है।
इसके लिए FALSE
, इसका एक ही तर्क है: '-'-'-'
पढ़ता है '-' - '-'
, जिसका अर्थ है "- 'का ASCII मान' - 'का ASCII मान' -", जो 0. है, इसलिए FALSE
0 है।
यह स्पष्ट रूप से बताने का एक बुरा तरीका है।
'/'/'/'
लिए 1 है , चाहे वह (ASCII में हो), या (जैसा कि EBCDIC में है), या कोई अन्य मूल्य। '/' == 47
'/' == 97
'/'
लिए मैप नहीं किया जा सकता है 0
। यह मान अशक्त वर्ण के लिए आरक्षित है।