2012-02-13 8 views

उत्तर

26

वृद्धि और गिरावट के बीच कोई आदेश नहीं है।हालांकि, * ऑपरेटर p++ के परिणाम पर लागू होता है, जो वृद्धि से पहले p का मूल मान है।

+0

"बाद में वृद्धि और पोस्ट-कमी ऑपरेटर अपने ऑपरेंड के मूल्य को 1 तक बढ़ाते हैं (या घटाते हैं), लेकिन इसका मूल्य अभिव्यक्ति वृद्धि (या कमी) ऑपरेशन से पहले ऑपरेंड का मूल मूल्य है "https://en.wikipedia.org/wiki/Increment_and_decrement_operators – Blas

3

को देखते हुए q = *p++;, क्ष मूल्य कि पी वेतन वृद्धि से पहले की ओर इशारा किया जाता है बढ़ाने से पहले के बाद 1) सूचक पी के मूल्य में भिन्नता: यह है। यह कहने का एक और तरीका यह है कि अभिव्यक्ति का मूल्य *p++ वह मान है जो पी बढ़ने से पहले इंगित करता है।

+0

यह '* पी', वृद्धि 'पी' पा सकता है और' q' – asaelr

+0

@asaelr पर '* p' (जो पहले गणना की गई) का मान असाइन करता है यह एक उचित बिंदु है कि असाइनमेंट वास्तव में वृद्धि के बाद हो सकता है, लेकिन प्रभाव वही है: पी बढ़ने से पहले q को * पी का मान प्राप्त होता है। – Caleb

+0

प्रभाव वही है, लेकिन सवाल यह था कि पहले क्या होता है। – asaelr

2

पोस्टफ़िक्स ++ और - ऑपरेटरों को अनिवार्य रूप से उपसर्ग एकल ऑपरेटरों की तुलना में अधिक पूर्वता है। इसलिए, * पी ++ * (पी ++) के बराबर है; यह पी बढ़ता है, और उस मूल्य को वापस करता है जो पी को बढ़ाए जाने से पहले इंगित करता है।

मूल्य बढ़ाने के लिए पी, उपयोग (* पी) ++ द्वारा की ओर इशारा किया (या शायद ++ * p, अगर पक्ष प्रभाव के मूल्यांकन के क्रम आवश्यक नहीं है)।

3

इसे आज़माएं। कार्यक्रम

#include <stdio.h> 

int main(void) { 
    int p[2]; 
    int *q = p; 
    p[0] = 10; 
    p[1] = 100; 

    printf("%d\n", *q++); 
    printf("%d\n", *q); 

    return 0; 
} 

प्रिंट

10 
100 

दिखा रहा है कि ++p पर लागू होता है, *p के लिए नहीं, और कहा कि वेतन वृद्धि भिन्नता के बाद होता है।

संपादित: (धन्यवाद मुझे समझाने कश्मीर & आर बाहर निकलने के लिए के लिए @EricLippert करने के लिए)

इतना ही नहीं भी हो सकते हैं एक होता है-के बाद संबंध है, लेकिन कश्मीर & आर पेज 203 के अनुसार, वहाँ होना चाहिए:

एक पोस्टफिक्स अभिव्यक्ति एक ++ या - ऑपरेटर के बाद एक पोस्टफिक्स अभिव्यक्ति है। अभिव्यक्ति की अभिव्यक्ति का मूल्य ऑपरेंड का मान है। के बाद मूल्य का उल्लेख किया है, संकार्य वृद्धि की जाती है (++) या कम कर (-) द्वारा 1.

(जोर मेरा)

दी, मैं नहीं मानता कि कश्मीर & आर मल्टीथ्रेडिंग की उपस्थिति में सी के अर्थशास्त्र के बारे में कुछ भी कहता है (Wikipedia के अनुसार 1 99 5 में पर्थ्रेड विनिर्देश जारी किया गया था), लेकिन एकल-थ्रेडेड प्रोग्राम के लिए & आर बहुत स्पष्ट है।

+4

यहां एक पल पकड़ो। ** सी ** में निश्चित रूप से "संबंध के बाद होता है" संबंध हो सकता है; चाहे संकलक का कार्यान्वयन विवरण है या नहीं। एक सी संकलक के पास अनुक्रम बिंदु के भीतर दुष्प्रभावों को क्रमबद्ध करने का तरीका चुनने में व्यापक विवेकाधिकार होता है, और यदि यह चाहें तो यह सब कुछ के बाद ++ के दुष्प्रभाव का चयन कर सकता है। एक सी # कंपाइलर में समान अक्षांश नहीं है; सी # विनिर्देश ठीक उसी बारे में बहुत स्पष्ट है जब उस दुष्प्रभाव को देखा जाना चाहिए। (निष्पादन के एक धागे के भीतर देखा गया है; जिस क्रम में एक और धागा साइड इफेक्ट को देखता है वह निर्दिष्ट नहीं है।) –

11

operators table में, आप देख सकते हैं कि प्रत्यय ऑपरेटर ++* यूनरी ऑपरेटर से अधिक स्थान है।

इसलिए, *p++ वृद्धि p (और नहीं *p), और मूल्य वापस अगर पता है कि p वेतन वृद्धि से पहले निहित (क्योंकि यह suffix ++ है)।

लेकिन आदेश कार्यान्वयन-निर्भर है। यह dereferencing p से शुरू हो सकता है, और फिर इसे बढ़ा सकता है, और यह p का पुराना मान संग्रहीत कर सकता है, इसे बढ़ा सकता है, और उसके बाद पुराने मान को कम कर सकता है।

संबंधित मुद्दे