दिलचस्प पोस्ट
JTabbedPane का पृष्ठभूमि का रंग कैसे बदल सकता है? बैश स्क्रिप्ट हमेशा प्रिंट करता है "कमांड नहीं मिला" Rundll32 का उपयोग कैसे करें DLL फ़ंक्शन निष्पादित करें? UISegmentedControl का फ़ॉन्ट आकार बदलें बूटस्ट्रैप आइकन स्थानीय रूप से लोड किए जाते हैं लेकिन ऑनलाइन नहीं होते हैं क्या GET अनुरोध की लंबाई की कोई सीमा है? JSP / EL में एक स्थिर विधि कैसे कॉल करें? LoadComplete और gridComplete घटनाओं में क्या अंतर है? क्या फेसबुक ओअथ 2.0 पहुंच टोकन्स की समाप्ति? JavaScript स्ट्रिंग में कितने बाइट हैं? साधारण राज्य मशीन सी # में उदाहरण है? एंड्रॉइड कलर पिकर पीएचपी में बड़ी एक्सएमएल की प्रक्रिया का सबसे अच्छा तरीका ओपनजीएल – एकाधिक बनावट के साथ मुखौटा मैं एक सूची <T> में एक विशिष्ट तत्व कैसे प्राप्त करूं?

?: एक अभिव्यक्ति खाली छोड़ते समय टर्नरी सशर्त ऑपरेटर व्यवहार

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

कोड है:

#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) , यह सही तरीके से काम करता है, लेकिन क्या सशर्त रिक्त का वह भाग छोड़ने में कोई खतरा है?

वेब के समाधान से एकत्रित समाधान "?: एक अभिव्यक्ति खाली छोड़ते समय टर्नरी सशर्त ऑपरेटर व्यवहार"

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

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

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

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

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

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

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

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

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

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

x ? : y

x का मान है यदि वह नोजर है; अन्यथा, y का मान

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

x ? x : y

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