std :: numeric_limits <unsigned char> 멤버를 호출하기 전에 단항 "+"의 목적은 무엇입니까?


130

cppreference의 설명서 에서이 예제를 보았습니다.std::numeric_limits

#include <limits>
#include <iostream>

int main() 
{
    std::cout << "type\tlowest()\tmin()\t\tmax()\n\n";

    std::cout << "uchar\t"
              << +std::numeric_limits<unsigned char>::lowest() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::min() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::max() << '\n';
    std::cout << "int\t"
              << std::numeric_limits<int>::lowest() << '\t'
              << std::numeric_limits<int>::min() << '\t'
              << std::numeric_limits<int>::max() << '\n';
    std::cout << "float\t"
              << std::numeric_limits<float>::lowest() << '\t'
              << std::numeric_limits<float>::min() << '\t'
              << std::numeric_limits<float>::max() << '\n';
    std::cout << "double\t"
              << std::numeric_limits<double>::lowest() << '\t'
              << std::numeric_limits<double>::min() << '\t'
              << std::numeric_limits<double>::max() << '\n';
}

"+"연산자를 이해할 수 없습니다

<< +std::numeric_limits<unsigned char>::lowest()

나는 그것을 테스트하고 그것을 "-"로 바꾸었고, 그것은 효과가 있었다. 이러한 "+"연산자의 사용법은 무엇입니까?


3
시도 해봐. 당신이 떠나면 무엇을 얻을 수 +있습니까?
피트 베커

4
코드 작성자가 의미가 무엇인지 설명하거나 대신 명시 적 캐스트를 사용 하려는 경우이 질문 에 대해 과언이 될 필요 는 없습니다 .
user202729

-
바꾸면

1
기록상, 이런 종류의 일을 Google에 원한다면 이것을 "단항 더하기"연산자라고합니다. 단 하나의 값 (이 경우 바로 뒤에있는 것)과 "더하기 "는 Google에 친숙한 방법 +입니다. 이 경우 쿼리는 아마도 "c ++ 단항 더하기"일 것입니다. 그것은 ... 직관적이지는 않지만 여전히 찾을 수있는 문서를 읽는 법을 배워야하지만 IMO는 배양하는 데 유용한 기술입니다.
기금 모니카의 소송

답변:


137

(부호 또는 부호없는) <<전달 될 때 출력 연산자 char문자 로 씁니다 .

이 함수는 유형의 값을 반환합니다 unsigned char. 그리고 위에서 언급했듯이 그 값은 정수 값이 아닌 현재 인코딩에서 나타내는 문자를 인쇄합니다.

+운전자 변환은 unsigned char내지 An 이러한 함수에 의해 리턴 int통해 정수 추진 . 이는 정수 값이 대신 인쇄됨을 의미합니다.

같은 표현 +std::numeric_limits<unsigned char>::lowest()은 기본적으로와 같습니다 static_cast<int>(std::numeric_limits<unsigned char>::lowest()).


37

+이 설정하는 것입니다 unsigned charint. +연산자 값 유지이지만 피연산자에 일체 촉진을 유도하는 효과가있다. operator <<문자 유형이 주어지면 인쇄되는 일부 (반) 임의 문자 대신 숫자 값이 표시되도록해야합니다 .


18

이미 주어진 답변에 대한 참조를 추가하십시오. CPP 표준 작업 초안 N4713에서 :

8.5.2.1 단항 연산자
...

  1. 단항 + 연산자의 피연산자는 산술, 범위가없는 열거 또는 포인터 유형을 가져야하며 결과는 인수의 값입니다. 적분 승격은 적분 또는 열거 피연산자에서 수행됩니다. 결과 유형은 승격 된 피연산자의 유형입니다.

그리고 char, short, int, 및 long통합 유형입니다.


12

+결과가 없으면 다를 것입니다. 다음 스 니펫 출력 a 97대신a a

char ch = 'a';
std::cout << ch << ' ' << +ch << '\n';

그 이유는 서로 다른 과부하가 다른 유형의 데이터를 인쇄 하기 때문 입니다. basic_ostream& operator<<( char value );과부하 가 없으며 std::basic_ostream페이지 끝에 설명되어 있습니다.

문자 및 문자열 인수 (예 : char또는 const char*)는 멤버아닌 오버로드 에 의해 처리됩니다 operator<<. 출력 멤버 함수 호출 구문을 이용하여 문자를 시도 (예 std::cout.operator<<('c');) 과부하의 온 (2-4) 및 출력 수치를 호출한다 . 멤버 함수 호출 구문을 사용하여 문자열을 출력하려고하면 오버로드 (7)를 호출하고 대신 포인터 값을 인쇄합니다.

변수 를 전달할 때 호출 되는 비 멤버 오버로드char

template< class CharT, class Traits> basic_ostream<CharT,Traits>& operator<<(
    basic_ostream<CharT,Traits>& os, char ch );

코드 포인트에서 문자를 인쇄합니다 ch

그래서 기본적으로 당신이 전달하는 경우 char, signed char또는 unsigned char직접 스트림에이 문자를 인쇄 할 수 있습니다. +위의 줄을 제거하려고하면 예상치 못한 "이상한"문자 또는 보이지 않는 문자가 인쇄되는 것을 볼 수 있습니다

당신이 그들의 수치를 원하는 경우 대신 당신의 오버로드를 호출해야합니다 short, int, long또는 long long. 이 작업을 수행하는 가장 쉬운 방법은 단항 더하기로 홍보하는 charint입니다 +. 즉, 하나의 희귀 유용한 응용 프로그램단항 플러스 연산자 . 명시 적 캐스트 int도 작동합니다.

SO에 대해 그 문제에 직면 한 많은 사람들이 있습니다.


1
마이너스가 아닌 단항 더하기 를 의미 했습니까 ?
Ruslan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.