Вопрос по c, variables – объявление переменных без какого-либо типа данных в c

22

В этомc программа

a=8;
main()
{
    printf("%d", a);
}   

переменная a была объявлена без какого-либо типа данных, и все же эта программа успешно компилируется и выдает желаемый результат.
выход ::

8  

увидеть это наideone.
но когда я объявил ту же самую переменную внутри main, это дает ошибку компиляции.

main()
{
     a=8;
    printf("%d", a);
}  

выход ::

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’  

увидетьВот.

How the first program is working but the second?

Ваш Ответ

6   ответов
0

пример:

fun(n){printf("%d",n);}

Приведенный выше код работает нормально, но как только фиксированный тип данных включается в параметры, такие как

fun(n,char c){ printf("%d",n);}

Это показывает ошибку: ошибка: ожидается ")" до "символа" |

Это отдельный вопрос к вопросу.fun(n) вводит определение функции в стиле K & amp; R
23

& quot; Неявное Int Rule & quot; на работе. Проще говоря, правило гласит:

"A variable declared without an explicit type name is assumed to be of type int."

Обратите внимание, что это правило было отменено в стандарте c99[Ref 1]Однако, в зависимости от вашего компилятора и его настроек, первый пример может скомпилироваться с предупреждением или не скомпилируется (with strict compilation settings)

Если вы скомпилируете свой первый пример со строгими настройками в соответствии со стандартом c99, компилятор сообщит вам причину.

проверятьВот.

cc1: warnings being treated as errors
prog.c:1: error: data definition has no type or storage class
prog.c:1: error: type defaults to ‘int’ in declaration of ‘a’
prog.c:3: error: return type defaults to ‘int’
prog.c: In function ‘main’:
prog.c:4: error: implicit declaration of function ‘printf’
prog.c:4: error: incompatible implicit declaration of built-in function ‘printf’

РЕДАКТИРОВАТЬ:

why does the first example work but second does not?

Обратите внимание на акцент на слова «объявленная переменная» в правиле.

В первом примере, поскольку оператор находится в глобальной области видимости, он рассматривается какImplicit declarationиImplicit Int Rule применяется к этому.

Во втором примере утверждение действует какAssignment and not a Declaration, Поскольку нет декларацииImplicit int rule здесь не распространяется. При отсутствии какого-либо типа компилятор не может определить типa и, следовательно, сообщает об ошибке.

[Ref 1]

C99 Standard: Foreword
Para 5:

This edition replaces the previous edition, ISO/IEC 9899:1990, as amended and corrected by ISO/IEC 9899/COR1:1994, ISO/IEC 9899/COR2:1995, and ISO/IEC 9899/AMD1:1995.
Major changes from the previous edition include:
.....
.....
— remove implicit int
.....
.....

Я отменил это ;-)
Я чувствую, что это имеет значение. Однако для более полного ответа вы можете объяснить, что во втором примереa = 8 это присвоение, а не декларация.
@pmr: надеюсь, что отредактированный ответ удовлетворит ваше возражение.
Для первой программы вы сказалиmain() функция по умолчаниюint, Но он успешно скомпилирован, даже когда я только что позвонилreturn;(без какой-либо стоимости) в основном. Как это возможно?
@ nitish712: Вам нужно будет скомпилировать свою программу, включив все предупреждения компилятора.-Wall в случае, если вы используете GCC. Стандарты C и C ++ не требуют, чтобы компиляторы проверяли, возвращает ли функция значение во всех путях кода & amp; поэтому по умолчанию компиляторы не будут предоставлять эту диагностику. Вы должны явно указать компилятору сделать это. Также обратите внимание, что функции w.r.tmain Если в некоторых отношениях к какой-либо функции применяется особый режим, вы можете проверить стандарты этих правил.
0

int.

Это та же самая причина, по которой вы можете использоватьregister вместоregister int, или жеunsigned вместоunsigned int, auto вместоauto int, а такжеstatic вместоstatic int, Я лично всегда четко определяю свои переменные сint, но будь вы или нет, это ваш выбор.

В шекспировской C.
0

auto  Ключевое слово. К сожалению, C и C ++ являются строго типизированными языками, для которых требуется определить строгий тип для каждой объявленной переменной. Некоторые компиляторы предполагают, что int является значением по умолчанию, но это их разум, и его не следует использовать, потому что это признано. как неправильная привычка программирования.

Этот вопрос касается C, а не C ++. C - это язык со стандартом, который можно использовать для ответа на этот вопрос.
0

даже если вы не записали тип данных.

Это плохая практика, чтобы воспользоваться этой функцией.

Очевидно, ваш компилятор не позволяет этому происходить внутри функции. Это имеет смысл, потому что если бы он позволял & quot; a = 8; & quot; в функции было бы очень трудно поймать определенные опечатки.

4

a=8; вне функции выглядит какdeclaration statment, гдеa это спецификатор объявления и= 8 это инициализатор. C используется, чтобы позволить опускать типы в спецификаторах объявления и по умолчаниюint в таком случае. (Начиная с C99, это больше не разрешено.)

Тем не менее, в функции,a=8; выглядит какexpression statement (выражение присваивания) и символa не решена. (Обратите внимание, что у вас нет выражений вне функций.)

Если вы пытались сделать, например,static a = 8;, тогда он снова будет выглядеть как объявление и должен скомпилироваться, потому что тип по умолчанию будет int.

Во всяком случае, не надейтесь на это :-) Пишите свои типы четко.

Намного лучше ;-)
@AnttiHaapala Я бы очень хотел, чтобы C99 был обычным делом 18 лет назад. :( Обновил ответ, теперь выглядит хорошо?

Похожие вопросы