C++, использование char для доступа к элементам массива

252
24 декабря 2021, 05:50

Я хочу уточнить один момент, касающийся использования char для доступа к элементам массива.

Мне известно, что char - это тип, единственное предназначение которого - хранить однобайтовые символы. Этот тип может быть как unsigned char, так и signed char.

Следовательно, char не годится для адресаций элементов массивов.

Например:

void Object::set(const char _char)
{
    // size_t elements[UINT8_MAX];
    elements[_char] += 1;
}

То есть, если char окажется знаковым, то мы будем писать в элементы массива с индексами [-128; 127]. Очевидно, что в массиве не существует элементов с индексами [-128; -1].

Все верно?

Или, может быть, при использовании char в качестве индексомера существует неявная конвертация в беззнаковый тип? Я сомневаюсь, что существует, но и полной уверенности, что использовать char в описанной ситуации нельзя, у меня нет.

Answer 1

char - это тип, единственное предназначение которого - хранить однобайтовые символы

Нет, это целочисленный тип, который также может хранить куски многобайтовых символов и вообще произвольные данные.

Этот тип может быть как unsigned char, так и signed char.

Нет, это отдельный тип, хотя он может быть со знаком или без.

static_assert(not ::std::is_same_v<char, unsigned char>); // ok
static_assert(not ::std::is_same_v<char, signed char>); // ok

char не годится для адресаций элементов массивов

Нет, он вполне годится для индексации массивов и адресной арифметики вообще если проверять предположения по поводу его знаковости и выхода за пределы.

void Object::set(const char index)
{
    static_assert(::std::is_unsigned_v<decltype(index)>);
    static_assert(::std::numeric_limits<decltype(index)>::max() <= ::std::size(elements));
    // size_t elements[UINT8_MAX];
    elements[index] += 1;
}
Answer 2

В качестве индекса массива в c++ кошерно использовать любой интегральный тип, то есть: bool, char, signed char, unsigned char, char8_t, char16_t, char32_t, wchar_t, short, int, long, long long, unsigned short, unsigned int, unsigned long, unsigned long long, как всегда таких случаях в Плюсах, ответственность за членовредительство лежит на программисте, никаких явных преобразований язык не проводит, поэтому в данной функции можно вставить проверку, что-то вроде assert(_char >= 0)

READ ALSO
Работа со строками (string) в С++

Работа со строками (string) в С++

Подскажите как можно сделать сие действие:

188
Работа с valarray и струкутрами

Работа с valarray и струкутрами

Есть некоторая структура

176
Поиск подстроки в std::vector&lt;string&gt;

Поиск подстроки в std::vector<string>

Подскажите как решить следующую задачу оптимальным путем:

129
Как передать массив в конструктор в C++?

Как передать массив в конструктор в C++?

Я реализовываю свой класс vector, но у меня возникла проблема: как передать в конструктор массив в таком виде: ClassName object = {1, 2, 3, 4, 5};?

179