C के अनुसार, PostIncrement(a++) > Dereference(*) > Assignment(=) जब मैं इसे c स्निपेट के नीचे निष्पादित करता हूं,

#include <stdio.h>

int main(){

    int arr[]= {1,2,3};
    int *p = a;

    *p++ = 3;

    for(int i=0;i<3;i++){
        printf("%d ",arr[i]);  
    }

}

आउटपुट: 3 2 3

लेकिन अगर हम इस कथन में वरीयता क्रम लागू करते हैं,

 *p++ = 3;

बयान का मूल्यांकन निम्नलिखित क्रम में किया जाएगा:

  1. p++ का मूल्यांकन किया जाएगा
  2. *p संदर्भित हो जाएगा।
  3. फिर असाइनमेंट ऑपरेटर का उपयोग करके 3 *p को असाइन किया जाएगा

यदि हम उपरोक्त क्रम को लागू करते हैं, तो p जो सरणी गिरफ्तारी की शुरुआत की ओर इशारा कर रहा है, पहले वृद्धि होगी और सरणी के दूसरे तत्व को इंगित करेगा। फिर दूसरे तत्व का पता डीरेफेरेंस हो जाएगा और फिर 3 को दूसरे इंडेक्स को सौंपा जाएगा। तो हमारा अपेक्षित आउटपुट 1 3 3 होना चाहिए लेकिन मुझे जो आउटपुट मिला वह 3 2 3 है।

मुझे पता है कि मेरा अपेक्षित आउटपुट सही नहीं है। यदि आप संकलक के आउटपुट के इस मामले में मूल्यांकन के क्रम की व्याख्या करते हैं तो यह मददगार होगा।

0
Allan 18 अप्रैल 2021, 15:02

3 जवाब

सबसे बढ़िया उत्तर

पोस्ट-इन्क्रीमेंट एक्सप्रेशन का परिणाम ऑपरेंड का मान होता है पहले इसे इंक्रीमेंट किया जाता है। इस प्रकार, भले ही ++ में *p++, वास्तव में, * की तुलना में उच्च प्राथमिकता है, बाद वाले को p++ अभिव्यक्ति के परिणाम पर लागू किया जाता है, जो इस प्रकार है अभी उल्लेख किया गया है, p का प्रारंभिक मान।

2
Adrian Mole 18 अप्रैल 2021, 12:06

"बयान का मूल्यांकन निम्नलिखित क्रम में किया जाएगा:

पी ++ का मूल्यांकन किया जाएगा * पी को संदर्भित किया जाएगा। फिर 3 को असाइनमेंट ऑपरेटर का उपयोग करके *p को सौंपा जाएगा"

पोस्ट वेतन वृद्धि ऑपरेटर उस तरह काम नहीं करता है। बेहतर समझ के लिए आप ऐसा मान सकते हैं।

  • जब पी ++ का मूल्यांकन किया जाता है, तो सबसे पहले, इसका वर्तमान मूल्य अस्थायी स्थान पर संग्रहीत किया जाता है, फिर वृद्धि होती है।
  • शेष सभी ऑपरेशन अस्थायी स्थान पर संग्रहीत मूल्य पर किए जाते हैं।
  • बाद के बयानों के लिए वृद्धिशील मूल्य का उपयोग किया जाता है।
1
EMS 18 अप्रैल 2021, 12:10

प्राथमिकता केवल ऑपरेंड के साथ ऑपरेटरों के समूह को निर्धारित करती है - यह उस क्रम को नियंत्रित नहीं करती है जिसमें अभिव्यक्तियों का मूल्यांकन किया जाता है। वरीयता नियम केवल यह निर्धारित करते हैं कि

*p++ = 3;

के रूप में पार्स करना चाहिए

*(p++) = 3; // as opposed to (*p)++ = 3 or *(p++ = 3)

ऐसा नहीं है कि संचालन एक विशिष्ट क्रम में निष्पादित किया जाता है।

++ और –– ऑपरेटरों का एक परिणाम और एक दुष्प्रभाव होता है। पोस्टफ़िक्स ++ का परिणाम ऑपरेंड का वर्तमान मान है; साइड इफेक्ट ऑपरेंड को बढ़ाना है। आपकी अभिव्यक्ति तार्किक रूप से के बराबर है

tmp = p;
*tmp = 3;
p = p + 1;

इस चेतावनी के साथ कि *tmp को असाइनमेंट और ptr का अपडेट किसी भी क्रम में हो सकता है, और उन्हें समानांतर में इंटरलीव या निष्पादित भी किया जा सकता है।

3
John Bode 18 अप्रैल 2021, 16:00