Правило «неявного int»

Содержание

Первоначальная версия С отличалась особенностью, которую иногда называют правилом «неявного int» (а также правилом «int по умолчанию»). Это правило состоит в том, что если спецификатор базового типа явно не указан, то подразумевается спецификатор int. Это правило было включено в стандарт С89, но в С99 это правило не вошло. (И, кроме того, не поддерживается в языке C++.) Так как правило «неявного int» теперь устарело, то в этой книге оно не используется. Однако из-за того, что во многих действующих программах это правило еще используется, то о нем следует немного рассказать.

Больше всего правило «неявного int» использовалось при определении типа результата функции, т.е. при определении возвращаемого типа. Много лет назад большинство программистов, писавших программы на С, пользовались этим правилом, когда писали код функций, возвращавших результат типа int. Поэтому много лет назад такая функция, как

int f(void) {
  /* ... */
  return 0;
}

часто могла быть написана таким образом:

f(void) { /* int - возвращаемый тип по умолчанию */
  /* ... */
  return 0;
}

В первом случае возвращаемый тип int определяется явно. Во втором же — подразумевается по умолчанию.

Правило «неявного int» применяется не только к значениям, возвращаемым функциями (хотя это было самое распространенное применение). Например, для С89 и более ранних вариантов С правильной является следующая функция:

/* по умолчанию возвращается тип int,
   такой же тип, как и у параметров a и b */
f(register a, register b) {
  register c; /* переменная c по умолчанию
                 также будет иметь тип int */

  c = a + b;

  printf("%d", c);

  return c;
}

Здесь возвращаемым типом по умолчанию для f() является int; т.е. такой же тип по умолчанию, как и у параметров а и b, и у локальной переменной c.

Помните, что правило «неявного int» не поддерживается в С99 или C++. Таким образом, использовать его в программах, совместимых с С89, не рекомендуется. Лучше всего явно определять каждый тип, используемый в вашей программе.