2014-07-02 6 views
6

के अंदर टर्नरी ऑपरेटर this पढ़ने के बाद मैंने सोचना शुरू किया कि मैंने printf() के बारे में एक लूट सीखा है। अचानक मैं this किताब से निम्नलिखित कोड का टुकड़ा मिला:प्रिंटफ

int main() 
{ 
    char str[]="Hello"; 
    int i=5,j=10; 
    printf(i>j?"%50s":"%s",str); //unable to understand this 
    return 0; 
} 

हैरानी की बात है इसके बाद के संस्करण कोड त्रुटियों के बिना चल रहा है और यह हैलो प्रिंट करता है।

int printf(const char *format,argument_list); 

तो इस वाक्य रचना के अनुसार, printf() प्रारूप स्ट्रिंग साथ शुरू करना चाहिए: मेरी जानकारी के अनुसार निम्नलिखित printf() की वाक्य रचना है। लेकिन जैसा कि आप उपरोक्त कोड printf() में देख सकते हैं i>j से शुरू हो रहा है। क्या इसका मतलब है कि मैं printf() के वाक्यविन्यास की व्याख्या करने में गलत हूं? printf() के अंदर टर्नरी ऑपरेटर रखना एक विशेष मामला है?

संपादित

मैं त्रिगुट ऑपरेटर मैं printf() की पहली बहस के बारे में पूछ रहा हूँ जो स्थिरांक चार होना चाहिए * जो मैं अपने उदाहरण में नहीं लग रहे हैं के बारे में पता है।

+5

1 पैरामीटर के अंदर अभिव्यक्ति का परिणाम निरंतर चार सरणी के लिए एक सूचक होना चाहिए, इसलिए आश्चर्य की बात नहीं है। –

+0

आपका मतलब है कि डबल कोट्स के बिना भी कुछ भी स्थिर स्ट्रिंग –

+1

के लिए पॉइंटर है, यदि आप इसे इस तरह लिखते हैं तो चीजें स्पष्ट हो सकती हैं: 'printf ((i> j?"% 50s ":"% s "), str)' –

उत्तर

6

सशर्त ऑपरेटर:

i>j?"%50s":"%s" 

अभिव्यक्ति है और यह फ़ंक्शन को कॉल करने से पहले ही मूल्यांकन किया जा सकता का मूल्यांकन किया जाना है।

एक तर्क किसी भी वस्तु प्रकार की अभिव्यक्ति हो सकता है: हम मसौदा C99 मानक खंड 6.5.2.2समारोह कॉल जो कहते हैं पर जाकर इसे देख सकते हैं। को फ़ंक्शन पर कॉल करने की तैयारी में, तर्कों का मूल्यांकन किया जाता है, और प्रत्येक पैरामीटर को संबंधित तर्क का मान असाइन किया जाता है। 81)

तो सशर्त ऑपरेटर के मूल्यांकन का नतीजा क्या है? अगर हम अनुभाग 6.5.15सशर्त ऑपरेटर के पास जाओ यह कहता है (जोर मेरा):

पहले संकार्य मूल्यांकन किया जाता है; मूल्यांकन के बाद एक अनुक्रम बिंदु है। दूसरा ऑपरेंड केवल तभी मूल्यांकन किया जाता है जब पहली तुलना 0 के बराबर होती है; तीसरा ऑपरेंड केवल तभी मूल्यांकन किया जाता है जब पहले 0 के बराबर तुलना करता है; परिणाम दूसरे या तीसरे ऑपरेंड का मूल्य है (जो भी मूल्यांकन किया जाता है), नीचे वर्णित प्रकार में परिवर्तित किया गया है।

तो या तो मामले में परिणाम एक स्ट्रिंग शाब्दिक जो चार को जो printf को पहले तर्क के लिए आवश्यकता को संतुष्ट करने के लिए सूचक क्षय होगा है।

+0

अच्छा स्पष्टीकरण !! लेकिन मुझे अभी भी अभिव्यक्ति में संदेह है I> j? "% 50s": "% s" जो मुझे नहीं लगता कि यह कॉन्स char * है, मुझे लगता है कि इसे डबल कोट्स अंक में संलग्न होना चाहिए। है ना? –

+0

ठीक है अब मैं इसे समझता हूं जो केवल "% s" अभिव्यक्ति का मूल्यांकन करने के बाद printf() –

+0

@ ए। बुल्लर के लिए एक तर्क के रूप में पारित किया गया है, यह सही है। –

1

क्या इसका मतलब है कि मैं printf() के वाक्यविन्यास की व्याख्या करने में गलत हूं?

नहीं, आप इसे गलत समझ नहीं रहे हैं।

printf() के अंदर टर्नरी ऑपरेटर रखना एक विशेष मामला है?

