ProgramingTip

단항 더하기 연산자는 무엇을 소유하고 있습니까?

bestdevel 2020. 10. 22. 22:17
반응형

단항 더하기 연산자는 무엇을 소유하고 있습니까?


단항 더하기 연산자는 무엇을 소유하고 있습니까? 내가 몇 가지 가지 정의가 있다고 ( 여기여기 ) 여전히 그것이 무엇을 위해 사용 될지. 아무 일도 안하는 것 같지만 이유가 교수 죠?


필요에 따라 달라집니다. 사전 정의 된 모든 유형의 경우 작동하지 않습니다.

no-op 단항 산술 연산자의 실제 사용은 매우 제한적이며 값을 사용하는 결과와 관련되는 경향이 있습니다. 예를 들어 확장, 더 작은 정수 유형에서 확장을 더 작은 정수 유형에서 int처리의 결과가 rvalue로 처리의 결과가 rvalue로 처리의 결과가 const참조 변수 와 호환되지 않는지 확인하는 사용할 수 있습니다 . 그러나 나는 다만 사용이 가독성보다 골프 코딩에 더 적합합니다. :-)


실제로 단항 더하기 C에서 어떤 일을합니다. 피연산자에 대해 일반적인 산술 변환수행하고 더 큰 너비의 정수가 될 수있는 새 값을 반환합니다. 원래 값 이보다 작은 너비의 부호없는 정수 int이면 signed값으로 변경 됩니다.

으로 이것은 그다지 일반적 중요하지 않지만 효과가 있을 있으므로 정수가 양수임을 나타내는 일종의 "주석"단항 더하기를으로 사용하는 [해석] 좋은 생각이 아닙니다 . 다음 C ++ 프로그램을 고려하십시오.

void foo(unsigned short x)
{
 std::cout << "x is an unsigned short" << std::endl;
}

void foo(int x)
{
 std::cout << "x is an int" << std::endl;
}

int main()
{
 unsigned short x = 5;
 foo(+x);
}

그러면 "x is an int"가 표시됩니다.

따라서이 예에서 단항 더하기는 다른 유형 부호를 가진 새 값을 생성했습니다 .


K & R 두 번째 에디션에서 :

단항 +는 ANSI 표준의 새로운 기능입니다. 단항과의 대칭을 위해 추가되었습니다.


음의 값과 구별되는 양의 값을 강조하기 위해 사용하는 것을 보았습니다.

shift(+1);
shift(-1);

그러나 그것은 매우 약한 사용입니다. 대답은 확실히 보강입니다.


내장 단항 +하는 한 많은 lvalue를 rvalue로 바꾸는 것입니다. 예를 들어 다음과 같이 할 수 있습니다.

int x;
&x;

하지만 당신은 할 수 없습니다

&+x;

:)

추신 : "과부하"는 확실히 정답이 아닙니다. 단항 +은 C에서 상속되지 않는 C에서 사용자 수준 연산자입니다.


단항 +가 수행하는 가장 중요한 것은 int보다 작은 데이터 유형에 대한 int로 유형 승격입니다. 이 숫자 std::cout데이터로 문자 데이터를 인쇄하려는 경우 매우 유용 할 수 있습니다 .

char x = 5;
std::cout << +x << "\n";

와 매우 많이

char x=5;
std::cout << x << "\n";

에도 사용할 수 과부하 있지만 실제로 과부하 거의 NOP 여야 합니다.


디버그 또는 어떤 버전 원시 바이트의 숫자 값 (예 : 문자로 많은 작은 숫자)을 인쇄해야하는 경우 단항 +는 인쇄 코드를 단순화 할 수 있습니다. 중히 여기다

char c = 42;
cout << c << endl;           // prints "*\n", not what you want in this case
cout << (int)c << endl;      // prints "42\n", ok
cout << +c << endl;          // prints "42\n", much easier to type

이 간단한 예입니다. 단항 +가 텍스트 대신 숫자처럼 바이트를 처리하는 데 도움이 될 수있는 다른 경우가 확신합니다.


역사적인 정보. C99 표준화위원회는 또한 언어의 또 다른 기능인 부동 소수점 상수 표현의 또 다른 기능을 달성했음을 고려하고있는 또 다른 기능을 달성했음을 고려하고 있다고 생각했습니다. C 근거, 섹션 F.7.4에서 다음 인용문을 참조하십시오.

이 사양의 초기 버전에서는 변환 시간이 상수 산술이 허용되는 피연산자에 때 단항 평가를 + 연산자가 상수 할 수있는 변환 시간 평가를 변환합니다.

