If your loop has the following form… «INIT» while(«CONDITION») { «BODY» «NEXT» } … then use a for loop instead. for(«INIT», «CONDITION», «NEXT») { «BODY» } That for loop is equivalent to the while loop before. ∙ «INIT» is executed only once. ∙ «CONDITION» is always checked before «BODY» is executed. ∙ «NEXT» is executed immediately after «BODY» Example 1. «INIT» 2. Check «CONDITION». It is true, so proceed. 3. «BODY» 4. «NEXT» 5. Check «CONDITION». It is true, so proceed. 6. «BODY» 7. «NEXT» 8. Check «CONDITION». It is false so stop. That normally occurs when iterating through an array, string, or linked list. EXAMPLE #1: Array of int // OLD int numbers[] = { 1, 2, 3 }; int i = 0; while(i < 3) { printf("numbers[%d] == %d\n", i, numbers[i]); i++; } // GOOD int numbers[] = { 1, 2, 3 }; for(int i = 0; i < 3; i++) { printf("numbers[%d] == %d\n", i, numbers[i]); } EXAMPLE #2: Linked list // OLD Node* curr = head; while(curr != NULL) { printf("curr -> value == %d\n", curr -> value); curr = curr -> next; } // GOOD for(Node* curr = head; curr != NULL; curr = curr -> next) { printf("curr -> value == %d\n", curr -> value); } EXAMPLE #3: File // OLD FILE* fp = fopen("…", "r"); char ch = fgetc(fp); while(!feof(fp)) { fputc(ch, stdout); ch = fgetc(fp); } // GOOD FILE* fp = fopen("…", "r"); for(char ch = fgetc(fp); !feof(fp), ch = fgetc(fp)) { fputc(ch, stdout); } EXAMPLE #4: String // OLD char s[] = "abc"; int i = 0; while(s[i] != '\0') { fputc(s[i], stdout); i++; } // GOOD char s[] = "abc"; for(int i = 0; s[i] != '\0'; i++) { fputc(s[i], stdout); }