सवाल सी ++ में "->" ऑपरेटर क्या है?


पढ़ने के बाद सी ++ / एसटीएल की छिपी हुई विशेषताएं और डार्क कॉर्नर पर comp.lang.c++.moderated, मैं पूरी तरह से हैरान था कि निम्नलिखित स्निपेट संकलित और विजुअल स्टूडियो 2008 और जी ++ 4.4 दोनों में काम किया।

यहां कोड है:

#include <stdio.h>
int main()
{
    int x = 10;
    while (x --> 0) // x goes to 0
    {
        printf("%d ", x);
    }
}

मुझे लगता है कि यह सी है, क्योंकि यह जीसीसी में भी काम करता है। यह मानक में परिभाषित कहां है, और यह कहां से आया है?


7782


मूल


या यहां तक ​​कि केवल उचित दूरी ... मुझे नहीं लगता कि मैंने कभी भी चर के बीच एक जगह देखी है और या तो ++ या -- इससे पहले कि ... - Matthew Scharley
यह "जाता है" ऑपरेटर वापस किया जा सकता है (0 <- x)। और वहां "रन टू ऑपरेटर" (0 <---- x) भी है। गीज़, सबसे मजेदार चीज जिसे मैंने कभी सी ++ वाक्यविन्यास = के बारे में सुना है) प्रश्न के लिए +1। - SadSido
काफी हद तक पर्याप्त है, हालांकि व्याख्या बहुत गलत है, यह वर्णन करता है कि कोड सही तरीके से क्या करता है। :) - Noldorin
नई वाक्यविन्यास संभावनाओं की कल्पना करो: #define upto ++<, #define downto -->। यदि आप बुरा महसूस कर रहे हैं, तो आप कर सकते हैं #define for while( तथा #define do ) { (तथा #define done ;}) और लिखा for x downto 0 do printf("%d\n", x) done ओह मानवता... - Chris Lutz
कोडिंग के एक नए नए अभिव्यक्तिपूर्ण तरीके की संभावना को खोलता है, इसके लिए कुछ संकलक चेतावनियों को बलिदान देने के लायक है: बूल चेकनेटेटिव (int x) {वापसी x <0? सही गलत ); } - ttt


जवाब:


--> एक ऑपरेटर नहीं है। यह वास्तव में दो अलग ऑपरेटरों है, -- तथा >

सशर्त कोड कोड कमी xलौटने पर xमूल (कमी नहीं) मान है, और उसके बाद मूल मान की तुलना करता है 0 का उपयोग करते हुए > ऑपरेटर।

बेहतर समझने के लिए, कथन निम्नानुसार लिखा जा सकता है:

while( (x--) > 0 )

7479



फिर फिर, यह उस संदर्भ में किसी प्रकार के रेंज ऑपरेटर की तरह दिखता है। - Charles Salvia
यह कहकर कि एक्स को कम किया गया है और फिर 0 की तुलना में यह वही है जैसा कि x की तुलना में x की कमी हुई है - Charles Salvia
जावा में यह भी संकलित करता है :) - Steven Devijver
इसके लिए नाम, @ जे, खराब प्रोग्रामिंग शैली है :-) यह इस तथ्य से प्रमाणित है कि सवाल पहले स्थान पर पूछा गया था। ऑपरेटरों को उस चीज को पाठित करने के लिए और अधिक समझदारी होती है जो वे किसी भी असंबंधित की बजाय ऑपरेटिंग कर रहे हैं while (x-- > 0) अधिक उपयुक्त होगा। यह यह भी स्पष्ट करता है कि क्या हो रहा है (कम से कम एक निश्चित फ़ॉन्ट संपादक में) जिसका अर्थ है कि इस उत्तर में कोष्ठक आवश्यक नहीं होंगे। - paxdiablo
तो "->" ऑपरेटर को समझाने के लिए आपको "((" ऑपरेटर और "-)>" ऑपरेटर का उपयोग करना होगा? - Ira Baxter


या कुछ पूरी तरह से अलग के लिए ... एक्स 0 स्लाइड

while (x --\
            \
             \
              \
               > 0)
     printf("%d ", x);

इतना गणितीय नहीं है, लेकिन ... हर तस्वीर एक हजार शब्द पेंट करता है। ...


2382



क्षमा करें, मुझे यह नहीं मिला। यह कैसे काम करता है? - mafu
@ mafutrct - जैसा कि मुझे याद है कि सी में सी सिर्फ अगली पंक्ति को जोड़ती है जैसे कि लाइन ब्रेक नहीं था। यहां मूल रूप से कुछ भी नहीं है। - Hogan
आईआईआरसी, के एंड आर सी ने कमी ऑपरेटर में '' 'के बीच सफेद जगह की अनुमति दी, इस मामले में आप इसके बीच में बैकस्लाश हो सकते हैं, जो कि कूलर भी दिखेंगे। :) - Jules
@ अरनावबोरबोरा यह एक पुरानी अभिव्यक्ति है जिसका अर्थ है why waste words when a picture does a better job , इस संदर्भ में एक मजाक के रूप में इस्तेमाल किया। (वास्तव में 2 कीवर्ड हैं while तथा printf ) - unsynchronized
आह हाँ, अस्पष्ट स्लाइड ऑपरेटर। मैं कैसे भूल सकता हूं! - demonkoryu


