Iterating Backwards in C

(davidpriver.com)

39 points | by cremno 3 days ago

7 comments

  • bugake 6 minutes ago
    For the uninformed: counting backwards in a for loop is faster because comparing an unsigned integer against 0 is generally faster than comparing it against any other value.

    It also says not to use `for (i >= 0)` because any unsigned integer is >= 0, and the loop will never end.

  • kenferry 1 hour ago
    I know it's "too clever", but if I'm writing code no one else will ever see,

      while (i --> 0) {
          // use array[i]
      }
    
    easy to read (if not understand), and correct!
    • krackers 1 hour ago
      Oh I remember this from the classic SO post, but it was just presented as a funny trick. I never realized that it solves the issue mentioned in the article and there is a legitimate use-case for post-decrement in the comparison itself.

      https://stackoverflow.com/questions/1642028/what-is-the-oper...

    • viega 1 hour ago
      I always use unsigned values and do:

        while (i-- != 0) { ... }
      
      It's more clear than the most idiomatic way, which is to drop the explicit comparison:

        while (i--) { ... }
       
      All of it is better than the clunky old for-loop syntax.
    • mtklein 28 minutes ago
      I don't think it's too clever at all. Notably it works with both signed and unsigned i. Frankly if I see anyone doing anything other than this, they're wrong.
    • stephencanon 1 hour ago
      Always.

      (Hi Ken!)

  • AdieuToLogic 26 minutes ago
    Why not use the C/C++ idiom of pointer math?

      _Bool find_last (size_t count, int *haystack, int needle, size_t *where)
      {
        for (const int *pos = haystack + count; pos-- != haystack;) {
          if (*pos == needle) {
            *where = pos - haystack;
            return 1;
          }
        }
        return 0;
      }
  • MaulingMonkey 1 hour ago
    I prefer:

        const size_t n = 10;
        for (size_t i = n; i --> 0;) {
            std::cout << i << "\n";
        }
    • hedgehog 1 hour ago
      That's a certain kind of taste... I checked out your home page, game dev, check, and this work of art is worth linking (no irony, I love it):

      http://maulingmonkey.com/brainfuck/

      • omoikane 30 minutes ago
        That looks like the brainfuck mandelbrot set by Erik Bosman, but the example is missing the header line with the credit. The one I saw came from here:

        https://github.com/thaliaarchi/bfcorpus/blob/main/ebosman/ma...

        Be sure to check out other files in that directory for how the program is assembled.

        (Erik Bosman's mandelbrot set is a personal favorite of mine, very useful for benchmarking brainfuck interpreters)

    • ranger_danger 1 hour ago
      Cute but wouldn't work with ssize_t :)

      VHDL's array/vector syntax actually works a similar way:

      -- gives 0, 1, 2, 3:

      for i in 0 to 3 loop

      -- gives 3, 2, 1, 0:

      for i in 3 downto 0 loop

      -- Source - https://stackoverflow.com/a/7642026 -- Posted by Kerrek SB -- Retrieved 2026-10-29, License - CC BY-SA 3.0

      • fourthark 1 hour ago
        Does work with ssize_t, just not necessary.
        • ranger_danger 32 minutes ago
          Depends on your definition of "work".

          For me it does not work because I'd want to use it with values < 0, but the for loop checks for > 0, so I would have to modify that first.

  • abstractspoon 2 days ago
    I've been using this method for more than 30 years!
  • lanmu 43 minutes ago
    [flagged]
  • rpsworld 1 hour ago
    [flagged]