programing

c에 데이터 유형이 없는 변수 선언

javajsp 2023. 10. 6. 20:53

c에 데이터 유형이 없는 변수 선언

이 점에서.c프로그램.

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

변수 a는 어떠한 데이터 형식도 없이 선언되었지만 여전히 이 프로그램은 성공적으로 컴파일되어 원하는 출력을 제공합니다.
출력 ::

8  

그것을 하나에서 봅니다.
그러나 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’  

여기 보세요.

첫 번째 프로그램은 어떻게 진행되고 두 번째 프로그램은?

여기 보이는 것이 직장에서의 "묵시적 인트 룰"입니다.간단히 말해서, 다음과 같은 규칙이 있습니다.

"명시적 유형 이름 없이 선언변수는 다음 유형으로 가정됩니다.int."

이 규칙은 c99 표준에서[Ref 1] 취소되었습니다.그러나 컴파일러 및 설정에 따라 첫 번째 예제는 경고와 함께 컴파일되거나 (엄격한 컴파일 설정으로) 컴파일에 실패할 수 있습니다.

c99 Standard를 준수하는 엄격한 설정으로 첫 번째 예제를 컴파일하면 컴파일러가 근본 원인을 알려줍니다.

여기 확인해 보세요.

cc1: 경고가 오류로 처리됨
prog.c:1: 오류: 데이터 정의에 유형 또는 스토리지 클래스가 없습니다.
prog.c:1: 오류: 'a' 선언에서 기본값을 'int'로 입력합니다.
prog.c:3: 오류: 반환 유형 기본값은 'int'입니다.
prog.c: 함수 '메인'에서:
prog.c:4: 오류: 함수 'printf'의 암묵적 선언
prog.c:4: 오류: 내장 함수 'printf'의 호환되지 않는 암묵적 선언

편집:

첫번째 예는 효과가 있지만 두번째 예는 효과가 없는 이유는?

규칙에서 "variable declated"라는 단어를 강조하는 것에 주목합니다.

첫 번째 예에서는 문장이 전역 범위에 있으므로 암시적 선언으로 처리되고 암시적 Int 규칙이 적용됩니다.

두 번째 예제에서 문장은 선언아닌 할당으로 작동합니다.선언이 없으므로 암시적 int 규칙은 여기에 적용되지 않습니다.어떤 유형도 없다면 컴파일러는 무엇이 유형인지 결정할 수 없습니다.a따라서 오류를 보고합니다.


[참조 1]

C99 표준:서문
파라 5:

이 판은 이전 판을 대체합니다.ISO/IEC 9899:1990, 에 의해 수정 수정된.ISO/IEC 9899/COR1:1994,ISO/IEC 9899/COR2:1995,그리고.ISO/IEC 9899/AMD1:1995.
이전 에디션에서 변경된 주요 사항은 다음과 같습니다.
.....
.....
— 암묵적인 int를 제거합니다.
.....
.....

a=8;함수의 외부는 선언문처럼 보입니다. 여기서.a은입니다.= 8는 이니셜라이저 입니다.수 허용하는 데 은 C는다입니다.int그 경우에는이후로는 더 (C99 이후로 이는 더 이상 허용되지 않습니다.

a=8;식 문장(할당 표현식)과 기호처럼 보입니다.a해결되지 않았습니다. (함수 이외의 식문은 없습니다.)

, 같은 걸 ,static a = 8; 이고, 이 int 로로 .

어쨌든, 그것에 의존하지 마세요 :-) 당신의 타입을 명확하게 적으세요.

에서는 어떤 으로 C 는 int.

은 입니다를 할 수 .registerregister int, 아니면unsignedunsigned int,autoauto int,그리고.staticstatic int 에 대한 을 부여합니다.int, 하지만 당신이 그렇게 하든지 말든지는 당신의 선택입니다.

데이터 유형을 작성하지 않았지만 변수에 데이터 유형(int)이 있습니다.

그 기능을 이용하는 것은 나쁜 관행입니다.

분명히 당신의 컴파일러는 함수 안에서 그런 일이 일어나도록 허용하지 않습니다.함수에서 "a=8;"을 허용하면 특정 유형을 잡기가 매우 어렵기 때문에 이는 타당합니다.

에는 C++11 에는가 auto키워드.는 강력한 의 언어로된 각에 대해 .불행하게도 C와 C++는 강력한 유형의 언어로 선언된 각 변수에 대해 엄격한 유형을 정의해야 합니다.일부 컴파일러들은 int를 기본값으로 가정하지만, 그것은 그들의 좋은 마음이고 그것은 잘못된 프로그래밍 습관으로 인정되기 때문에 사용되어서는 안 됩니다.

함수 파라미터도 암시적 int로 쓸 수 있습니다.예:

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

위의 코드는 잘 작동하지만 일단 매개 변수에 고정된 데이터 유형이 포함되면 다음과 같습니다.

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

char'|'char' 앞에 error: error: expected ')가 표시됩니다.

언급URL : https://stackoverflow.com/questions/11064292/declaring-variables-without-any-data-type-in-c