2012-04-14 3 views
1

이것은 의 일부 샘플 코드입니다. C 프로그래밍 언어 : Ritchie & Kernighan. 유형 INT의 변수에 referes을 putchar문자를 반환

int c; 
     while((c=getchar())!=EOF) { 
      putchar(c); 
     } 

알 수 있습니다. 왜이 코드로 문자와 정수를 반환하고 표시 할 수 있습니까?

답변

4

int은 일반적으로 4 바이트로 표시되고 char은 실제로는 단지 1 바이트의 데이터입니다. int에 전체 문자와 그 이상의 문자를 쉽게 저장할 수 있습니다. getchar()이 반환됩니다. int가 putchar(int)으로 전달되면 표시하기 전에 여분의 공간을 막습니다. 이 기술은 실제로 char이 아닌 EOF을 전달하는 데 유용하지만 int은 파일의 끝을 알립니다.

+0

int가 char 대신에 사용되는 이유는 시스템이 EOF 신호를 보낼 수 있어야하고 특수 반환 값 -1 (EOF 상수와 동일)을 사용하기 때문입니다. 이 -1은 char에 들어 가지 않기 때문에 getchar()의 결과는 대신 int로 저장됩니다. – mfrankli

+0

어구는 int와 같은 사운드를 만드는 데 보통 4 바이트 (true)이며 char은 보통 1 바이트입니다 (char가 * 항상 * 1 바이트이기 때문에 정확하게는 아닙니다). 그래도 +1은 좋은 답변입니다. –

+0

@mfrankli : 구현의'char' 유형에 서명 된 경우 -1을'char'에 넣을 수 있습니다. 많은 경우는'-1'을'char' 유형으로 변환 할 수 있습니다 서명했다. 'getchar'가'int'를 리턴하는 이유는 * always * signed이고'EOF'는 음수가되도록 정의되어 있기 때문입니다 (반드시 -1이 아니더라도 대개는 그렇습니다). – dreamlax

1

char 형식의 정수는 대부분 8 비트 바이트입니다. int 형은 일반적으로 더 넓기 때문에 char이 유지할 수있는 모든 가능한 값을 유지할 수있는 정수입니다. 확인 작업을 수행하려면 해당 번호가 sizeof(int) > sizeof(char)이어야합니다. 거의 항상 그렇습니다. 그러나 내가 잘 기억한다면 표준이 이것을 요구하지 않는다고 말하고있다. 즉, 이미 읽은 EOF가 파일의 실제 끝인지 여부를 확인하는 유일한 휴대 가능하고 안전한 방법은 feof(FILE *)으로 확인하는 것입니다. 예를 들어, 시스템에서 CHAR_BIT가 16이면 sizeof (char) == 1이지만 sizeof (int)도 1 일 수 있습니다.

+0

표준은 'sizeof (long)> = sizeof (int)> = sizeof (short)> = sizeof (char)'만을 보장하며 TI의 일부 DSP는 알고 있습니다. 'CHAR_BIT == 32','sizeof (long) = 1'을 가지고 있습니다. –

+0

하지만, 저는 여러분이 대부분의 시간 동안 파일 I/O가 시간당 char을 선택하지 않는다고 말합니다. 그래서 우리가 일상적으로 일하는 일반적인 기계에서는 문제가 아닙니다. 물론 언급할만한 가치가 있습니다. – ShinTakezou

1

getchar() 복귀 int 있도록 는 확실EOF 값은 저장할 수 (모든 음수 정수로 정의되고, 대부분의 구현에서 -1이다). char 형식은 구현에 따라 서명 또는 서명되지 않을 수 있습니다. 가 서명되면, 그 EOFsigned char 유형의 범위 내에 있음을 제공 EOF 값을 보유 할 수 있고, 그 다음 부호 경우 EOF가 변환 될 때 실제 문자 값과 구별 될 수있다 unsigned char 유형.

+0

나는'getchar' 함수가 int를 반환한다고 생각합니다. 왜냐하면 K & R이 함수 프로토 타입을 언어에 추가하기 전에 함수가 존재했기 때문입니다. 그때 * 모든 * 함수는 int를 반환했습니다. 그런 다음이 사실을 사용하여 EOF 값을 집어 넣습니다. –

관련 문제