Это означает, что кто-то делает предположения.Вы можете сделать это с символами, которые представляют целое число: c - '0'
даст вам целочисленное значение, соответствующее символу '0'
, '1'
, '2
', ... '9
'.Это гарантировано определением языка.Там нет такой гарантии для любых других значений символов.Таким образом, этот код предполагает , что c - 'a'
выдаст числовое значение, которое каким-то образом отражает символ, который представляет c
.В наиболее распространенных кодировках символов это работает;в ASCII, который является наиболее широко используемым, если c
представляет строчную букву, то c - 'a'
отображает 'a'
в 0, 'b'
в 1, ..., 'z'
в 25.Но есть символьные представления, для которых это не так.
Обратите внимание, однако, что этот код не выполняет никакой проверки ввода.Если кто-то набрал «Z», «0» или «;»(чтобы назвать только несколько), результирующий индекс будет вне границ массива, и, вероятно, произойдут плохие вещи.
Что касается int a[26] = {0};
, это называется агрегатная инициализация .Массив - это агрегат, то есть он содержит несколько значений.Инициализатор в форме {something}
копирует something
в первый элемент в совокупности и устанавливает остальные элементы в 0. Таким образом, int a[26] = {0};
устанавливает все 26 элементов массива a
в 0.
Инициализатор в агрегатной инициализации не должен иметь значение 0. int a[26] = {3};
установит для первого элемента (a[0]
) значение 3, а для остальных элементов массива - 0.
Совокупная инициализация не ограничена одним значением.Вы можете иметь столько значений, сколько хотите, разделенных запятыми.Таким образом, int a[26] = { 1, 2, 3 };
установит первые три элемента на 1, 2 и 3 соответственно, а все остальные на 0. И если инициализаторов больше, чем элементов, дополнительные игнорируются.