Может ли переменная 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 были сделаны необязательными в этом стандарте.