결국 대부분의 시나리오 (최소한 "as if"규칙)에서 실행 시간 평가를 시행하고 반전 초기화 프로그램을 사용하여 번역 시간 평가를 시행하는 기능을 사용하여 의미 체계가 작동합니다. 주요 차이점은 부동 소수점 예외 발생 및 기타 부동 소수점 반올림 또는 설정 (있는 경우)에 있습니다.


별로. 의 오버로드를 허용하는 일반적인 주장은 오버로딩에 operator+()대한 실제 사용이 operator-()일반적인 것입니다. 그리고 오버로딩을 허용 하지만 허용 하지 않는 경우 매우 이상하거나 비대칭 적일을 구석으로 입니다.operator-()operator+()

나는 처음에 Stroustrop 에서이 주장을 읽었다 믿지만 그것을 확인할 권리가 없습니다. 제가 틀렸을 수 있습니다.


단항 더하기는 C에 있었는데, 아무것도하지 않을 것입니다 ( auto키워드 처럼 ). Stroustrup은 C와의 무상을 도입해야 할 것입니다.

일단 C ++에 있으면, 단항 마이너스처럼 오버로드 함수를 허용하는 것이 자연 스러웠고, Stroustrup이 이미 존재하지 않았다면 그 도입했을 수도 있습니다.

그래서 아무 의미가 없습니다. 예를 들어 +1.5를 -1.5와 사용하여 사물을 더 대칭 적으로 보이게 사용하는 장식으로 사용할 수 있습니다. C ++에서는 오버로드 될 수있는 operator+()작업 을 수행 할 있습니다. 표준 규칙을 기억하십시오. 산술 연산자를 오버로드 할 때 int와 같은 작업을 수행하십시오.

뭔가 존재하는 이유를 찾고 있습니다. C가 실제로 발생하지 않습니다. 쓸모없는 auto키워드 (아마도 static, 현재 C ++ 0x에서 재활용 )와 entry아무것도하지 않은 키워드 (나중에 C90에서 생략 됨)을 고려. Ritchie 또는 Kernighan이 운영자의 우선 순위에 문제가 있음을 깨달았을 때 이미 중단하고 싶지 않고 많은 줄의 코드가있는 세 개의 설치가 있고 말하는 유명한 이메일이 있습니다.


이에 대한 출처를 인용 할 수는 없지만 무손실 유형 변환을 의미하는 명시 적 유형 승격을위한 것임을 이해하게됩니다. 다음 전환 계층 구조의 최상위에 배치됩니다.

  • 프로모션 : new_type operator+(old_type)
  • 변환 : new_type(old_type)
  • 캐스트 : operator(new_type)(old_type)
  • 강제 : new_type operator=(old_type)

물론, 그것은 제가 약 15 년 전에 읽은 마이크로 소프트 (정말 오래된) c / c ++ 매뉴얼 중 하나에있는 메모에 대한 저의 해석에서 나온 것입니다.


#include <stdio.h>
int main()
{
    unsigned short x = 5;
    printf ("%d\n",sizeof(+x)); 
    printf ("%d\n",sizeof(x)); 
    return 0;
}

위의 예에서 볼 수 있듯이 단항 +는 실제로 유형, 크기 4 및 2를 각각 변경합니다. + x라는 표현이 실제로 sizeof로 계산된다는 게 이상하네요. 아마도 sizeof가 단항 +와 동일한 우선 순위를 가지고 있기 때문일 것입니다.


나는 그것을 항상 양수로 만드는 데 사용할 수 있다고 생각합니다. 단항 + 연산자를 abs로 오버로드하십시오. 코드를 난독 화하고 싶지 않다면 동료 개발자를 혼동 할 가치가 없습니다. 그러면 잘 작동합니다.


내가 원래 대답에서 waaaayyy 떨어져 있었기 때문에 완전히 수정하십시오 .

이를 통해 유형의 명시 적 선언을 양수 값으로 처리 할 수 ​​있습니다 (대부분 수학적 작업이 아닌 것으로 생각합니다). 부정이 더 유용 할 것 같지만 여기에 차이를 만들 수있는 예가 있다고 생각합니다.

public struct Acceleration
{
    private readonly decimal rate;
    private readonly Vector vector;

    public Acceleration(decimal rate, Vector vector)
    {
        this.vector = vector;
        this.rate = rate;
    }

    public static Acceleration operator +(Acceleration other)
    {
        if (other.Vector.Z >= 0)
        {
            return other;
        }
        return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
    }

    public static Acceleration operator -(Acceleration other)
    {
        if (other.Vector.Z <= 0)
        {
            return other;
        }
        return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
    }

    public decimal Rate
    {
        get { return rate; }
    }

    public Vector Vector
    {
        get { return vector; }
    }
}

참고 URL : https://stackoverflow.com/questions/727516/what-does-the-unary-plus-operator-do

반응형