2012-05-30 6 views
8

कई किताबें मुझे दिखाती हैं कि कैसे, सही तरीके से लिखना, और लूप करना। बहुत से ऑनलाइन लेख एक-दूसरे से तुलना करते हैं।सी लूप-लूप के भीतर काउंटर या हालत बदलने के लिए ठीक है?

लेकिन मुझे कोई जगह नहीं मिली है जो मुझे बताती है कि क्या नहीं करना है। उदाहरण के लिए, क्या मैं चीजों को पेंच कर दूंगा यदि मैं लूप के भीतर काउंटर या कंडीशन वैरिएबल का मान बदलता हूं?

मुझे ऐसा उत्तर चाहिए जो मशीन पर निर्भर न हो।

उत्तर

7

हाँ आप काउंटर को लूप के भीतर बदल सकते हैं और कभी-कभी यह बहुत उपयोगी हो सकता है। उदाहरण के लिए कमांड लाइन तर्कों को पार्स करने में जहां एक मान के बाद एक विकल्प ध्वज है। इस का एक उदाहरण नीचे दिखाया गया है:

निम्न आदेश डालें:

program -f filename -o option -p another_option

कोड:

#include <string.h> 

int main(int argc, char** argv) 
{ 

char *filename, *option, *another_option; 

if(argc > 1){ 
    for(int i=1; i<argc; i++){ 
    if(strcmp(argv[i],"-f")==0){ 
     filename = argv[++i]; 
    } else if(strcmp(argv[i],"-o")==0){ 
     option = argv[++i]; 
    } else if(strcmp(argv[i],"-p")==0){ 
     another_option = argv[++i]; 
    } else { 
     printf("Option \"%s\" not recognized, skipping\n",argv[i]); 
     continue; 
    } 
    } 
} /* end if argc > 1 */ 

return 0; 
} 

उदाहरण कार्यक्रम स्वचालित रूप से सही कमांड लाइन स्ट्रिंग का उपयोग करने के काउंटर को बढ़ा देता। काउंटर इत्यादि को शामिल करने के कई तरीके हैं, लेकिन वे इस मामले में कोड को और अधिक बोझिल बना देंगे।

जैसा कि अन्य ने इंगित किया है, यह वह जगह है जहां कई लोग बग लिखते हैं और लूप के भीतर काउंटरों को बढ़ाने के दौरान सावधान रहना चाहिए, खासकर जब लूप काउंटर वैल्यू पर सशर्त होता है।

+0

शानदार उदाहरण! Upvoted! – Jay

3

हां, आप काउंटर और हालत चर बदल सकते हैं। लूप के अगले पुनरावृत्ति के साथ उनका मूल्यांकन किया जाएगा।

7

यह सी में एक पाश के अंदर एक पाश काउंटर बदलने के लिए

हालांकि अवैध नहीं है, यह शायद भविष्य पाठकों के लिए भ्रामक है और है कि एक अच्छा कारण नहीं यह करने के लिए है।

1

हां, सी/सी ++/सी # में आप लूप में काउंटर इत्यादि बदल सकते हैं।

4

यह "स्क्रू चीजों को" से आपका क्या मतलब है इस पर निर्भर करता है।

यदि आप जानते हैं कि आप क्या कर रहे हैं, तो आप काउंटर बदल सकते हैं। भाषा पर इस पर कोई प्रतिबंध नहीं है।

4

लूप में काउंटर वैरिएबल को बदलने की अनुमति है, लेकिन यह जानने के लिए सावधान रहें कि जब आप नहीं होना चाहिए तो वेरिएबल को कम करके अनंत लूप नहीं बना सकते हैं।

कुछ एल्गोरिदम वास्तव में इससे लाभान्वित होते हैं, लेकिन निश्चित रूप से यदि आप ऐसा करते हैं तो यह आपके कोड को कम पठनीय बनाता है, इसलिए सुनिश्चित करें कि आप यह भी टिप्पणी कर रहे हैं कि आप क्या कर रहे हैं।

1

कई अन्य तकनीकों की तरह, जब तक आप जानते हैं कि आप क्या करते हैं, यह ठीक है।

उदाहरण के लिए, इस कोड:

int i; 
for (i=0;i<5;i++) 
    printf("%d\n",i--); 

एक अनन्तता पाश है, लेकिन बुलबुला तरह के इस संस्करण:

int *arr,n; 
//allocate memory, assign values, and store the length of the array in n 
int i; 
for (i=0;i<n-1;i++) 
    if (arr[i]>arr[i+1]) { 
    int temp=arr[i]; 
    arr[i]=arr[i+1]; 
    arr[i+1]=temp; 
    if (i) i-=2; 
    } 

ठीक है। (यह बिल्कुल बुलबुला प्रकार नहीं है।नेस्टेड लूप का उपयोग करने के बजाय, मैं इसमें सदस्यों को स्वैप करने के बाद सरणी में वापस जाता हूं)

2

Definiteley आप कर सकते हैं। लेकिन लूप विकार न करने के लिए सावधान रहें। लूप में एक कन्टर बदलना बहुत कुछ होता है ... जबकि और जबकि।

do{ 
    counter++; 
    some expressions; 
} 
while(counter < SOMEVALUE); 
0

हम पाश अंदर काउंटर मूल्य बदल सकते हैं, लेकिन जैसा कि पाश के लिए अभ्यस्त काउंटर मान को ओवरराइड अंतिम काउंटर मूल्य अभ्यस्त परिलक्षित होना। क्यूटीपी वीबी स्क्रिप्ट में उदाहरण है।

iLast = 4 
For i= 1 to iLast 
iLast=2  
Next 
यहाँ पाश के रूप में iLast मूल्य पाश अंदर 2 के लिए अद्यतन किया गया है, लेकिन यह 4 बार के लिए निष्पादित हो रहा है केवल के लिए 2 बार अमल करना चाहिए के लिए

1

लूप के अंदर काउंटर वैरिएबल को बदलने में सावधान रहें, सभी लूप समान नहीं हैं, "जबकि" लूप अलग-अलग व्यवहार करता है। यह उदाहरण देखें?

नहीं, यह एक अनंत लूप (कुछ कंपेलरों पर) है। इसे चलाएं, और देखें ...

i=5; 
while (i--) 
{ 
    i=100; 
    printf("%d \n",i) 
} 
संबंधित मुद्दे