C#

Почему в C# нумерация (индексы) элементов массива начинаются с нуля, а не с единицы?

Это ведь неудобно, часто путаешься, если работаешь в каком-нибудь сложном проекте где много циклов.
С чем связано это решение, что начальный индекс первого элемента массива равен 0?
Потому что ноль тоже число в памяти если его не использовать то слишком расточительно. Двоичная логика основана на нуле и на единице.
Триггер, транзисторный ключ имеет ноль и один состояния. Поэтому ноль везде используется. И это не только в шарпе. Это в любой ЭВМ.
Евгений Ильин
Евгений Ильин
65 504
Лучший ответ
Потому что абсолютно везде и всегда они начинаются с нуля. Это позволяет серьезно сэкономить на расчете индексов.
Ненулевой (и даже не цифровой) начальный индекс позволяли задавать только некоторые древние языки, вроде паскаля и фортрана. Что было в некоторых случаях удобно, но либо медленно, либо требовало некоторых выравниваний таких массивов, жравших память.

>если работаешь в каком-нибудь сложном проекте
Если ты используешь в сложных проектах массивы, то мне тебя жаль. C# поддерживает огромное количество удобных и современных структур данных, а ты все на массивах сидишь...
Gheorghe Popa И чем плохи массивы в сложных проектах? Если они там нужны, то именно их и надо использовать.
1. В памяти массив начинается с нуля, потому что есть адрес массива, а смещение от него на 1 это уже второй элемент.
2. Так сложилось исторически и C# наследовал подходы его предшественников: C, C++, Java и т. д.
3. Сегодня сделать индексацию массива, начиная с единицы, не составляет проблем, потому что один лишний байт памяти сегодня погоды не делает, но уже все привыкли и многие начнут плеваться. В пайтон были попытки и буйные драчки на этот счет.
Олег Болтыров
Олег Болтыров
66 221
Никто не путается кроме нубов, которые с паскаля пересели.
Потому что ноль первая цифра
И компы работают на бинарном коде
Олег Савинкин судя по твоему ответу если тебя попросят яблоки посчитать и на столе будет 3 яблока, то ты насчитаешь 2, потому что ноль это первая цифра.
тебе бы бухгалтером работать
Ну, если тебе это тебе это так сильно мешает то всегда можно извратиться и сделать что-то такое... (скрин). Вот только полезность данного решения вызывает сомнения.

Да и к тому же, есть огромное количество различных структур данных вместо массивов, пользоваться которыми в разы удобнее, чем городить такое...

Код: https://pastebin.com/Mn2hEnUD
Это скорее всего связано с тем, что синтаксис данного языка основан на C, в котором обращение к элементу массива выглядит следующим образом:
A[k] - элемент k массива A. Однако компилятор это интерпретирует несколько иначе. Массив - набор элементов, находящийся в памяти последовательно - один за другим. A - адрес первого элемента, k - смещение относительно данного элемента. Данная интерпретация массивов стала стандартом.
Алексей Долгалёв Ну дык почему адрес первого элемента не может быть 1? Может это просто связано с бинарной системой, на которой комп и работает
Евгений Ильин И где в вашем ответе ноль? Нулевой индекс?
Потому что долбoeбы эту xyету писали, а мы мучаемся.
Потому, что имя массива является указателем на адрес первого элемента в массиве = адрес_массива + 0*(кол-во байт типа), то есть первый элемент, второй элемент = адрес_массива + 1*(кол-во байт типа) = array[0+1]=array[1], третий соответственно = адрес_массива + 2*(кол-во байт типа). Поэтому собственно нельзя добавлять в массивы разные типы данных, поскольку программа не может просчитать заранее сколько памяти нужно под массив, под int 4 байта, под short 2 байта.