Блог пользователя -is-this-fft-

Автор -is-this-fft-, история, 6 лет назад, По-английски

#define rep(i, l, r) for ((i) = (l); (i) < (r); (i)++)

Things like that are pretty common. Why do so many of you need to do things like this? What is wrong with a good old for-loop? Is it that slow to write one explicitly?

  • Проголосовать: нравится
  • +52
  • Проголосовать: не нравится

»
6 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

It's shorter.

»
6 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

consider the two cases:

1) rep(i, l, r) — 12 characters

2) for (int i = l; i < r; i++) — 27 characters

The difference is a whopping 15 characters! The average typing speed is ~44 WPM or ~220 characters per minute, that's ~4s for 15 characters! Sure, it might not seem like a big number but over time it adds up. After you've written over 1000 for loops (not an unreasonable number, corresponds to ~100 problem solution) the saved time has accumulated to 4000s or around one hour! To get your imagination rolling, here is a list of 101 fantastic things you could've done in that hour: https://www.care.com/c/stories/5309/101-things-to-do-with-an-extra-hour/

  • »
    »
    6 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +4 Проголосовать: не нравится

    That's why I do "for<TAB>l<TAB>r<TAB>" — that's 8 keystrokes only. And I have the braces as a bonus!

»
6 лет назад, # |
  Проголосовать: нравится +139 Проголосовать: не нравится

To avoid this bug:

for (int i = 0; i < n; i++) {
  for (int j = 0; j < n; i++) {
  }
}
»
6 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

Actually all C-style for-loops are syntactically broken.

»
6 лет назад, # |
  Проголосовать: нравится +43 Проголосовать: не нравится

Less important reason (shorter code) was already mentioned few times, so I won't talk about it.

More important reason is that in 90% of usages there is a lot of redundancy within them which leads to being highly error prone. In

for (int i = 1; i <= n; i++)

you have to write "i" three times! In my macro version this is equivalent to RE(i,n) where i occurs only once. This way this is much less probable that I will make a bug when one of these three occurances is j or exactly what I_love_Hoang_Yen suggested. This is most vulnerable in cases where we want to change name of our variable and replace for example two out of three occurances. For example when I do n phases of my algorithm and use "i" to denote phase number and in every phase I iterate over all vertices of my graph which I also call "i". Then compiler tells me something about shadowing or maybe I simply use number of phase inside that inner loop and I am forced to change inner i to something else and I chose v. And I end up with

for (int v = 1; v <= n; i++)