컴파일러가 "char"를 "int"와 일치하지만 "short"가 아닌 이유는 무엇입니까?
작은 프로그램이 있습니다.
#include<iostream>
using namespace std;
void f(int) { cout << "int\n"; }
void f(short) { cout << "short\n"; }
int main(void){
char c = 0;
f(c);
return 0;
}
그것은 인쇄합니다 int
. 나는 이것이 "정수 승진"때문이라면 왜 short
선호 하지 않는다는 것 입니까?
또한 정수 승격이있는 것이 있습니다. (예 : A = B). 그러나 나는 f(),
권리 를 요구하는 표현이 없습니까?
이것이 도움이되는 해결 규칙과 관련이있는 것이 왜 char
f에 전달 하면 컴파일러 int
가 short
?
내가 삭제 한 경우 f(int)
, 다음 f(c)
호출합니다 f(short)
!
요약하면, 제 질문은 "정수 승격"또는 "과부하 해결 규칙"과 관련이? 그리고 왜?
(Integral) 프로모션은 오버로드 해결 을 통해 다른 (Integral) 변환보다 선호됩니다.
암시 적 변환 시퀀스 순위
1) 정확히 일치 : 변환 필요 없음, lvalue에서 rvalue로 변환, 자격 변환, 함수 포인터 변환, (C ++ 17 이후) 유형을 동일한 클래스로 사용자 정의 변환
2) 프로모션 : 통합 프로모션, 부동 소수점 프로모션
3) 변환 : 정수 변환, 부동 소수점 변환, 부동 정수 변환, 포인터 변환, 포인터-멤버 변환, 부울 변환, 파생을 기반으로 사용자 변환
에서 승진 그래서 char
하려면 int
에서 CHAPTER 2을 통해 선호 char
에 short
.
프로모션이란 무엇입니까? 물어볼 수 있습니다. 표준에서 설명하는 특별한 종류의 변환입니다.
왜 char
하는 short
승진하지? , 계속할 수 있습니다. 통합 프로모션 은 항상 int
또는 더 큰 유형입니다. 에 대한 프로모션이 없습니다 short
.
다음 암시 적 변환은 필수 프로모션으로 분류됩니다.
signed char 또는 signed short는 int로 변환 할 수 있습니다.
unsigned char 또는 unsigned short는 전체 값 범위를 보유 할 수있는 경우 int로 변환되고 unsigned int로 변환 될 수 있습니다.
char는 기본 유형에 따라 int 또는 unsigned int로 변환 될 수 있습니다 . 부호있는 문자 또는 부호없는 문자 (위 참조);
wchar_t, char16_t 및 char32_t는 전체 값 범위를 보유 할 수있는 다음 목록에서 첫 번째 유형으로 변환 할 수 있습니다. int, unsigned int, long, unsigned long, long long, unsigned long long; 기본 유형이 고정되지 않은 범위가 지정되지 않은 열거 유형은 전체 값 범위를 보유 할 수있는 다음 목록에서 첫 번째 유형으로 변환 될 수 있습니다. int, unsigned int, long, unsigned long, long long 또는 unsigned long long. 값 범위가 더 크면 통합 프로모션이 적용되지 않습니다.
기본 유형이 고정 된 범위가 지정되지 않은 열거 유형은 승격 된 기본 유형으로 변환 될 수 있습니다.
(C ++ 11부터)
비트 필드 유형은 비트 필드의 전체 값 범위를 수있는 경우 int로 변환 될 수 있고, 일치하는 경우 비트 필드의 전체 값 범위 변환을 수있는 경우 unsigned int로 변환 될 수 있습니다. 확장 된 정수 프로모션이 적용되지 않습니다. bool 유형은 false 값이 0이되고 true가 1이되는 int로 변환 될 수 있습니다.
표준 참조 (현재 표준 초안) :
에서 암시 적 변환 (cppreference) :
다음 암시 적 변환은 필수 프로모션으로 분류됩니다.
- [...]
char
기본 유형 : 또는 (위 참조) 로int
또는unsigned int
이에 따라 변환 될 수 있습니다 .signed char
unsigned char
- [...]
이 함수 한다면 , f(int)
그리고 f(short)
컴파일러가 수행 할 정수 승진 이 가능하지 않은 경우, 첫째로 폴백됩니다 정수 변환 .
char
to int
는 정수 승격 (위 참조) 컴파일러가이를 선택합니다.
없는 경우 f(int)
컴파일러는 정수 승격을 수행 할 수있는 함수를 찾지 만 정수 변환으로 대체합니다. 을 발견 그것은 f(short)
하고는 char
로 CHAPTER 2 할 수 있습니다 short
, 그래서 그것을 선택합니다.
참고 URL : https://stackoverflow.com/questions/37166131/why-does-the-compiler-match-char-to-int-but-not-short
'ProgramingTip' 카테고리의 다른 글
중단 / 종료 펼쳐 (0) | 2020.11.05 |
---|---|
NodeJS-setTimeout (fn, 0) 대 setImmediate (fn) (0) | 2020.11.05 |
Kotlin 지원 필드는 무엇입니까? (0) | 2020.11.05 |
POJO (Plain Old Java Object)라는 용어는 정확히 무엇을 의미합니까? (0) | 2020.11.05 |
메시지와 포스트 메시지의 차이점은 무엇이며 C #, WPF 및 Pure Windows 프로그래밍과 어떤 관련이입니까? (0) | 2020.11.05 |