Можно ли использовать переменную const, которую можно изменить, для объявления и определения массива в C и C ++? - PullRequest
1 голос
/ 16 марта 2020

Посмотрите на код ниже:

#include <iostream>
int main(void) {
    int  number1 = 4;
    double salary[number1];
    return 0;
}

Несмотря на то, что он может быть успешно скомпилирован, его следует считать неправильным, поскольку число 1 не является константной переменной.

#include <iostream>

int main(void) {
    int  number1 = 4;

    const unsigned number2 = number1;
    double salary[number2];

    return 0;
}

Теперь число 2 является const variable.

Также успешно скомпилировано.

Я чувствую, что это неправильно или, по крайней мере, не очень хорошая практика.

Но я не могу объяснить, почему.

Может кто-нибудь объяснить, почему это неправильно?

Ответы [ 2 ]

11 голосов
/ 16 марта 2020

Может ли переменная const, которая может быть изменена, использоваться для объявления и определения массива в ... C ++?

No.

Хотя это может быть успешно скомпилированным

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

, поскольку number1 не является константной переменной.

В некотором роде, косвенно. Точная причина в том, что number1 не является константным выражением. Создание переменной const было бы достаточно в в этом случае, чтобы сделать пример правильно сформированным, потому что инициализатор переменной является константным выражением.

Теперь number2 является константной переменной .

Также успешно скомпилировано.

Я чувствую, что это неправильно

Ваши чувства верны. Программа все еще плохо сформирована. В качестве стандартного компилятора требуется сообщить вам (вы можете попросить G CC соответствовать стандарту с помощью опции -pedantic):

warning: ISO C++ forbids variable length array 'salary' [-Wvla]
double salary[number2];
       ^~~~~~

Может кто-нибудь объяснить, почему это так? не так?

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

Идентификатор константной переменной не обязательно является константным выражением , Переменная должна быть const, и , инициализатор переменной должен быть константным выражением. 4 является постоянным выражением. Идентификатор неконстантной переменной не является константным выражением. Если значение определяется во время выполнения, оно не может быть константным выражением.


Может ли переменная const, которую можно изменить, использоваться для объявления и определения массива в C ... ?

Потенциально, да. До C99 нет по тем же причинам, которые описаны в ответе C ++.

В C99 да, потому что в язык были введены массивы переменной длины. Начиная с C11, да, если компилятор поддерживает это; VLA были сделаны необязательными в этом стандарте.

3 голосов
/ 16 марта 2020

Может ли переменная const, которая может быть изменена, использоваться для объявления и определения [размера] массива в C и C ++?

В C языке программирования a массив переменной длины - это объявление массива переменного размера. Выражение внутри фигурных скобок int array[here] не является константным выражением и вычисляется во время выполнения (и всегда должно иметь значение, превышающее ноль). Это часть стандарта C99.

VLA не является частью C ++ и недопустима в C ++, но некоторые компиляторы поддерживают массивы переменной длины также в C ++ как расширение компилятора.

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