मैं एक के for
बजाय एक लूप स्थिति में दो चर बढ़ाना चाहूंगा ।
तो कुछ इस तरह:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
इसके लिए वाक्य रचना क्या है?
मैं एक के for
बजाय एक लूप स्थिति में दो चर बढ़ाना चाहूंगा ।
तो कुछ इस तरह:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
इसके लिए वाक्य रचना क्या है?
जवाबों:
कॉमन ऑपरेटर का उपयोग करने के लिए एक सामान्य मुहावरा है जो दोनों ऑपरेंड का मूल्यांकन करता है, और दूसरा ऑपरेंड लौटाता है। इस प्रकार:
for(int i = 0; i != 5; ++i,++j)
do_something(i,j);
अब लिखा है कि, एक टिप्पणीकार ने सुझाव दिया कि यह वास्तव में कथन के लिए कुछ विशेष वाक्यगत शर्करा है, और बिल्कुल भी अल्पविराम ऑपरेटर नहीं है। मैंने जाँच की कि निम्नानुसार जीसीसी में:
int i=0;
int a=5;
int x=0;
for(i; i<5; x=i++,a++){
printf("i=%d a=%d x=%d\n",i,a,x);
}
मैं एक्स के मूल मूल्य को लेने के लिए x की उम्मीद कर रहा था, इसलिए इसे x के लिए 5,6,7 .. प्रदर्शित करना चाहिए था। मुझे जो मिला वह यही था
i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3
हालांकि, अगर मैंने पार्सर को वास्तव में अल्पविराम ऑपरेटर को देखने के लिए मजबूर करने के लिए अभिव्यक्ति को ब्रैकेट किया है, तो मुझे यह मिलता है
int main(){
int i=0;
int a=5;
int x=0;
for(i=0; i<5; x=(i++,a++)){
printf("i=%d a=%d x=%d\n",i,a,x);
}
}
i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
प्रारंभ में मैंने सोचा था कि यह दिखाया गया था कि यह बिल्कुल भी अल्पविराम ऑपरेटर के रूप में व्यवहार नहीं कर रहा है, लेकिन जैसा कि यह पता चला है, यह केवल एक पूर्ववर्ती समस्या है - अल्पविराम ऑपरेटर की सबसे कम संभव पूर्ववर्तीता है , इसलिए अभिव्यक्ति x = i ++, ++ प्रभावी रूप से है। (x = i ++), a ++ के रूप में पार्स किया गया
सभी टिप्पणियों के लिए धन्यवाद, यह एक दिलचस्प सीखने का अनुभव था, और मैं कई वर्षों से सी का उपयोग कर रहा हूं!
इसे इस्तेमाल करे
for(int i = 0; i != 5; ++i, ++j)
do_something(i,j);
for( ; ; ((++i), (++j)) )
for(int i = 0; i != 5; (++i)) {
अतिरिक्त कोष्ठक यह सोचकर संकलक को चकमा देता है कि यह "वेतन वृद्धि" ऑपरेशन नहीं है।
इसे करने की कोशिश न करें!
से http://www.research.att.com/~bs/JSF-AV-rules.pdf :
AV नियम 199
लूप के लिए वृद्धि की अभिव्यक्ति लूप के लिए एक लूप पैरामीटर को अगले मान में बदलने के अलावा कोई कार्रवाई नहीं करेगी।तर्क: पठनीयता।
मैं खुद को यह याद दिलाने के लिए आया था कि एक फॉरेस्ट लूप के इंक्रीमेंट क्लॉज में दूसरे इंडेक्स को कैसे कोड किया जाए, जो मुझे पता था कि इसे मुख्य रूप से एक नमूने में देखने से किया जा सकता है जिसे मैंने दूसरे प्रोजेक्ट में शामिल किया था, जिसे C ++ में लिखा गया था।
आज, मैं C # में काम कर रहा हूं, लेकिन मुझे यकीन था कि यह इस संबंध में समान नियमों का पालन करेगा, क्योंकि फॉर स्टेटमेंट प्रोग्रामिंग की सभी प्राचीनतम संरचनाओं में से एक है। शुक्र है, मैंने हाल ही में अपने पुराने सी कार्यक्रमों में से एक में लूप के व्यवहार का दस्तावेजीकरण करने में कई दिन बिताए थे, और मैंने जल्दी ही महसूस किया कि उन अध्ययनों ने उन पाठों को आयोजित किया जो आज के सी # समस्या पर लागू होते हैं, विशेष रूप से दूसरे सूचकांक चर के व्यवहार के लिए। ।
अलौकिक के लिए, निम्नलिखित मेरी टिप्पणियों का सारांश है। मैंने आज जो कुछ भी देखा, वह स्थानीय लोगों की खिड़की में चर को ध्यान से देखते हुए, मेरी उम्मीद की पुष्टि की कि एक C # कथन के लिए कथन C या C ++ के समान व्यवहार करता है।
यदि लूप के समाप्त होने पर आपके दोनों इंडेक्स वैरिएबल दायरे में रहते हैं, तो उनका मान सही इंडेक्स वैरिएबल के मामले में लूप को बंद करने वाली सीमा से एक अधिक होगा। इसी तरह, अगर, उदाहरण के लिए, लूप में प्रवेश करने से पहले दूसरे चर को शून्य से आरंभीकृत किया जाता है, तो अंत में इसका मान पुनरावृत्ति गणना होगा, यह मानते हुए कि यह एक वृद्धि (++) है, एक वृद्धि नहीं है, और कुछ भी नहीं है। लूप का शरीर अपना मान बदलता है।
मैं स्क्वेलार्ट से सहमत हूं। दो चर बढ़ाना बग प्रवण है, खासकर यदि आप केवल उनमें से एक के लिए परीक्षण करते हैं।
यह ऐसा करने के लिए पठनीय तरीका है:
int j = 0;
for(int i = 0; i < 5; ++i) {
do_something(i, j);
++j;
}
For
लूप उन मामलों के लिए होते हैं जहां आपका लूप एक बढ़ते / घटते हुए वैरिएबल पर चलता है। किसी अन्य चर के लिए, इसे लूप में बदलें।
यदि आपको j
बंधे होने की आवश्यकता है i
, तो मूल चर को क्यों नहीं छोड़ना है और जोड़ना है i
?
for(int i = 0; i < 5; ++i) {
do_something(i,a+i);
}
यदि आपका तर्क अधिक जटिल है (उदाहरण के लिए, आपको वास्तव में एक से अधिक चर की निगरानी करने की आवश्यकता है), मैं एक while
लूप का उपयोग करूंगा ।
int main(){
int i=0;
int a=0;
for(i;i<5;i++,a++){
printf("%d %d\n",a,i);
}
}
i
और a
स्थानीय करने की क्या बात है ?
मैथ्स का इस्तेमाल करें। यदि दो ऑपरेशन गणितीय रूप से लूप पुनरावृत्ति पर निर्भर करते हैं, तो गणित क्यों नहीं करते हैं?
int i, j;//That have some meaningful values in them?
for( int counter = 0; counter < count_max; ++counter )
do_something (counter+i, counter+j);
या, विशेष रूप से ओपी के उदाहरण का जिक्र करते हुए:
for(int i = 0; i != 5; ++i)
do_something(i, j+i);
विशेष रूप से यदि आप किसी फ़ंक्शन को मान द्वारा पास कर रहे हैं, तो आपको कुछ ऐसा प्राप्त करना चाहिए जो वास्तव में आप चाहते हैं।