चलो बाएं से दाएं अभिव्यक्ति के माध्यम से चलते हैं:
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
पहली बात जो मैंने नोटिस की, वह यह है कि हम टर्नेरी ऑपरेटर के उपयोग से उपयोग कर रहे हैं ?
। तो उपसर्ग:
0xFULL ? '\0' : -1
कह रहा है, "अगर 0xFULL
गैर शून्य, वापसी है '\0'
, अन्यथा -1
। 0xFULL
साथ हेक्साडेसिमल शाब्दिक है अहस्ताक्षरित लंबे समय से लंबे प्रत्यय - जिसका अर्थ यह प्रकार का एक हेक्साडेसिमल शाब्दिक है unsigned long long
कि वास्तव में बात करें, क्योंकि ऐसा नहीं करता। 0xF
एक नियमित पूर्णांक के अंदर फिट कर सकते हैं।
साथ ही, टर्नरी ऑपरेटर दूसरे और तीसरे शब्दों के प्रकारों को उनके सामान्य प्रकार में परिवर्तित करता है। '\0'
तब परिवर्तित किया जाता है int
, जो कि बस है 0
।
का मान 0xF
शून्य से बड़ा है, इसलिए यह गुजरता है। अब अभिव्यक्ति बन जाती है:
a[ 0 :>>>=a<:!!0X.1P1 ]
अगला, :>
एक डिग्राफ है । यह एक निर्माण है जो कि विस्तार करता है ]
:
a[0 ]>>=a<:!!0X.1P1 ]
>>=
हस्ताक्षरित सही शिफ्ट ऑपरेटर है, हम a
इसे स्पष्ट करने के लिए बाहर से अंतरिक्ष कर सकते हैं ।
इसके अलावा, <:
एक डिग्राफ है जिसका विस्तार है [
:
a[0] >>= a[!!0X.1P1 ]
0X.1P1
एक घातांक के साथ एक हेक्साडेसिमल शाब्दिक है। लेकिन मूल्य का कोई फर्क नहीं पड़ता, जो !!
कुछ भी गैर-शून्य है वह सच है। 0X.1P1
है 0.125
जो गैर-शून्य है, तो यह हो जाता है:
a[0] >>= a[true]
-> a[0] >>= a[1]
>>=
पर हस्ताक्षर किए सही पारी ऑपरेटर है। यह ऑपरेटर के दाईं ओर के अपने बिट्स को आगे की ओर मोड़कर अपने बाएं ऑपरेंड के मूल्य को बदल देता है। 10
बाइनरी में है 1010
। तो यहाँ कदम हैं:
01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000
>>=
इसके संचालन का परिणाम देता है, इसलिए जब तक शिफ्टिंग a[0]
हर बार गैर-शून्य रहती है तब तक इसके बिट्स को एक-एक करके दाएं से शिफ्ट किया जाता है। चौथा प्रयास वह a[0]
होता है 0
, जहां लूप कभी दर्ज नहीं होता है।
परिणामस्वरूप, ?
तीन बार मुद्रित किया जाता है।