Каков тип индекса массива на языке программирования С++? Например, в таком выражении:
int tab[5];
К какому типу 5 преобразуется? или, может быть, это просто int?
Каков тип индекса массива на языке программирования С++? Например, в таком выражении:
int tab[5];
К какому типу 5 преобразуется? или, может быть, это просто int?
В этом коде 5
является просто литералом простого целого, поэтому здесь просто просто int
.
§8.3.4. Массивы в n3290 (~ С++ 11) задают объявления массива:
В объявлении T D, где D имеет вид
D1 [ constant-expressionopt ] attribute-specifier-seqopt
а тип идентификатора в объявлении T D1 - это "тип-тип-тип-декларатор-тип T", тогда тип идентификатора D является типом массива; если тип идентификатора D содержит автоматический тип-спецификатор, программа плохо сформирована. T называется типом элемента массива; этот тип не должен быть ссылочным типом, void, возможно, cv-qualit, тип функции или тип абстрактного класса. Если присутствует постоянное выражение (5.19), оно должно быть интегральным постоянным выражением, а его значение должно быть больше нуля.
§5.2.1. Подпись описывает, что может быть в скобках в выражениях:
Постфиксное выражение, за которым следует выражение в квадратных скобках, является постфиксным выражением. Одно из выражений должно иметь тип "указатель на Т", а другой должен иметь неперечисленное перечисление или интегральный тип. Результатом является lvalue типа "T". Тип "T" должен быть полностью определенным типом объекта. Выражение E1 [E2] идентичен (по определению) к * ((E1) + (E2))
Вопрос несколько запутан. В заголовке упоминается тип индекса массива, но в вопросе вы, похоже, спрашиваете что-то еще. Вы спрашиваете о размере массива? или индекс в массив? Размер объявленного массива должен быть больше нуля; он может иметь любой интегральный тип: int
, char
, signed char
, unsigned int
и т.д. В вашем вопросе тип литерала 5
равен int
.
Однако, если вы спрашиваете о типе индекса для массива, то он должен быть одним из интегральных типов. Тип индекса для массива может быть int
также, поскольку он может даже быть отрицательным.
int a[10][10];
int x = a[3][-1]; //same as a[2][9]
int y = a[3][-2]; //same as a[2][8]
int z = a[3][-3]; //same as a[2][7]
int tab[5];
- объявление массива.
Объявление массива принимает целочисленное постоянное выражение, значение которого больше нуля (С++ 11: §8.3.4).
Постоянное выражение является интегральным постоянным выражением, если оно имеет интегрального или перечисляемого типа. [Примечание: такие выражения могут использоваться как (8.3.4, 5.3.4), как выражения для случая (6.4.2), как бит-поле длины (9.6),...
5
является целым литералом (§2.14.2). Его тип int
.
2 Тип целочисленного литерала является первым из соответствующего список в таблице 6, в котором может быть представлено его значение.
3 Если целочисленный литерал не может быть представлен каким-либо типом в его списке и расширенный целочисленный тип (3.9.1) может представлять его значение, он может иметь этот расширенный целочисленный тип....
Типы десятичных констант без суффикса в таблице 6: int
, long int
, long long int
.
Это int
, если вы хотите использовать sufix другого типа, например:
5 // int
5u // unsigned int
5l // long
5ul // unsigned long