main()
{
int x=12;
unsigned int y=12;
if (x>y)
{
printf("abc");
}
else
{
printf("xyz");
}
}
출력은 무엇입니까?int에서 부호없는 int를
main()
{
int x=12;
unsigned int y=12;
if (x>y)
{
printf("abc");
}
else
{
printf("xyz");
}
}
출력은 무엇입니까?int에서 부호없는 int를
코드가 컴파일되지 않습니다. 그것은 가치가 무엇인지를 들어, 내 컴파일러는 다음과 같은 출력 제공 : 오류를 수정 한 후
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
때문에 예상되는 프로그램 출력 xyz
는 unsigned 12
보다 더 크다.
고맙습니다 ............ int x = -2에 int x = 12를 쓰면 어떻게 될까요? –
그 이유는 C++ 컴파일러를 사용하고 있기 때문입니다.하지만 질문에 태그가 붙어 있습니다. C이므로 C 컴파일러를 사용해야합니다. – dreamlax
@dreamlax, 실제로, 나는 질문에'output' 태그가 붙어 있다고 대답했습니다. :) –
참고 :이 대답은 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)과 호환되지 않습니다.
컴파일러 에러를 수정 한 후, int
서명 인해 일반적인 산술 변환의 규칙 (C99 §6.3.1.8)에, 부호 변환된다
그렇지 않은 경우 를 갖는 오퍼랜드 부호없는 정수 유형의 순위가 이상이거나 다른 피연산자 유형 의 순위와 같으면 부호가있는 정수 유형을 가진 피연산자는 부호없는 정수 유형이있는 피연산자 유형으로 변환됩니다.
여기서 12는 unsigned int
의 범위 내에 있기 때문에 예상대로 작동합니다.
그러나 의견에서 제안한대로 x = -2;
을 사용하면 -2 + UINT_MAX
(§6.3.1.3 서명 및 부호없는 정수 기준)으로 변환됩니다.
-2 + UINT_MAX > 12
이 맞으면 abc
이 인쇄됩니다.
라이브러리 파일을 포함한다고 가정하면 컴파일러를 엄격한 동작으로 설정하지 않으면 main 유형을 반환 할 필요가 없습니다. 그래서 엄격하게!, 최종 결과가 될 것입니다 당신이 행동하는 컴파일러를 설정하지 않은 또 다른 가정을
XYZ
@Matthew Flaschen는 변환 후, 모두 동일하므로 첫 번째 조건은 늘 만족하고 갈 것이라고 말했다로 다른 부분.
은 서명/서명되지 않은 불일치를 경고하는 컴파일러를 가져 오지 만 컴파일러에서 값이 상수라고 판단하면 최적화되지 않을 수 있습니다.
코드를 컴파일하고 확인하지 않는 이유는 무엇입니까? – pablochan
xyz를 인쇄 할 것이라고 생각합니다. – shankhan
컴파일하고 실행하여보십시오! 또는 12> 12 또는 동일한 정수 값의 부호가 있거나 부호없는 유형이 차이를 생성한다고 생각합니까 (컴파일러가 경고하는 것 외에는)? – Clifford