News for hackers. Stuff that matters.
Re:Why do arrays start at 0? by iopq on Thursday August 25, 2022 @02:10AM (#32590172)
Counter-example:

You have to remove all desks from #20 to #30, how many desks are there?

Oh, it's 11 desks, I see. This is because we used INCLUSIVE indexing, instead of semi-open interval.

If we use semi-open intervals, we don't include the last item, so that we can write

    match index {
        0..10 => println!("first ten"),
        10..20 => println!("next ten"),
        _ => println!("something else"),
    }
but this forces us to start our intervals at 0, otherwise we would have to write 1..11 which would be awkward
Re:Why do arrays start at 0? by maxdamantus on Thursday August 25, 2022 @04:18AM (#32591028)
Indeed. End exclusion is advantageous because we don't need to add or subtract 1 when constructing or interpreting ranges. Forgetting to add or subtract 1 is basically why off-by-one errors exist (and doing add rather than subtract or vice versa is probably why off-by-two errors exist).

`a..(a+n)` is an n-length range, not an (n + 1)-length range (oh look, an "add 1" operation!).

And an empty range is denoted by `a..a`, not `a..(a-1)` (oh look, a "subtract 1" operation!).

Re:Why do arrays start at 0? by gernb on Thursday August 25, 2022 @04:29AM (#32591115)
doesn't swift use inclusive indexing? 1...10 includes 10
Re:Why do arrays start at 0? by maxdamantus on Thursday August 25, 2022 @04:51AM (#32591244)
Haven't used Swift, but looking at the documentation, it seems to support `...` for end-inclusive and `..<` for end-exclusive.

Looking at the Swift standard library, end-exclusive ranges seem to be far more commonly used:

  ~/build/swift$ git grep -e '\.\.< *[a-zA-Z0-9_(]' --and --not -e '^ *//' -- stdlib/\*.swift | wc -l
  599

  ~/build/swift$ git grep -e '\.\.\. *[a-zA-Z0-9_(]' --and --not -e '^ *//' -- stdlib/\*.swift | wc -l
  112