The primary consideration when deciding what to put in the for-loop header should be whether the for-loop header conveys the structure of the loop. The three elements (initializer; condition; update) should form a coherent story. I would express your function like this: public string Reverse(string s) { char[] arr = s.ToCharArray(); for (int i = 0, j = s.Length - 1; i < j; ++i, --j) { char swap = arr[i]; arr[i] = arr[j]; arr[j] = swap; } return arr.ToString(); } From just the for-loop header, a reasonably experienced programmer can recognize the idiom for stepping two array indices until they meet in the middle. By convention, `i` and `j` are array indices; you don't need the `…Idx` Hungarian suffix. In comparison, the interviewer's proposal looks unstructured. I feel like I have to mentally decompile it back into the for-loop above to understand what is going on. I've also renamed `temp` to `swap` as a silent "comment". --- You might be wondering, to what extreme can you pack logic into the for-loop header? In practice, I've never seen more a good for-loop header that involved more than two variables. The probable explanation is that the condition usually involves a binary comparison operator. A third variable would therefore usually be "off-topic" for the header. Two other guidelines you might want to use are: - If you can fill in all three parts of the header (initializer; condition; update), then a for-loop is probably appropriate. - If the loop body surreptitiously updates the iteration variable, such that the header tells a misleading or incomplete story, then the iteration should probably _not_ be done using a for-loop.