Объявление переменных без какого-либо типа данных в c
В этой программе c
a=8;
main()
{
printf("%d", a);
}
переменная a была объявлена без какого-либо типа данных, и эта программа успешно компилируется и дает желаемый результат.
output::
8
см. на ideone.
но, когда я объявлял ту же переменную внутри main, она дает ошибку компиляции.
main()
{
a=8;
printf("%d", a);
}
output::
prog.c:2: warning: return type defaults to ‘int’
prog.c: In function ‘main’:
prog.c:3: error: ‘a’ undeclared (first use in this function)
prog.c:3: error: (Each undeclared identifier is reported only once
prog.c:3: error: for each function it appears in.)
prog.c:4: warning: implicit declaration of function ‘printf’
prog.c:4: warning: incompatible implicit declaration of built-in function ‘printf’
см. здесь.
Как работает первая программа, но вторая?
Ответы
Ответ 1
Здесь вы видите "Implicit Int Rule" . Проще говоря, правило гласит:
"Объявленная переменная без явного имени типа имеет тип int
."
Обратите внимание, что это правило было отменено в стандарте c99 [Ref 1]. Однако, в зависимости от вашего компилятора и его параметров, первый пример может скомпилироваться с предупреждением или не скомпилировать ( со строгими настройками компиляции)
Если вы скомпилируете свой первый пример со строгими настройками, придерживающимися c99 Standard, компилятор скажет вам основную причину.
проверьте здесь.
cc1: предупреждения обрабатываются как ошибки
prog.c: 1: ошибка: определение данных не имеет типа или класса хранения
prog.c: 1: error: введите defaults в 'int в объявлении' a
prog.c: 3: ошибка: тип возврата по умолчанию - 'int
prog.c: В функции 'main:
prog.c: 4: ошибка: неявное объявление функции 'printf
prog.c: 4: ошибка: несовместимое неявное объявление встроенной функции 'printf
EDIT:
почему первый пример работает, а второй не работает?
Обратите внимание на акцент на слова "переменная, объявленная" в правиле.
В первом примере, поскольку оператор находится в глобальной области видимости, он рассматривается как Неявное объявление, и к нему применяется неявное внутреннее правило.
Во втором примере оператор действует как Назначение, а не Декларация. Поскольку нет объявления, здесь не применяется правило Implicit int. В отсутствие какого-либо типа компилятор не может определить, что является типом a
и, следовательно, сообщает об ошибке.
[Ref 1]
Стандарт C99: Предисловие
Параграф 5:
Это издание заменяет предыдущее издание ISO/IEC 9899:1990
с поправками и исправлениями на ISO/IEC 9899/COR1:1994
, ISO/IEC 9899/COR2:1995
и ISO/IEC 9899/AMD1:1995
.
Основные изменения в предыдущем выпуске:.....
.....
- удалить неявный int
.....
.....
Ответ 2
a=8;
вне функции выглядит как декларация объявления, где a
- спецификатор объявления, а = 8
- инициализатор. C, используемый для исключения типов в спецификаторах объявлений и по умолчанию используется int
в этом случае. (С C99 это больше не разрешено.)
Однако в функции a=8;
выглядит как оператор выражения (выражение назначения), а символ a
не разрешен. (Обратите внимание, что у вас нет операторов выражения вне функций.)
Если вы попытались сделать это, например static a = 8;
, тогда он снова будет выглядеть как объявление и должен скомпилироваться, потому что тип по умолчанию будет иметь значение int.
В любом случае, не полагайтесь на это:-) Четко напишите ваши типы.
Ответ 3
Это потому, что в C любая переменная/функция неявно int
.
По той же причине вы можете использовать register
вместо register int
или unsigned
вместо unsigned int
, auto
вместо auto int
и static
вместо static int
. Я лично всегда четко определяю свои переменные с помощью int
, но независимо от того, делаете вы это или нет, это ваш вариант.
Ответ 4
У вашей переменной есть тип данных (int), даже если вы не записывали тип данных.
Плохая практика - воспользоваться этой возможностью.
По-видимому, ваш компилятор не позволяет это произойти внутри функции. Это имеет смысл, потому что, если это позволяет "a = 8;" в функции было бы очень сложно поймать некоторые типографские изделия.
Ответ 5
В С++ 11 есть auto
К сожалению, C и С++ являются строго типизированными языками, для которых требуется определить строгий тип для каждой объявленной переменной. Некоторые compliers предполагают int по умолчанию, но это их разум и не следует использовать, поскольку он признал
как неправильная привычка программирования.
Ответ 6
даже параметр функции может быть записан как неявный int.
Пример:
fun(n){printf("%d",n);}
Приведенный выше код работает нормально, но как только фиксированный тип данных включен в параметры, например
fun(n,char c){ printf("%d",n);}
Здесь отображается ошибка:
error: expected ')' before 'char' |