EOF (파일 끝) 문자를 char 유형
On 2월 18, 2021 by admin Dennis Ritchie의 The C 프로그래밍 언어 에서 읽었습니다. int
는 EOF 값 iv id를 보유 할 수 있도록 충분히 크게 만들기 위해 EOF –를 보유하기 위해 변수에 사용되어야한다고 예약하십시오. = “11d6235ce8″>
는 char
가 아닙니다.하지만 다음 코드는 정상적으로 작동합니다.
#include<stdio.h> main() { char c; c=getchar(); while(c!=EOF) { putchar(c); c=getchar(); } }
있는 경우 더 이상 입력이 없으면 getchar
가 EOF를 반환합니다. 위 프로그램에서 문자 유형의 변수 c
는이를 보유 할 수 있습니다.
왜 작동합니까? 위에서 언급 한 책의 설명에 따라 코드가 작동하지 않아야합니다.
댓글
Answer
암시 적 유형 변환이 실수로 올바른 작업을 수행하기 때문에 코드가 작동하는 것 같습니다.
getchar()
unsigned char
범위에 맞거나 EOF
인 값으로 int
를 반환합니다 ( 음수 여야하며 일반적으로 -1)입니다. EOF
자체는 문자가 아니라 사용할 수있는 문자가 더 이상 없다는 신호입니다.
c
에는 두 가지 가능성이 있습니다. char
유형은 값을 나타낼 수 있으며,이 경우 c
의 값입니다. 또는 유형은 char
값을 나타낼 수 없습니다 . 이 경우 어떤 일이 일어날 지 정의되지 않았습니다. 인텔 프로세서는 새로운 유형에 맞지 않는 상위 비트를 잘라내지만 (효과적으로 char
에 대해 모듈로 256 값을 줄임) 이에 의존해서는 안됩니다.
다음 단계는 c
를 EOF
와 비교하는 것입니다. EOF
는 int
, c
도 int
로 변환되어 저장된 값을 유지합니다. c
에서. c
가 EOF
의 값을 저장할 수 있으면 비교가 성공합니다. 하지만 c
가 값을 저장할 수 없으면 를 입력하여 char
를 입력합니다.
컴파일러가 char
유형을 만들기로 선택한 것 같습니다. 부호가 있고 EOF
값이 작음 char
에 들어갈만큼 충분합니다. char
가 서명되지 않은 경우 (또는 unsigned char
를 사용한 경우) unsigned char
는 EOF
의 값을 보유 할 수 없습니다.
또한 코드에 두 번째 문제가 있습니다.
는 캐릭터 자체는 아니지만 char
유형으로 강제 설정하면
가능한 문자의 절반은 올바르게 처리 될 경우 정의되지 않습니다.
댓글
- 강제
char
범위 밖의 값을 입력하려면CHAR_MIN
..CHAR_MAX
가 구현 정의 값, 구현이 트랩 표현으로 정의하는 비트 패턴을 생성하거나 구현 정의 신호를 발생시킵니다. 대부분의 경우 구현은 두 가지 ' s- 보완 감소 이외의 작업을 수행하기 위해 많은 추가 작업을 수행합니다.표준위원회의 사람들이 컴파일러가 다른 이유없이 대부분의 다른 컴파일러와 일관된 동작을 구현하도록 장려해야한다는 생각에 동의했다면 … - … 나는 그렇게 생각합니다. 강압을 신뢰할 수있는 것으로 간주합니다 (코드가 의도를 문서화해서는 안된다는 것은 아니지만 '
(signed char)x
는 더 명확하고((unsigned char)x ^ CHAR_MAX+1))-(CHAR_MAX+1)
만큼 안전합니다.) 현재로서는 ' 컴파일러가 오늘날 준수하는 다른 동작을 구현할 가능성이 전혀 없습니다. '의 표준; 한 가지 위험은 " 최적화 "의 이익을 위해 행동을 중단하도록 표준이 변경 될 수 있다는 것입니다. - @supercat : 표준은 컴파일러가 대상 프로세서에서 자연스럽게 지원하지 않는 동작을 가진 코드를 생성 할 필요가 없도록 작성되었습니다. 대부분의 정의되지 않은 동작은 (표준 작성 당시) 모든 프로세서가 일관되게 동작하지 않았기 때문에 존재합니다. 컴파일러가 성숙 해짐에 따라 컴파일러 작성자는 정의되지 않은 동작을 이용하여보다 적극적인 최적화를 수행하기 시작했습니다.
- 역사적으로 표준의 의도는 대부분 사용자가 설명하는 것과 같았지만 표준은 다음과 같은 일부 동작을 설명합니다. 느슨한 사양에서 요구되는 것보다 더 많은 코드를 생성하기 위해 일부 공통 플랫폼에 대한 컴파일러를 요구하기에 충분합니다.
int i=129; signed char c=i;
의 유형 강제 변환이 그러한 동작 중 하나입니다. 상대적으로 적은 수의 프로세서에c
가i
가 ' 일 때 범위는 -127에서 +127까지이며i
의 다른 값을 2와 다른 -128에서 +127 범위의 값으로 일관되게 매핑합니다. ' s-complement reduction, 또는 … - … 이러한 경우 지속적으로 신호를 발생시킬 것입니다. 표준은 구현이 일관된 매핑을 생성하거나 지속적으로 신호를 발생시킬 것을 요구하기 때문에 표준이 두 가지가 아닌 다른 것을위한 공간을 남겨 두는 유일한 플랫폼은 것입니다 ' s-complement reduction 포화 산술 하드웨어가있는 DSP와 같습니다. Undefined Behavior의 역사적 근거에 관해서는 문제가 하드웨어 플랫폼뿐만 아니라 '라고 말하고 싶습니다. 오버플로가 매우 일관된 방식으로 작동하는 플랫폼에서도 컴파일러가이를 트랩하는 것이 유용 할 수 있습니다 …
0xff
.getchar()
<의 결과 저장int
의 / div>는이 문제를 해결합니다. 귀하의 질문은 기본적으로 훌륭한 리소스 인 comp.lang.c FAQ 의 질문 12.1과 동일합니다. (또한main()
는int main(void)
이어야하며 'return 0;
종결 전}
.)