C와 C++의 연산자
본항은 C++와 C언어에 있어서의 연산자의 일람이다.C++에 존재하는 모든 연산자를 게시해, 한층 더 C에도 존재할지를 나타내고 있다.덧붙여 C로는 연산자의 다중 정의는 불가능하다.
&&, ||, ?:및, (차례차례 연산자)는 부작용 완료점을 형성한다.다만, 다중 정의 되어 있지 않은 경우에 한정한다.
이러한 쳐, C에도 존재하는 것은, 차례차례 연산자와 화살표 연산자를 제외하고, Java, Perl, C#, PHP에도 같은 우선 순위・결합성을 가져 존재한다.다만, PHP의 조건 연산자는 예외적으로 왼쪽에서 오른쪽에의 결합이다.
목차
연산자의 겉(표)
이 표에 대해 a
, b
, c
는 유효한 값(리터럴・값・변수・반환값)・오브젝트명・좌변치를 적당 의미한다.덧붙여 「다중 정의 가능한가」는 C++로의 이야기이다.
산술 연산자 | |||
명칭 | 구문 | 다중 정의 가능한가 | C언어에 존재할까 |
---|---|---|---|
단항 플러스 | +a | Yes | Yes |
가산 | a + b | Yes | Yes |
전치인크리먼트 | ++a | Yes | Yes |
후치인크리먼트 | a++ | Yes | Yes |
가산 대입 | a += b | Yes | Yes |
단항 마이너스(부부호) | -a | Yes | Yes |
감산 | a - b | Yes | Yes |
전치감소 | --a | Yes | Yes |
후치감소 | a-- | Yes | Yes |
감산 대입 | a -= b | Yes | Yes |
곱셈 | a * b | Yes | Yes |
곱셈 대입 | a *= b | Yes | Yes |
제산 | a / b | Yes | Yes |
제산 대입 | a /= b | Yes | Yes |
잉여 | a % b | Yes | Yes |
잉여 대입 | a %= b | Yes | Yes |
비교 연산자 | |||
명칭 | 구문 | 다중 정의 가능한가 | C언어에 존재할까 |
소든지 | a < b | Yes | Yes |
소든지 이콜 | a <= b | Yes | Yes |
대든지 | a > b | Yes | Yes |
대든지 이콜 | a >= b | Yes | Yes |
비등가 | a != b | Yes | Yes |
등가 | a == b | Yes | Yes |
논리 연산자 | |||
명칭 | 구문 | 다중 정의 가능한가 | C언어에 존재할까 |
논리 부정 | !a | Yes | Yes |
논리적 | a && b | Yes | Yes |
논리합 | a || b | Yes | Yes |
비트 연산자 | |||
명칭 | 구문 | 다중 정의 가능한가 | C언어에 존재할까 |
왼쪽 시프트 | a << b | Yes | Yes |
왼쪽 시프트 대입 | a <<= b | Yes | Yes |
오른쪽 시프트 | a >> b | Yes | Yes |
오른쪽 시프트 대입 | a >>= b | Yes | Yes |
비트 부정 | ~a | Yes | Yes |
비트적 | a & b | Yes | Yes |
비트적대입 | a &= b | Yes | Yes |
비트화 | a | b | Yes | Yes |
비트화대입 | a |= b | Yes | Yes |
비트 배타적 논리합 | a ^ b | Yes | Yes |
비트 배타적 논리합 대입 | a ^= b | Yes | Yes |
형태 변환 연산자 | |||
명칭 | 구문 | 다중 정의 가능한가 | C언어에 존재할까 |
동적 캐스트 | dynamic_cast<type>(a) | No | No |
정적 캐스트 | static_cast<type>(a) | No | No |
정치성 캐스트 | const_cast<type>(a) | No | No |
강제 캐스트 | reinterpret_cast<type>(a) | No | No |
형태 변환(캐스트) | (type)a | Yes | Yes |
형태 변환(함수 기법) | type(a) | Yes | No |
그 외의 연산자 | |||
명칭 | 구문 | 다중 정의 가능한가 | C언어에 존재할까 |
단순 대입 | a = b | Yes | Yes |
함수 호출 | a() | Yes | Yes |
배열 첨자 | a[b] | Yes | Yes |
간접 연산자(디리퍼렌스) | *a | Yes | Yes |
주소 | &a | Yes | Yes |
간접 멤버 | a->b | Yes | Yes |
직접 멤버 | a.b | No | Yes |
간접 멤버 포인터 | a->*b | Yes | No |
직접 멤버 포인터 | a.*b | No | No |
차례차례 연산자 | a , b | Yes | Yes |
조건 연산자 | a ? b : c | No | Yes |
스코프 해결 | a::b | No | No |
멤버에의 포인터 | a::*b | No | No |
얼라이먼트 (C11/C++11) | alignof(type) | No | Yes |
sizeof | sizeof a sizeof(type) | No | Yes |
형태 정보 | typeid(a) typeid(type) | No | No |
파티션 | new type | Yes | No |
파티션(배열) | new type[n] | Yes | No |
영역 해방 | delete a | Yes | No |
영역 해방(배열) | delete[] a | Yes | No |
연산자의 우선 순위
이하의 겉(표)는, C++와 C에 있어서의 우선 순위와 결합성을 나타낸 것이다(덧붙여 Java, Perl, PHP 등 최근의 언어의 상당수는 같은 우선 순위를 가진다).연산자는 우선 순위의 낮은 것(정도)만큼 아래 쪽에 게재되고 있다.같은 셀에 게재되고 있는 연산자끼리는 같은 우선도를 가진다.덧붙여 비록 다중 정의 해도, 연산자의 우선 순위는 변화하지 않는다.
C나 C++에 두고, 연산자의 구문은 문맥 자유 문법에서 정의되고 있다.이 표는, 그 구문보다 도출되는 것이다.
이 표로는, 정확하게 표현 되어 있지 않은 부분이 일부에 존재한다.예를 들어, 조건 연산자는, 대입이나 차례차례 연산자보다 높은 우선도를 가지지만, 중앙의 오퍼랜드로는 그것들을 포함한 모든 연산자의 사용이 가능하다.즉, a ? b , c : d
는 a ? (b, c) : d
라고 해석된다.또, (a ? b), (c : d)는
의미를 이루지 않고, compile error가 된다.덧붙여 괄호로 둘러싸지지 않은 형태 변환식의 결과는 sizeof의 대상이 될 수 없다.즉, sizeof (int) * x
는(sizeof(int)) * x
의 의미가 되어 sizeof ((int) *x)는
되지 않는다.
연산자 | 명칭 | 결합성 |
---|---|---|
:: | 스코프 해결(C++마셔) | 왼쪽에서 오른쪽 |
++ -- | 후치인크리먼트・감소 | |
() | 함수 소환 | |
[] | 배열 첨자 | |
. | 직접 멤버 액세스 | |
-> | 간접 멤버 액세스 | |
typeid() | 실행시 형 정보(C++마셔) | |
const_cast | 형태 변환(C++마셔) | |
dynamic_cast | 형태 변환(C++마셔) | |
reinterpret_cast | 형태 변환(C++마셔) | |
static_cast | 형태 변환(C++마셔) | |
++ -- | 전치인크리먼트・감소 | 오른쪽에서 왼쪽 |
+ - | 단항 플러스와 마이너스 | |
! ~ | 논리 부정과 비트 부정 | |
(type) | 형태 변환 | |
* | 간접 연산자(디리퍼렌스) | |
& | 주소 | |
sizeof | 기억량 | |
new new [] | 동적 기억역확보(C++마셔) | |
delete delete [] | 동적 기억역해방(C++마셔) | |
. * ->* | 멤버에의 포인터(C++마셔) | 왼쪽에서 오른쪽 |
*
| 곱셈・제산・잉여산 | |
+ - | 가산・감산 | |
<< >> | 왼쪽 시프트・ 오른쪽 시프트 | |
| (관계 연산자) 소든지・소든지 이콜 | |
> >= | 대든지・대든지 이콜 | |
= | 등가・비등가 | |
& | 비트적 | |
^ | 비트 배타적 논리합 | |
| | 비트화 | |
&& | 논리적 | |
|| | 논리합 | |
c ? t : f | 조건 연산자 | 오른쪽에서 왼쪽 ( throw 는 결합하지 않는다) |
= | 단순 대입 | |
+= -= | 가산 대입・감산 대입 | |
*=
| 곱셈 대입・제산 대입・잉여 대입 | |
<<= >>= | 왼쪽 시프트 대입・ 오른쪽 시프트 대입 | |
&= ^= |= | 비트적대입・비트 배타적 논리합 대입・비트화대입 | |
throw | 송출 대입(예외 송출: C++마셔) | |
, | 차례차례 연산자 | 왼쪽에서 오른쪽 |
보충
우선 순위의 겉(표)는, 괄호로 괄라레라고 없는 식에 대해서 결합되는 순서를 결정한다.
- ++x * 3은 우선 순위의 규칙이 없으면 애매하다.그러나, 실제로는, 우선 순위에 의해서 x는*보다++에 결합되므로, (++x) * 3으로 해석된다.
- 같이 3 * x++로는 x만이 인크리먼트의 대상이 된다.
- 우선 순위와 결합성의 문제는 상기의 다이어그램과 같이 일반화할 수 있다.컴파일러의 목표는 이러한 다이어그램을 식으로서 해결하는 것이다.이 그림은 각 단항의 연산자(여기에서는 각각 3 + ( . ), 2 * ( . ), ( . )++, ( . )[i]라고 표기한다)가 y에 결합하려고 하고 있는 것을 나타낸다.우선 순위의 겉(표)로부터, 각 부분식은 최종적으로, ( . )[i]는 y에, ( . )++(은)는 y[i]에, 2 * ( . )(은)는(y[i])++에, 3 + ( . )(은)는 2 * ((y[i])++)라고 하는 결합 밖에 완성될 수 없는 것이 결정된다.
- 주의: 우선 순위에서는 부분식이 「무엇」에 대해서 작용할까를 결정하지만, 「언제」작용할까 관여하지 않는다.위의 2 * ((y[i])++)라고 하는 예로는, 후치++연산자가 y[i]보다 후에 작용할 수 밖에 정해져 있지 않다.
C나 C++에 두고, 연산자의 결합은, 우선 순위는 아니고(각각의 표준 규격으로의) 문법에 따라 정해져 있다.이 때문에, 얼마 안되는 차이가 생기는 경우가 있다.예를 들어, C의 조건 연산자는 이하와 같이 정의되고 있다.
logical-OR-expression ? expression : conditional-expression
한편, C++로는 다음 같게 정의되고 있다.
logical-or-expression ? expression : assignment-expression
그 때문에,
e = a ? b : c = d
그렇다고 하는 식은, C라면
e = ((a ? b : c) = d)
(이)라고 해석되어 조건 연산자의 결과가 좌변치가 아닌 것에 밤에러가 되지만, C++라면
e = (a ? b : (c = d))
(이)라고 해석되어 올바른 식이 된다.
논리 연산자의 우선 순위는 문제가 있다고 지적되고 있는[1].개념적으로는&과 | (은)는 산술 연산자의 것+과-와 같은 존재이다.그러나, a + b == 7은(a + b) == 7으로 해석되지만, a & b == 7이라고 하는 식은 a & (b == 7)와 해석되어 버린다.그 밖에도 기대 대로로 해석시키기 위한 괄호를 필요로 하는 경우가 있다.
C++의 연산자의 대체 표현
C++로는, 일부의 연산자에 대해서, 완전히 같게 기능하는 대체 표현을 예약하고 있는[1].대체 표현은 키워드와 같게 예약되고 있는 자구로서 다루어진다.
대체 표현 | 대응하는 연산자 |
---|---|
and | && |
bitand | & |
and_eq | &= |
or | || |
bitor | | |
or_eq | |= |
xor | ^ |
xor_eq | ^= |
not | ! |
not_eq | != |
compl | ~ |
이러한 대체 표현은, 기호적으로 등가로서 다루어져 어디에서라도 기호를 대체 표현에 옮겨놓아도 문제 없다.옮겨놓는 앞은, 연산자로서가 아니게 기호로서 다루어진다.즉 bitand는 비트적연산자 뿐만이 아니라 주소 취득 연산자 대신에 이용해도 기능하는 것이다.
ANSI C로는, 이것들을<iso646.h>로 C프리프로세서의 매크로를 이용해 정의하고 있다.이것과의 호환성을 위해서, C++로는 헤더<iso646.h>와<ciso646>를 준비하고 있지만, 내용은 하늘이다.
C++로는, 모든 비교 연산자는 진위치를 돌려준다.
bool a; int b = 1; int c = 2; a = b == c;
=
=(은)는 bool형의 값을 돌려주기 위해,==연산자는 if문등의 안으로 한정되지 않고, 어디에서라도 사용 가능하다.덧붙여
a = b == c;
(은)는 다음 같게 쓰는 것과 같은 효과를 가져온다.
bool a; int b =임의의(int로 변환할 수 있다) 값; int c =또 하나의 임의치; if(b == c) a = true; else a = false;
각주
- ^ SC22 Committee, The C++ Standards Working group (1998) (PDF). ISO/IEC 14882:1998(E), Programming Languages - C++. International standardization subcommittee for programming languages. pp. 40-41 .
관련 항목
This article is taken from the Japanese Wikipedia C와 C++의 연산자
This article is distributed by cc-by-sa or GFDL license in accordance with the provisions of Wikipedia.
In addition, Tranpedia is simply not responsible for any show is only by translating the writings of foreign licenses that are compatible with CC-BY-SA license information.
0 개의 댓글:
댓글 쓰기