2010-02-23 15 views
6

संभावित डुप्लिकेट:
printf(“%d %d %d\n”,++a, a++,a) output problem
Parameter evaluation order before a function calling in Cprintf और ++ ऑपरेटर

#include<stdio.h> 
main() 
{ 
    int a=10; 
    printf("\n %d %d", a, a++); //11 10 
    a=10; 
    printf("\n %d %d", a++, a); //10 11 
    a=10; 
    printf("\n %d %d %d ", a, a++,++a); //12 11 12 
} 

इस चलाने के बाद मैं उत्पादन टिप्पणी में दिया गया। जहां तक ​​मुझे पता है कि पहले आउटपुट की उम्मीद है क्योंकि प्रिंटफ का निष्पादन दाएं से बाएं हो जाता है लेकिन दूसरे और तीसरे

+0

डुप्लिकेट: http://stackoverflow.com/questions/1270370/printfd-ddnaaa-output-problem – Vladimir

+0

अच्छा सवाल के लिए +1 .. मैं पता नहीं था यह * printf पर तर्कों की गणना इस तरह – Earlz

+0

में काम किया * * printf * के निष्पादन का हिस्सा नहीं है। * Printf * निष्पादन शुरू होने से पहले तर्कों की गणना की जानी चाहिए। –

उत्तर

3

कोई आउटपुट वास्तव में अप्रत्याशित रूप से योग्य नहीं हो सकता है। फ़ंक्शन में सभी तर्कों का मूल्यांकन फ़ंक्शन में प्रवेश करने से पहले किया जाता है - लेकिन एक दूसरे के सापेक्ष उनके मूल्यांकन का क्रम निर्दिष्ट नहीं है, इसलिए इन सभी परिणामों की अनुमति है। आधिकारिक तौर पर, आपके अंतिम एक (जिसमें a में वृद्धि के दो अलग-अलग उदाहरण हैं) ने अपरिभाषित व्यवहार किया है, इसलिए इसे किसी भी चीज़ को समझदार नहीं करना है।

+0

यदि प्रत्येक तर्क का मूल्यांकन करने के बीच एक अनुक्रम बिंदु है, तो आखिर में अंतिम व्यक्ति दूसरों की तुलना में अधिक गलत क्यों होना चाहिए? – UncleBens

+0

आखिरी वाला "अधिक गलत" है क्योंकि यह एक हस्तक्षेप अनुक्रम बिंदु के बिना दो बार 'ए' को संशोधित करता है। बाकी केवल एक बार 'ए' को संशोधित करते हैं। –

+0

@UncleBens: प्रत्येक तर्क का मूल्यांकन करने के बीच अनुक्रम बिंदु नहीं है। ऑपरेंड का मूल्यांकन करने के बाद एक अनुक्रम कॉल होता है और फ़ंक्शन कहने से पहले, लेकिन तर्कों का मूल्यांकन होने पर अनुक्रम बिंदु (उदाहरण में) नहीं होते हैं। –

1

समारोह मापदंडों सी में एक परिभाषित आदेश इसलिए एक पहले से नहीं बता सकता में मूल्यांकन नहीं किया जाता है, तो a या a++ पहले मूल्यांकन किया जाएगा जब printf बुला।

Parameter evaluation order before a function calling in C

3

देखें आप तर्क सूची में दोनों 'एक' और 'एक ++' का हवाला अपरिभाषित व्यवहार लागू कर रहे हैं।

यह परिभाषित नहीं किया गया है कि तर्कों का मूल्यांकन किस क्रम में किया जाता है। विभिन्न कंपाइलर विभिन्न ऑर्डर चुन सकते हैं। एक एकल कंपाइलर अलग-अलग समय पर अलग-अलग ऑर्डर चुन सकता है।

ऐसा मत करो!

8

फ़ंक्शन तर्क मूल्यांकन में कुछ भी "दाएं से बाएं" नहीं जाता है। जब फ़ंक्शन तर्क का मूल्यांकन किया जाता है, तो मूल्यांकन का क्रम निर्दिष्ट नहीं होता है और अलग-अलग तर्कों का मूल्यांकन करने के बीच कोई अनुक्रम बिंदु नहीं होता है। इसका मतलब है कि इस प्रक्रिया में बिल्कुल कोई अस्थायी आदेश नहीं है। किसी भी क्रम में तर्कों का मूल्यांकन किया जा सकता है, और उनके मूल्यांकन की प्रक्रिया किसी भी तरह से अंतर्निहित हो सकती है।

हालांकि, आपका कोड और भी खराब समस्याओं से ग्रस्त है। printf पर कॉल करने वाले सभी तीन बयान अपरिभाषित व्यवहार (यूबी) का उत्पादन करते हैं क्योंकि वे या तो एक ही ऑब्जेक्ट (a) को संशोधनों (तीसरे कॉल) के बीच अनुक्रम बिंदु के बिना दो बार संशोधित करने का प्रयास करते हैं, या वे किसी ऑब्जेक्ट को संशोधित करने और इसे पढ़ने का प्रयास करते हैं एक स्वतंत्र उद्देश्य के लिए (पहला और दूसरा कॉल)। तो, मूल्यांकन के आदेश का भी उल्लेख करना बहुत जल्दी है। आपके कोड का व्यवहार अपरिभाषित है।

0

++ एक साधन वृद्धि पहले है, और उसके बाद अभिव्यक्ति का मूल्यांकन करें। (एक परिवर्तन, और अभिव्यक्ति एक + 1 के रूप में मूल्यांकन करती है)

ए ++ का मतलब है (इसलिए, एर्म, ए) का मूल्यांकन करें, और उसके बाद इसे बढ़ाएं। तो एक पास हो गया है, लेकिन तब का मूल्य (यानी बाद में) एक + 1 में बदल गया है।

+0

हालांकि अन्य लोग कह रहे हैं कि मूल्यांकन का कोई भी सेट ऑर्डर सही नहीं है - मैंने अभी पोस्टफिक्स और उपसर्ग ऑपरेटरों को समझाने की कोशिश की है ... –