2011-09-10 5 views
3

에 INT와 문자를 비교 할당 할 수 있습니다. 위의 프로그램에서 c 유형을 int으로 지정했습니다. 가장 중요한 것은 EOF이 헤더 함수에 정의 된 상수 인 integer입니다.이유는/나는 다음과 같은 코드가 C

이렇게 뭔가에 대한 코드 변경 이제 경우 :

#include <stdio.h> 
    main() 
    { 
    char c; 
    c = getchar(); 
    while (c != EOF) { 
    putchar(c); 
    c = getchar(); 
    } 
    } 

이 코드는 작동한다! C 설명서에 따라 분을 기다리십시오. getchar()int을 반환하지만, 위의 코드에서 볼 수있는 것은 char입니다. 그리고 C 컴파일러는 어떤 에러도 발생시키지 않습니다. 또한 while 루프에서 나는 charcintEOF과 비교했으며 컴파일러는 오류를 발생시키지 않고 프로그램을 실행합니다!

위의 두 경우에 컴파일러에서 오류가 발생하지 않는 이유는 무엇입니까?

미리 감사드립니다.

+1

C는 동적이 아니며 숫자 형식간에 암시 적 캐스트를 허용하기 만합니다. 두 번째 코드는 '\ xFF'문자를 EOF (EOF == -1 인 시스템에서)로 해석하지만 첫 번째 코드는 그렇지 않습니다. 따라서 getchar에서 int를 사용하는 이유입니다. – ughoavgfhw

+1

왜 downvote? –

+1

@ughoavgfhw 필자는'char'가 부호없는 머신에서'\ xFF' 일 필요가 없다. 무한 루프로 컴파일 될 수도있다. –

답변

9

번호는 단순히 int 인 리턴 값은, 는 내재적char 타입으로 변환을 의미한다. 그게 전부입니다.

컴파일러 은 이 sizeof(char)보다 크므로 그러한 변환에 대한 경고 메시지를 생성합니다. 예를 들어, GCC와 -Wconversion 옵션을 사용하여 코드를 컴파일하는 경우, 이러한 경고 메시지를 제공합니다

의미
c.c:5:7: warning: conversion to 'char' from 'int' may alter its value 
c.c:8:8: warning: conversion to 'char' from 'int' may alter its value 

, 당신은 그런 경고 메시지를 피하기 위해 int를 사용해야합니다.

+0

그래서 가장 좋은 방법은 무엇입니까? 'char' 또는'int'? –

+0

또한 코드가 작동하지 않는다는 것을 의미합니다. 일하는 것처럼 보일지 모르지만 올바른 값을 쉽게 입력하여 조기에 끝내거나 아키텍처에 있다면'char'가 부호가없는 곳에서 루프를 빠져 나오지 않습니다. –

+1

@ 개미 : 내 대답을 업데이트했습니다. – Nawaz

3

번호, 또는시 유형을 시스템을 모두 수정하여 프로그램의 확장을 포함 할 수

이 행동, 객체, 정의를 확장하여 새로운 코드를 추가하여 wikipedia의 정의를 볼 수 있습니다 프로그램 실행. 이러한 동작은 충분한 복잡성을 가진 거의 모든 언어로 으로 에뮬레이트 될 수 있지만 동적 언어 은이를 사용하기위한 직접 도구를 제공합니다.

C/C++의 char 및 int는 거의 동일하며 C/C++은 자동으로이 두 가지 사이에 캐스팅됩니다. 아무것도 더. 여기에는 타입 시스템의 수정이 없습니다.

4

"동적 프로그래밍 언어"라는 용어는 너무 모호하게 정의되어있어이 경우에는 그렇게 잘 구분되지 않습니다.

하나의 숫자 유형으로의 암시적인 변환은 동적 언어 기능이 아니라 구문 설탕이라고 주장합니다.

1

int main(int argc, char** argv) 
{ 
    char c; 
    c = EOF; /* supposing getchar() returns eof */ 
    return (c == EOF) ? 0 : 1; 
} 

이 프로그램의 반환 값이 무엇을해야

에 무슨 일이 일어나고 있는지 설명하기 위해 코드를 다시 작성할 수 있습니다? EOF는 char가 아니지만 char로 캐스팅합니다. 비교를 할 때, 그 캐스트는 다시 발생하고, 같은 값으로 채워집니다. 무슨 일이 벌어지고 있는지 명확하게하기 위해 다시 작성하는 또 다른 방법은 다음과 같습니다.

#include <stdio.h> 
main() 
{ 
    int c; 
    c = getchar(); 
    while ((char)c != (char)EOF) { 
     putchar((char)c); 
     c = getchar(); 
    } 
} 

EOF가 부각되고 있습니다. 그것이 어떻게 찌그러지는 지에 상관없이, 그것은 'M'이라는 글자로 스쿼시 될 수 있습니다. 그러나 매번 같은 방식으로 찌그러 뜨 렸으므로, 여전히 EOF로 볼 수 있습니다.

0

C를 사용하면 원하는 것을 할 수 있지만 그 결과를 받아 들여야합니다. char에 int를 대입하고 싶다면 그렇게 할 수 있습니다. 역동적 인 언어로 만들지 않습니다.

(이 질문의 제목은 "왜 C가 int를 char에 할당 할 수있게합니까?"라는 마지막 문단을 포함하고 있습니다.) 그것은 어떤 upvotes를 끌었다 그때 나는 제목을 편집 하겠지만, 이후로 나는 그것을 질문하지 않는 방법의 예로서 남겨 둘 것이다.)

+0

Lol! 미안 그것은 초보자 질문이었고, 확실한 @andy 나는 다음과 같은 제목을 지키지 않을 것이다! –

0

7 비트 ASCII 데이터를 읽지 않는다면 \ xFF가 유효한 데이터 일 수 있습니다. EOF가 \ xFFFFFFFF이고 getchar()의 값을 char로 반환하면 EOF와 \ xFF를 데이터로 구별 할 수 없습니다.

관련 문제