यह एक बहुत ही जटिल ऑपरेटर है, यहां तक ​​कि आईएसओ / आईईसी जेटीसी 1 (संयुक्त तकनीकी समिति 1) सी ++ मानक के दो अलग-अलग हिस्सों में अपना विवरण रखा।

एक तरफ मजाक कर रहे हैं, वे दो अलग ऑपरेटरों हैं: -- तथा > क्रमशः §5.2.6 / 2 और सी ++ 03 मानक के §5.9 में वर्णित है।


2221





यह बराबर है

while (x-- > 0)

1142



हालांकि यह कोड को समझने में कई लोगों की मदद कर सकता है, लेकिन इसे ठीक से समझाने के लिए कुछ पंक्तियां सहायक होंगी। - Dukeling
@Dukeling x-- के लिए संक्षिप्त हाथ नोटेशन है x-1 - Albert Renshaw
@AlbertRenshaw मुझे यकीन है कि जिस साल की पुरानी टिप्पणी का आपने जवाब दिया था, इसका मतलब यह था कि इसका एक एकल ऑपरेटर नहीं है, बल्कि दो ऑपरेटर जो भ्रम की स्थिति में रखे गए थे, सहायक होंगे। - mah
@ mbomb007 क्षमा करें मेरा मतलब x- = 1 - देर से हाहा था - Albert Renshaw
@AlbertRenshaw लेकिन x -= 1 तथा x-- वही नहीं हैं ... अगर आप इसे लिखना चाहते हैं तो यह होना होगा while (x >= 0) { x -= 1; } - Krzysztof Karski


x विपरीत दिशा में शून्य तक भी तेजी से जा सकते हैं:

int x = 10;

while( 0 <---- x )
{
   printf("%d ", x);
}

8 6 4 2

आप तीर के साथ गति को नियंत्रित कर सकते हैं!

int x = 100;

while( 0 <-------------------- x )
{
   printf("%d ", x);
}

90 80 70 60 50 40 30 20 10

;)


861



कौन सा ऑपरेटिंग सिस्टम, इस प्रकार के आउटपुट जेनरेट किए गए, मैं एक उबंटू 12.04 का उपयोग कर रहा हूं जिसमें मुझे एक त्रुटि संदेश था - Bhuvanesh
हालांकि यह स्पष्ट होना चाहिए, सी ++ को पढ़ने वाले हर किसी के लिए यह पढ़ना: ऐसा मत करो। अगर आपको एक से अधिक की वृद्धि / कमी की आवश्यकता है तो बस संवर्धित असाइनमेंट का उपयोग करें। - Blimeo
"लेजर" के साथ शून्य। जबकि (0> - - - - - - - - - ---------- x) ... एक ही आउटपुट। - Samuel Danielson
@phord क्या आप सुनिश्चित हैं कि यह संकलित नहीं है? -> coliru.stacked-crooked.com/a/5aa89a65e3a86c98 - doc
@doc यह c ++ में संकलित करता है, लेकिन सी में नहीं। - phord


आईटी इस

#include <stdio.h>
int main(void){
     int x = 10;

     while( x-- > 0 ){ // x goes to 0

       printf("%d ", x);
     }

     return 0;
}

बस जगह चीजें मजाकिया लगती है, -- कमी और > तुलना करती है।


498





का उपयोग --> ऐतिहासिक प्रासंगिकता है। विच्छेदन (और अभी भी कुछ मामलों में है), x86 आर्किटेक्चर पर वृद्धि से तेज़ है। का उपयोग करते हुए --> बताता है कि x जा रहा है 0, और गणितीय पृष्ठभूमि वाले लोगों के लिए अपील।


372



