तुम क्या कर रहे हैं, मुहावरेदार है अगर थोड़ा बदसूरत सी
आदेश, संकलक क्या आप जानते हैं कि आप क्या कर रहे हैं समझाने के लिए हालांकि, आप काम का एक अतिरिक्त सेट में लपेट कर सकता है कोष्ठक:
while((arg = va_arg(ap, int)))
यह चेतावनी का ख्याल रखना चाहिए।
अद्यतन:
काम के आसपास कोष्ठक जोड़ने का उपयोग कर C99 संकलक im में चेतावनी को दबाने के लिए प्रतीत नहीं होता है (PellesC)। - गैरी विलोबी
क्या, ऐसा नहीं हुआ? फिर आपको परीक्षण को थोड़ा और स्पष्ट करने की आवश्यकता है:
while((arg = va_arg(ap, int)) != 0)
चाल चलाना चाहिए। इसे थोड़ा और पठनीय होने का भी तर्क दिया जा सकता है।
आप मुझसे पूछने जा रहे हैं कि मेरा मतलब "थोड़ा बदसूरत" है।
अन्य भाषाओं के साथ काम करने से, मुझे परीक्षण और संशोधन के बीच स्पष्ट अलगाव होने के लिए उपयोग किया जाता है। आप उस मूल्य के while
में एक परीक्षण कर रहे हैं, लेकिन साथ ही एक साइड इफेक्ट (अर्थात् अगले तर्क में पढ़ना) बनाते हैं। जैसा कि मैंने कहा, यह सी में बहुत सामान्य माना जाता है, हाँ "idiomatic" क्योंकि बहुत सी प्रोग्रामर ऐसा करते हैं; मुझे लगता है कि कश्मीर & आर
में इसी तरह के कोड का भी उदाहरण व्यक्तिगत पसंद से कर रहे हैं, मैं शायद के रूप में इस पुनर्लेखन चाहते हैं:
while (1) {
arg = va_arg(ap, int);
if (!arg) break;
...
}
यह स्पष्ट रूप से परीक्षण से काम को अलग करती है, और पाश की सुविधा देता है एक (संभावित) अनंत पाश के रूप में अकेले खड़े हो जाओ। बहुत से लोग मेरे कोड को और बदसूरत मानेंगे; जैसा कि मैंने कहा, यह व्यक्तिगत वरीयता का मामला है।
आपका उदाहरण कोड टूटा हुआ है: लूप समाप्त होता है अगर 'arg == 0', लेकिन आप 'Sum') को' 0' तर्क नहीं देते हैं; यदि सभी वैकल्पिक तर्कों का एक ही प्रकार है, तो varargs का उपयोग करने के बजाय सरणी को पास करना बेहतर होता है और इसे अच्छा दिखने के लिए कुछ मैक्रो जादू करें: http://stackoverflow.com/questions/1375474/variable-arity-in-c/ 1375636 # 1375636 – Christoph
अच्छा बिंदु! लेकिन यह सवाल को प्रभावित नहीं करता है। आपका मैक्रो अच्छा है और एक स्पष्ट बेहतर विकल्प है! –