2010-07-23 25 views
30

मैं एक सांत्वना अनुप्रयोग है कि परीक्षण और त्रुटि से एक नंबर "अनुमान" करने की कोशिश करेगा लिख ​​रहा था छोड़ रहा है, यह ठीक है और सभी में काम किया, लेकिन यह मुझे छोड़ दिया एक खास हिस्से के बारे में सोच है कि मैं absentmindedly लिखा था,: त्रिगुट सशर्त ऑपरेटर व्यवहार जब एक अभिव्यक्ति खाली

कोड है:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int x,i,a,cc; 
    for(;;){ 
    scanf("%d",&x); 
    a=50; 
    i=100/a; 
for(cc=0;;cc++) 
{ 
    if(x<a) 
    { 
     printf("%d was too big\n",a); 
     a=a-((100/(i<<=1))?:1); 

    } 
    else if (x>a) 
    { 
     printf("%d was too small\n",a); 
     a=a+((100/(i<<=1))?:1); 

    } 
    else 
    { 
     printf("%d was the right number\n-----------------%d---------------------\n",a,cc); 
     break; 
    } 
} 
} 
return 0; 
} 

अधिक विशेष बात यह है कि मुझे उलझन में

a=a+((100/(i<<=1))?:1); 
//Code, code 
a=a-((100/(i<<=1))?:1); 

मैं ((100/(i<<=1))?:1) इस्तेमाल किया सु बनाने के लिए है कि अगर 100/(i<<=1) लौटे 0 (या गलत) पूरे अभिव्यक्ति 1 ((100/(i<<=1))?:***1***) का मूल्यांकन होता है, और मैं सशर्त है कि अगर यह सच खाली ((100/(i<<=1))? _this space_ :1) था काम करेगा का हिस्सा छोड़ दिया है, इसे सही ढंग से काम करने के लिए लगता है, लेकिन वहाँ है कि छोड़ने में कोई खतरा नहीं है फिर से सशर्त खाली का हिस्सा?

+0

इस प्रकार की सशर्त को टर्नरी ऑपरेशन कहा जाता है। यदि आप 'टर्नरी' को शामिल करने के लिए अपनी पोस्ट को फिर से टैग या पुनः शीर्षक देते हैं तो आपको बेहतर प्रतिक्रिया मिल सकती है। –

+1

@ सेगफॉल्ट: इसे * * सशर्त ऑपरेटर (सी में) कहा जाता है। यह * ए * टर्नरी ऑपरेटर का एक उदाहरण है जो एक सामान्य शब्द है जिसका मतलब है कि किसी भी ऑपरेटर को तीन ऑपरेंड के साथ। – JeremyP

+0

यदि आपको संदेह है, जो इस प्रश्न का कारण बनता है, तो इसमें कोई संदेह नहीं है कि आपको सही-केस असाइनमेंट स्पष्ट करना चाहिए था। टूबोर .... गूंगा कंसोल गेम कोडिंग पर विचार न करें, क्योंकि यह एक सकारात्मक बोरडम फीडबैक है। – jpinto3912

उत्तर

52

यह एक जीएनयू सी एक्सटेंशन है (?: wikipedia entry देखें), इसलिए पोर्टेबिलिटी के लिए आपको स्पष्ट रूप से दूसरे ऑपरेंड को अवश्य कहना चाहिए।

'सही' मामले में, यह सशर्त का परिणाम लौटा रहा है।

निम्नलिखित बयानों लगभग बराबर हैं:

a = x ?: y; 
a = x ? x : y; 

फर्क सिर्फ इतना है पहले बयान में है, x हमेशा एक बार दूसरे में, x मूल्यांकन किया जाएगा, जबकि दो बार अगर यह सच है मूल्यांकन किया जाता है,। तो केवल अंतर यह है कि x का मूल्यांकन साइड इफेक्ट्स है।

किसी भी तरह से, मैं इसे वाक्यविन्यास का एक सूक्ष्म उपयोग मानता हूं ... और यदि आपके कोड को बनाए रखने वालों के लिए आपको कोई सहानुभूति है, तो आपको स्पष्ट रूप से ऑपरेंड को अवश्य बता देना चाहिए। :)

दूसरी ओर, यह एक आम उपयोग के मामले के लिए एक अच्छी छोटी चाल है।

+5

लगभग बराबर ... 'x' को छोड़कर 'x': y' में केवल एक बार मूल्यांकन किया जाता है। – kennytm

+0

@ केनीटीएम: सच है, मुझे स्पष्ट रूप से यह कहना चाहिए। – Stephen

+1

मैंने इस टर्नरी सिंटैक्स को एक्सएलसी (आईईसी एक्सएल सी/सी ++ के लिए एईक्स, वी 11.1) पर लापता दूसरे ऑपरेंड के साथ करने की कोशिश की और यह भी काम किया। – Ted

16

यह सी भाषा के लिए एक GCC extension है। कुछ भी नहीं ?: के बीच प्रकट होता है, तो तुलना का मूल्य सही मामले में प्रयोग किया जाता है।

एक सशर्त अभिव्यक्ति में मध्य संचालन छोड़ा जा सकता है। फिर यदि पहला ऑपरेंड nonzero है, तो इसका मान सशर्त अभिव्यक्ति का मूल्य है।

इसलिए, अभिव्यक्ति

    x ? : y

कि अगर अशून्य है x का मान है; अन्यथा, वाई का मूल्य।

यह उदाहरण पूरी तरह से

    x ? x : y

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