Два разных выхода - PullRequest
       4

Два разных выхода

4 голосов
/ 11 октября 2010
 #include<stdio.h>

int main(void)
{
   static int i=i++, j=j++, k=k++;
   printf("i = %d j = %d k = %d", i, j, k);
   return 0;
}

Выход в Turbo C 4.5:

i = 0 j = 0 k = 0

В gcc я получаю ошибку:

Элемент инициализатора не является константой

Какой из них является логически правильным? Я в замешательстве ..

Ответы [ 5 ]

12 голосов
/ 11 октября 2010

Стандарт говорит об инициализации (6.7.8):

4 & emsp; Все выражения в инициализаторе для объекта со статической продолжительностью хранения должны быть константными выражениями или строковыми литералами.

(Это из C99, но C89 говорит почти то же самое.)

Таким образом, похоже, что GCC более верен, чем 15-летняя девчонка. (Кто бы мог подумать?)

2 голосов
/ 11 октября 2010

Я знаю, что это не ответ, но все же зачем использовать сложный пример для теста?

Хорошо, давайте все упростим:

#include<stdio.h>
int main(void)
{
   static int i;
   printf("i = %d", i);
   return 0;
}

Выход:

i = 0

Но что, если ...?

 #include<stdio.h>
 int main(void)
{
   static int i=i;
   printf("i = %d", i);
   return 0;
}

Выход:

prog.c: In function ‘main’:
prog.c:4: error: initializer element is not constant
1 голос
/ 11 октября 2010

GCC здесь правильно.

static переменные инициализируются (во время загрузки программы) значением, указанным в инициализаторе (или 0, если инициализатор не был задан).Поскольку эта инициализация происходит перед запуском программы, инициализаторы для static переменных должны быть константами времени компиляции.Выражение, содержащее оператор ++, явно не является константным выражением.

0 голосов
/ 11 октября 2010

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

0 голосов
/ 11 октября 2010

Я думаю, что GCC здесь верен.Инициализатор не должен быть переменной.Вы пытаетесь инициализировать переменную с самим собой, прежде чем она будет определена.

Я предполагаю, что "причины" в Turbo C означают, что i в конце концов является статической переменной и, следовательно, должно иметь значение ноль (поскольку все статические переменные имеютпо умолчанию), затем игнорирует операцию ++.

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