बिल्कुल सही नहीं है। विचलन और वृद्धि एक ही समय लेती है, इसका लाभ यह है कि शून्य की तुलना एक चर के विरुद्ध तुलना की तुलना में बहुत तेज है। यह कई आर्किटेक्चर के लिए सच है, न केवल x86। जेडजेड निर्देश के साथ कुछ भी (शून्य अगर कूदें)। आपके आस-पास घूमने से कई "लूप" लूप मिल सकते हैं जो तुलना में चक्रों को बचाने के लिए पीछे लिखे गए हैं। यह x86 पर विशेष रूप से तेज़ है क्योंकि वैरिएबल को कम करने के कार्य को शून्य ध्वज उचित रूप से सेट किया गया है, ताकि आप चर को स्पष्ट रूप से तुलना किए बिना शाखा बना सकें। - burito
खैर, शून्य की ओर कमी का मतलब है कि आपको केवल 0 प्रति लूप पुनरावृत्ति के विरुद्ध तुलना करना होगा, जबकि एन प्रतिरूपण के साथ तुलना करना प्रत्येक पुनरावृत्ति के साथ तुलना करना है। पूर्व आसान हो जाता है (और कुछ आर्किटेक्चर पर, प्रत्येक डेटा रजिस्टर ऑपरेशन के बाद स्वचालित रूप से परीक्षण किया जाता है)। - Joey Adams
@burrito हालांकि मैं असहमत नहीं हूं, गैर-शून्य मानों पर सशर्त लूप आमतौर पर पूरी तरह से पूर्वानुमानित हो जाते हैं। - Duncan
वृद्धि और कमी सभी प्लेटफार्मों पर निश्चित रूप से तेज़ हैं (निश्चित रूप से x86 पर)। अंतर लूप अंत स्थिति का परीक्षण करने में है। यह देखने के लिए कि काउंटर शून्य तक पहुंच गया है, व्यावहारिक रूप से मुफ़्त है - जब आप कोई मान कम करते हैं, प्रोसेसर में एक शून्य ध्वज सेट किया जाता है और अंत स्थिति का पता लगाने के लिए आपको केवल उस ध्वज को जांचने की आवश्यकता होती है, जबकि जब आप एक तुलना ऑपरेशन में वृद्धि करते हैं तो अंत स्थिति से पहले आवश्यक होता है पता लगाया जा सकता है - lego
बेशक, यह सब इन दिनों मूक है, क्योंकि आधुनिक कंपाइलर्स स्वचालित रूप से वेक्टरिज़ और रिवर्स लूप कर सकते हैं। - Lambda Fairy


while( x-- > 0 )

यह कैसे पार्स किया गया है।


324





पूरी तरह से गीक, लेकिन मैं इसका उपयोग करूँगा:

#define as ;while

int main(int argc, char* argv[])
{
    int n = atoi(argv[1]);
    do printf("n is %d\n", n) as ( n --> 0);
    return 0;
}

292



मुझे आशा है कि मैं कभी भी आपके किसी भी स्रोत कोड में नहीं आऊंगा ... - mk12
@ एमके 12 यह स्रोत कोड नहीं है ... यह हाइरोग्लिफिक्स है :-) - raffian
@SAFX - यह पूरी तरह से हाइरोग्लिफिक्स के साथ होगा मिस्र के ब्रैकेट्स - mouviciel
यह संकलित नहीं करता है। सी पास्कल नहीं है, जहां का आंतरिक हिस्सा है do ... while एक कथन सूची है। सी में यह एक ब्लॉक है, इसलिए यह होना चाहिए do { ... } while। - user207421
@EJP यह संकलित करता है। वाक्यविन्यास है do statement while ( expression ) ;। ऐसा कहकर, मुझे उम्मीद है कि यह समझा जाता है कि मेरा मतलब मजाक के रूप में था। - Escualo


एक पुस्तक जिसे मैंने पढ़ा (मुझे सही ढंग से याद नहीं है) ने कहा: कंपाइलर्स सबसे बड़ी टोकन में अभिव्यक्तियों को पार्स करने का प्रयास करते हैं बाएं दाएं नियम का उपयोग करके।

इस मामले में, अभिव्यक्ति:

x-->0

सबसे बड़े टोकन के लिए पार्स:

token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0

एक ही नियम इस अभिव्यक्ति पर लागू होता है:

a-----b

पार्स के बाद:

token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b

मुझे उम्मीद है कि यह जटिल अभिव्यक्ति ^^ को समझने में मदद करता है


283



आपका दूसरा स्पष्टीकरण सही नहीं है। कंपाइलर देखेंगे a-----b और सोचो (a--)-- - b, जो संकलित नहीं करता है क्योंकि a-- एक लाभा वापस नहीं करता है। - Tim Leaf
साथ ही, x तथा -- दो अलग टोकन हैं। - Roland Illig
यह के रूप में जाना जाता है अधिकतम मच्छर। - RJFalconer
@ डॉक्टरक्टर: यह लेक्सर पास करता है। केवल अर्थपूर्ण पास उस त्रुटि को emmiting करने में सक्षम है। तो उसकी व्याख्या सही है। - v.oddou
जब तक आप सोचते हैं --> एक ऑपरेटर है (जो कि पूछे जाने वाले प्रश्न के द्वारा निहित है), यह उत्तर बिल्कुल उपयोगी नहीं है - आपको लगता है कि टोकन 2 है -->, न सिर्फ --। यदि आप उसे जानते हैं --> एक ऑपरेटर नहीं है, आपको शायद प्रश्न में कोड को समझने में कोई समस्या नहीं है, इसलिए, जब तक कि आपका कोई अलग प्रश्न न हो, मुझे सच में यकीन नहीं है कि यह कैसे उपयोगी हो सकता है। - Dukeling