Nice programing

C에서 단항 '+'연산자의 목적은 무엇입니까?

nicepro 2020. 10. 20. 08:07
반응형

C에서 단항 '+'연산자의 목적은 무엇입니까?


C에서는 다음과 같이 쓰는 것이 합법적입니다.

int foo = +4;

그러나, 지금까지 내가 말할 수있는, 단항 +의는 +4노 영업 이익은 없다. 맞나요?


6.3.3.3의 C90 표준에 따라 :

단항 + 연산자의 결과 는 피연산자값입니다 . 피연산자에서 적분 승격이 수행됩니다. 결과에는 승격 된 유형이 있습니다.

단항 + 또는-연산자의 피연산자는 산술 유형을 가져야 합니다 ..


표현식에 산술 유형이 있다는 일종의 주장으로 사용할 수 있습니다.

#define CHECK_ARITHMETIC(x) (+(x))

x포인터로 평가 되면 컴파일 타임 오류가 발생합니다 .

그것이 제가 생각할 수있는 유일한 실용적인 사용 방법입니다.


내가 아는 단항 더하기 연산자는 매크로에서 매우 편리하게 사용할 수 있습니다. 다음과 같이하고 싶다고 가정 해 보겠습니다.

#if FOO > 0

FOO이 정의되지 않은 경우 C 언어는이 경우 0으로 대체해야합니다. 그러나 FOO빈 정의로 정의 된 경우 위 지시문은 오류를 발생시킵니다. 대신 다음을 사용할 수 있습니다.

#if FOO+0 > 0

이제 지시문 FOO은 정의되지 않았거나 공백으로 정의되었거나 정수 값으로 정의 되었는지 여부에 관계없이 구문 상 정확합니다 .

물론 이것이 원하는 의미를 산출할지 여부는 완전히 별개의 질문이지만 일부 유용한 경우에는 그렇게 될 것입니다.

편집 : 다음과 같이 0으로 정의 된 경우 와 공백으로 정의 된 경우 구분 하는 데 사용할 수도 있습니다 FOO.

#if 2*FOO+1 == 1
/* FOO is 0 */
#else
/* FOO is blank */
#endif

꽤 많이. 주로 완성도를 위해 존재하며 다음과 같은 구조를 좀 더 깔끔하게 만들기 위해 존재합니다.

int arr[] = {
    +4,
    -1,
    +1,
    -4,
};

정확하지 않음

단항 +연산자는 한 가지만 수행합니다. 정수 승격을 적용합니다 . 피연산자가 표현식에 사용 되었다면 어쨌든 이런 일이 발생하기 때문에 단항 +이 단순히 단항과의 대칭을 위해 C에 있다고 상상합니다 -.

프로모션이 너무 일반적으로 적용되기 때문에 실제 작동을보기는 어렵습니다.

나는 이것을 생각 해냈다.

printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));

(내 Mac에서) 인쇄

1
4

C에서 단항 '+'연산자의 목적은 무엇입니까?

Unary plus는 Rationale for International Standard—Programming Languages—C 에서 단항 빼기와 대칭을 위해 C에 추가되었습니다 .

Unary plus는 단항 마이너스와의 대칭을 위해 여러 구현에서 C89위원회에 의해 채택되었습니다.

작동하지 않고 피연산자에서 정수 승격을 수행합니다. 내 대답에서 인용하면 Unary + operator는 유형 변환을 수행합니까? :

초안 C99 표준 섹션 6.5.3.3 단항 산술 연산자 는 다음과 같이 말합니다.

단항 + 연산자의 결과는 (승격 된) 피연산자의 값입니다. 정수 승격은 피연산자 에서 수행되며 결과에는 승격 된 유형이 있습니다.

가치는 것을 지적 주석 C ++ 참조 설명서 ( ARM은 ) 단항 플러스에 다음과 같은 논평을 제공합니다 :

단항 플러스는 역사적인 사고이며 일반적으로 쓸모가 없습니다.


단항 +연산자가 하는 두 가지를 발견했습니다.

  • integer promotion
  • turning lvalue into rvalue

정수 프로모션 예 :

#include <stdio.h>

int main(void) {

    char ch;
    short sh;
    int i;
    long l;

    printf("%d %d %d %d\n",sizeof(ch),sizeof(sh),sizeof(i),sizeof(l));
    printf("%d %d %d %d\n",sizeof(+ch),sizeof(+sh),sizeof(+i),sizeof(+l));
    return 0;
}

일반 출력 (64 비트 플랫폼) :

1 2 4 8
4 4 4 8

lvalue를 rvalue 예제로 전환 :

int i=0,j;

j=(+i)++; // error lvalue required

'no-op'은 조립 지침을 의미합니까?
그렇다면 확실히 아닙니다.

+4는 단지 4입니다 . 컴파일러는 더 이상 명령어를 추가하지 않습니다.

참고 URL : https://stackoverflow.com/questions/6637005/what-is-the-purpose-of-the-unary-operator-in-c

반응형