ProgramingTip

컴파일러가 "char"를 "int"와 일치하지만 "short"가 아닌 이유는 무엇입니까?

bestdevel 2020. 11. 5. 08:25
반응형

컴파일러가 "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(),권리 를 요구하는 표현이 없습니까?

이것이 도움이되는 해결 규칙과 관련이있는 것이 왜 charf에 전달 하면 컴파일러 intshort?

내가 삭제 한 경우 f(int), 다음 f(c)호출합니다 f(short)!

요약하면, 제 질문은 "정수 승격"또는 "과부하 해결 규칙"과 관련이? 그리고 왜?


(Integral) 프로모션은 오버로드 해결 을 통해 다른 (Integral) 변환보다 선호됩니다.

암시 적 변환 시퀀스 순위

1) 정확히 일치 : 변환 필요 없음, lvalue에서 rvalue로 변환, 자격 변환, 함수 포인터 변환, (C ++ 17 이후) 유형을 동일한 클래스로 사용자 정의 변환

2) 프로모션 : 통합 프로모션, 부동 소수점 프로모션

3) 변환 : 정수 변환, 부동 소수점 변환, 부동 정수 변환, 포인터 변환, 포인터-멤버 변환, 부울 변환, 파생을 기반으로 사용자 변환

에서 승진 그래서 char하려면 int에서 CHAPTER 2을 통해 선호 charshort.


프로모션이란 무엇입니까? 물어볼 수 있습니다. 표준에서 설명하는 특별한 종류의 변환입니다.

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로 변환 될 수 있습니다.


표준 참조 (현재 표준 초안) :

[over.ics.scs] § 3

[conv.prom] § 1


에서 암시 적 변환 (cppreference) :

다음 암시 적 변환은 필수 프로모션으로 분류됩니다.

  • [...]
  • char기본 유형 : 또는 (위 참조) int또는 unsigned int이에 따라 변환 될 수 있습니다 .signed charunsigned char
  • [...]

이 함수 한다면 , f(int)그리고 f(short)컴파일러가 수행 할 정수 승진 이 가능하지 않은 경우, 첫째로 폴백됩니다 정수 변환 .

charto 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

반응형