Почему эти определения не являются законными в C? - PullRequest
1 голос
/ 23 апреля 2020

Я читаю книгу о C, и я не понимаю эту концепцию:

Еще одно распространенное заблуждение - думать о переменной с определением const как о константном выражении. В C const означает «только для чтения», а не «постоянная времени компиляции». Итак, глобальные определения, такие как const int SIZE = 10; int global_arr [SIZE]; и const int SIZE = 10; int global_var = SIZE; недопустимы в C.

Я также не очень хорошо понимаю разницу между константной переменной и константным выражением. Все константные переменные являются константными выражениями, верно? Я перечитал другие вопросы по поводу этой темы c, но до сих пор не понял. Спасибо.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

предположим, что у вас есть

int a = 42;
const int *b = &a;

сейчас *b is const ie только для чтения . Вам не разрешено изменять *b без отбрасывания const (спасибо Eri c Postpischil)

// *b = -1; // not allowed
a = -1;
printf("%d\n", *b); // print -1

Дело в том, что значение const квалифицированного объекта может изменить. Постоянное значение никогда не изменяется.

0 голосов
/ 23 апреля 2020

Что они в основном означают, так это то, что в C запрещено использовать квалифицированную переменную const для инициализации другой переменной или определения размера массива с ней в глобальной области видимости, например:

const int SIZE = 5;
int a = SIZE;              // This is not allowed.
int b[SIZE];               // This is also not allowed.

int main(void)
{
   ...
}

Это потому, что переменные и массивы в глобальной области видимости должны быть определены во время времени компиляции . const квалифицированная переменная по-прежнему является переменной, и значения переменных вычисляются / оцениваются в время выполнения .

A макро константа , которая является «постоянной времени компиляции», может быть использована для этого, например, например:

#define SIZE 15

int a[SIZE];             // This is ok.
int b = SIZE;            // This is ok, too.

Я также надеваю не очень хорошо понимаю разницу между const переменной и константным выражением. Все const переменные являются константными выражениями, верно?

Нет.

Цитата из ИСО: IEC 9899/2018 (C18), раздел 6.6 / 2:

" Постоянное выражение может быть оценено во время перевода довольно чем во время выполнения, и, соответственно, может использоваться в любом месте, где константа может быть."

Выражение константы - это буквальное выражение, которое всегда оценивается одним и тем же значением - вычисленное значение постоянная. Поэтому его можно оценить во время компиляции.

Fe:

5 + 4 

всегда равно 9 и поэтому может быть оценено во время компиляции.

В то время как переменная const :

const int SIZE = 5;

или

(const int SIZE 5;)

5 + 9 + SIZE; 

не является константным выражением, поскольку оно подразумевает переменную. Хотя переменная SIZE определяется как const (что означает, что она не может быть изменена после инициализации), она не является константным выражением, поскольку переменная, не имеет значения, вычисляется ли она const или нет, / вычисляется во время выполнения.

A const квалифицированная переменная не является и не может быть частью константного выражения.

...