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
'Nice programing' 카테고리의 다른 글
Objective C HTML 이스케이프 / 이스케이프 해제 (0) | 2020.10.20 |
---|---|
식별 및 식별되지 않는 관계에 대해 여전히 혼란 스러움 (0) | 2020.10.20 |
RecyclerView의 CheckBox는 다른 항목을 계속 확인합니다. (0) | 2020.10.20 |
긴 16 진수 문자열에서 파이썬 바이트 객체를 만드는 방법은 무엇입니까? (0) | 2020.10.20 |
Android-HashMap에서 값 가져 오기 (0) | 2020.10.20 |