c++ - मैं सी++ 'फॉर' लूप में दो वृद्धि विवरण कैसे लगा सकता हूं?




for-loop comma-operator (6)

इसे इस्तेमाल करे

for(int i = 0; i != 5; ++i, ++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,6 के लिए प्रदर्शित किया जाना चाहिए था। मुझे यह मिला था

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 ++, a ++ प्रभावी ढंग से है के रूप में विश्लेषण (x = i ++), एक ++

सभी टिप्पणियों के लिए धन्यवाद, यह एक दिलचस्प सीखने का अनुभव था, और मैं कई वर्षों से सी का उपयोग कर रहा हूं!


गणित का प्रयोग करें। यदि दो ऑपरेशन गणितीय रूप से लूप पुनरावृत्ति पर निर्भर करते हैं, तो गणित क्यों नहीं करते?

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);

विशेष रूप से यदि आप किसी फ़ंक्शन में मूल्य से गुज़र रहे हैं, तो आपको कुछ ऐसा करना चाहिए जो आप चाहते हैं।


मैं squelart के साथ सहमत हूँ। दो चर बढ़ाना बग प्रवण है, खासकर यदि आप केवल उनमें से एक के लिए परीक्षण करते हैं।

ऐसा करने के लिए यह पठनीय तरीका है:

for(int i = 0; i < 5; ++i) {
    ++j;
    do_something(i, j);
}

लूप के लिए उन मामलों के लिए मतलब है जहां आपका लूप एक बढ़ते / घटते चर पर चलता है। किसी भी अन्य चर के लिए, इसे लूप में बदलें।

यदि आपको j से j आवश्यकता है, तो मूल वैरिएबल को क्यों न छोड़ें और i जोड़ें?

for(int i = 0; i < 5; ++i) {
    do_something(i,a+i);
}

यदि आपका तर्क अधिक जटिल है (उदाहरण के लिए, आपको वास्तव में एक से अधिक चर की निगरानी करने की आवश्यकता है), तो मैं while लूप का उपयोग करूंगा।


for (int i = 0; i != 5; ++i, ++j) 
    do_something(i, j);

int main(){
    int i=0;
    int a=0;
    for(i;i<5;i++,a++){
        printf("%d %d\n",a,i);
    } 
}





comma-operator