सी में, आप कह सकते हैं कि एक बयान के बजाय अपने एक अभिव्यक्ति

आपका कोड के बराबर है:

if (i > j) 
    printf("%50s", str); 
else 
    printf("%s", str); 
1

त्रिगुट ऑपरेटर बस एक इनलाइन if कि अभिव्यक्ति के रूप में प्रयोग किया जाता है है (जबकि ब्लॉक बनाने के लिए नियमित if का उपयोग किया जाता है)। आपकी रेखा इसके बराबर है:

if (i > j) 
    printf("%50s", str); 
else 
    printf("%s", str); 
3

यह कोड सामान्य है और कोई विशेष मामला नहीं है। printf के लिए आवश्यकता यह है कि पहला तर्क const char* प्रकार का होना चाहिए, लेकिन इसका मतलब यह नहीं है कि इसे "%s" जैसे स्ट्रिंग अक्षर होना चाहिए। इसका मतलब यह है कि आपको पहले तर्क के रूप में const char* प्रकार की अभिव्यक्ति के रूप में पारित करने की आवश्यकता है। और i>j?"%50s":"%s" इस आवश्यकता को पूरा करता है।

+0

क्या आप कॉन्स char * का कोई उदाहरण दे सकते हैं जो डबल कोट्स के अंदर पूरी तरह से लपेटा नहीं गया है? –

+1

'i> j?"% 50s ":"% s "' प्रकार का है 'const char * '(तकनीकी रूप से यह' const char [] 'है लेकिन इससे कोई फर्क नहीं पड़ता) इसलिए मुझे लगता है कि यह आपका उदाहरण है। एक और उदाहरण 'func() 'होगा, जहां' func' 'const char *' लौटने वाला फ़ंक्शन है। –

0

फॉर्म का एक विवरण है: हालत? परिणाम: वैकल्पिक।

स्थिति की जांच की गई है, और यदि यह सच है तो आप परिणाम प्राप्त करेंगे। अन्यथा आपको विकल्प मिल जाएगा।

उदाहरण के लिए: ताकि आप 10 प्राप्त होंगे

5>3 ? 10 : 5 

5> 3, सच है।

1
if(i>j) 
    printf("%50s",str); 
else 
    printf("%s",str); 

इसलिए, Hello दोनों स्थितियों

1

में मुद्रित हो जाता है मुझे लगता है कि आप अच्छी तरह से समझ printf वाक्य रचना लेकिन मुझे लगता है कि आप सी सिंटैक्स के बारे में कुछ याद कर रहे हैं।

यह का एक रूप मौजूद बयान "कॉम्पैक्ट पसंद है" कि तरह स्वरूपित: (? हालतसच: झूठी)

उदाहरण के लिए आप कर सकते हैं:

int a=5; 
int b=(a==5 ? 128 : 256); 
int c=(a!=5 ? 8 : 9); 

में यह मामला, बी = 128 और सी = 9।

एक अन्य उदाहरण:

int flag=1; 
printf("The value is: %s", (flag!=0 ? "true" : "false)); 

इस मामले में आप देख सकते हैं: मान सत्य

अपने उदाहरण पर है:

printf(i>j?"%50s":"%s",str); 

अगर मैं j से ऊपरी है आप "% 50s" प्रारूप का उपयोग करें और, यदि मैं कम हूं तो आप "% s" प्रारूप का उपयोग करें

यह देखा जा सकता है:

if (i>j) 
    printf("%50s",str); 
else 
    printf("%s",str); 

आप कॉम्पैक्ट परीक्षण का लाभ देख सकते हैं।

1

प्रश्न: क्या इसका मतलब है कि मैं printf() के वाक्यविन्यास की व्याख्या करने में गलत हूं?
ए: नहीं, केवल स्वीकार्य है कि विस्तार करने की आवश्यकता है।

प्रश्न: क्या printf() के अंदर टर्नरी ऑपरेटर रखना एक विशेष मामला है?
ए: नहीं ?: विशेष नहीं है, लेकिन कभी-कभी पहली नज़र में भ्रमित होता है।

printf() को प्रदान किए गए प्रारूप को शाब्दिक होने की आवश्यकता नहीं है। यह कोई स्ट्रिंग चर हो सकता है।

int main() { 
    char str[]="Hello"; 
    char *format; 
    int i,j; 

    i = 5; j = 10; 
    format = i > j ? "%50s" : "%s"; 
    printf(format, str); 

    i = 10; j = 5; 
    format = i > j ? "%50s" : "%s"; 
    printf(format, str); 
    return 0; 
} 
2

यह एक त्रिगुट ऑपरेटर है और इस हालत में मैं> j झूठी तो% s पैरामीटर printf के लिए जो चरित्र सरणी जो नमस्ते है के मूल्य प्रिंट होगा के रूप में पारित हो जाएगा।

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