2010-12-31 3 views
-2
main() 
{ 
    int x=12; 
    unsigned int y=12; 

    if (x>y) 
    { 
     printf("abc"); 
    } 
    else 
    { 
     printf("xyz"); 
    } 
} 

출력은 무엇입니까?int에서 부호없는 int를

+10

코드를 컴파일하고 확인하지 않는 이유는 무엇입니까? – pablochan

+0

xyz를 인쇄 할 것이라고 생각합니다. – shankhan

+0

컴파일하고 실행하여보십시오! 또는 12> 12 또는 동일한 정수 값의 부호가 있거나 부호없는 유형이 차이를 생성한다고 생각합니까 (컴파일러가 경고하는 것 외에는)? – Clifford

답변

3

코드가 컴파일되지 않습니다. 그것은 가치가 무엇인지를 들어, 내 컴파일러는 다음과 같은 출력 제공 : 오류를 수정 한 후

foo.cpp: In function ‘int main()’: 
foo.cpp:1: error: ‘printf’ was not declared in this scope 
foo.cpp:1: error: ‘printf’ was not declared in this scope 
foo.cpp:1: error: expected ‘}’ at end of input 

signed 12 때문에 예상되는 프로그램 출력 xyzunsigned 12보다 더 크다.

+0

고맙습니다 ............ int x = -2에 int x = 12를 쓰면 어떻게 될까요? –

+0

그 이유는 C++ 컴파일러를 사용하고 있기 때문입니다.하지만 질문에 태그가 붙어 있습니다. C이므로 C 컴파일러를 사용해야합니다. – dreamlax

+0

@dreamlax, 실제로, 나는 질문에'output' 태그가 붙어 있다고 대답했습니다. :) –

3

참고 :이 대답은 C99와 관련이 있습니다.

main의 반환 유형이 누락되어 (int 여야 함) 코드가 컴파일되지 않아야합니다. <stdio.h>

J.2 정의되지 않은 동작을

없기 때문에

또한

int main() 
{ 
    int x=12; 
    unsigned int y=12; 

    if (x>y) 
    { 
     printf("abc"); 
    } 
    else 
    { 
     printf("xyz"); 
    } 
} 

는 UB를 호출 - 함수에 대한 호출에 대한 함수 원형없이 범위 여기서 함수 함수 프로토 타입으로 정의됩니다. 프로토 타입이 생략 부호로 끝나거나 prom 뒤에 인수의 유형이 정의됩니다. 옵션은 매개 변수 유형 (6.5.2.2)과 호환되지 않습니다.

+0

정말 UB인가요 아니면 그냥 컴파일 오류입니까? – Falmarri

+0

오, 당신은 printf가 아니라 main을 언급하고있었습니다. – Falmarri

+1

@Falmarri : UB. UB는 일어날 수있는 일을 의미하며 컴파일러 오류도 포함합니다. –

4

컴파일러 에러를 수정 한 후, int 서명 인해 일반적인 산술 변환의 규칙 (C99 §6.3.1.8)에, 부호 변환된다

그렇지 않은 경우 를 갖는 오퍼랜드 부호없는 정수 유형의 순위가 이상이거나 다른 피연산자 유형 의 순위와 같으면 부호가있는 정수 유형을 가진 피연산자는 부호없는 정수 유형이있는 피연산자 유형으로 변환됩니다.

여기서 12는 unsigned int의 범위 내에 있기 때문에 예상대로 작동합니다.

그러나 의견에서 제안한대로 x = -2;을 사용하면 -2 + UINT_MAX (§6.3.1.3 서명 및 부호없는 정수 기준)으로 변환됩니다.

-2 + UINT_MAX > 12이 맞으면 abc이 인쇄됩니다.

1

라이브러리 파일을 포함한다고 가정하면 컴파일러를 엄격한 동작으로 설정하지 않으면 main 유형을 반환 할 필요가 없습니다. 그래서 엄격하게!, 최종 결과가 될 것입니다 당신이 행동하는 컴파일러를 설정하지 않은 또 다른 가정을

XYZ

@Matthew Flaschen는 변환 후, 모두 동일하므로 첫 번째 조건은 늘 만족하고 갈 것이라고 말했다로 다른 부분.

1

은 서명/서명되지 않은 불일치를 경고하는 컴파일러를 가져 오지 만 컴파일러에서 값이 상수라고 판단하면 최적화되지 않을 수 있습니다.

관련 문제