Подтвердить что ты не робот

Объявление переменных без какого-либо типа данных в 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’  

см. здесь.

Как работает первая программа, но вторая?

4b9b3361

Ответ 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' |