unary 연산의 정의..
글쓴이: strongspirit / 작성시간: 목, 2005/04/07 - 8:58오후
오늘 책을 보고 있는데 unary 연산부분이 나왔습니다.
평소에 알게 모르게 많이 쓰다보니, 정의를 생각하려니 쉽게 떠오르지가 않습니다.
unary 연산의 정확한 정의가 뭔가요?
4+-4와 같은건 너무 분명한데..
-2+3, -3, 모두 unary 연산이 들어갔다고 볼 수 있을까요?
위에 것들이 unary라면 3, 3+4와 같은 경우엔 어떨까요?
명시적으로 +3과 같이 쓸 경우에만 unary일까요?
KLDPer분들의 명쾌한 설명 기다립니다 :shock:
Forums:
unary operator란 operand를 하나만 갖는 연산자를 말합니
unary operator란 operand를 하나만 갖는 연산자를 말합니다.
+3 에서 +와 -3에서 -는 모두 unary operator입니다.
binary operator란 operand를 두개만 갖는 연산자를 말합니다.
3 + 4에서 '+', 5 << 2에서 '<<'는 모두 binary operator입니다.
tarnery operator란 operand를 세개를 갖는 연산자를 말합니다.
true ? 3 : 0 에서 '?:'는 tarnery operator입니다.
-2 + 3의 예라면, '-'는 unary operator이며, '+'는 binary operator입니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
몇일전 이런 이야기가 나온적이 있어서 글을 적어봅니다. 추가적인
몇일전 이런 이야기가 나온적이 있어서 글을 적어봅니다.
추가적인 질문이라면 질문이 될수 있겠습니다만...
-3 이란 것의 -와 int a = 3; b = -a; 란 것의 - 같은 경우..
사람들에 따라서 단항연산자로 볼것이냐 말것이냐 견해차이가 있다고 하던데요.
-3 은 단지 -3이라는 음의 상수로 보는 것과, 일관되게 3이란 피연산자에 -단항 연산자가 역할을 한다고 보는것..어느쪽이 맞는 것인가요?
저는 지금껏 그냥 -3이라는 음의 상수로 봐왔었는데......
컴파일러시간에 파서를 이야기할때 이런 이야기가 나오더군요.
:roll:
[quote="icanfly"]몇일전 이런 이야기가 나온적이 있어서 글을
-3 에서 -3을 하나로 볼지 - 와 3으로 볼 지에 대해서 고민이 되신다면..
토큰단위로 쪼개보시면 도움이 될 듯 하네요..
"-3"을 토큰단위로 쪼개본다면 "-" 와 "3"이 나오죠..
그러므로 unary operation이라고 보시면 됩니다.
혹시 "-3"을 tokenizing 해서 "-3"으로 처리하겠다면...
머 할 수 없죠... ^^;
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
C99의 lexical grammar대로 분류하자면, -3은 punctu
C99의 lexical grammar대로 분류하자면, -3은 punctuator '-'와 decimal constant 3의 결합입니다.
integer constant의 재미있는 특징은, decimal constant는 suffix로 u가 붙지 않는 한 unsigned 형으로 표현되지 않는다는 점입니다. 반면에 octal or Hexadecimal constant는 u가 붙지 않아도 unsigned형으로 표현될 수 있습니다. 이것은 아마도 decimal constant의 경우에는 앞에 -이 붙어서 음수로 되는 경우가 빈번하다는 점을 고려한 것이겠지요. unsigned->signed 보다는 signed->signed가 편할 테니까요.
실제로 확인할 수 있는 예를 들자면...
(LLONG_MAX 가 9223372036854775807인 경우에)
unsigned long long int = 9223372036854775808;
우리가 쓸 수 있는 가장 큰 범위의 정수형이 long long int형이라고 할 때, 위의 큰 수는 unsigned long long int형으로는 표현할 수 있지만 long long int형으로는 표현할 수 없습니다. 그런데 십진 상수는 unsigned형으로 표현되지는 않으므로 위의 코드는 unspecified 혹은 undefined behavior가 되어버립니다.
이에 대해서 gcc 같은 경우에는 아래와 같은 경고 메시지를 출력합니다.
warning: decimal constant is so large that it is unsigned
물론 그렇다고 해도 우리의 영리한 gcc는 문제를 일으키지는 않습니다. 사실 이 상황 자체가 자주 만날 수 있는 상황이 아니죠^^;
이를 방지하기 위해서는 다음과 같이 suffix로 u를 붙여주면 됩니다.
unsigned long long int = 9223372036854775808u;
[quote="icanfly"]-3 이란 것의 -와 int a = 3;
C나 C++이라면 단항 연산자와 양의 상수로 보는 것이 맞습니다. 이들 언어에서
음의 상수는 존재하지 않습니다. 놀라운 사실이죠? ^^; 2의 보수 표현을 쓰고
INT_MAX == 2147483647인 플랫폼에서 다음 코드를 실행해 보세요.
(1)에서는 경고가 나오고 (2)에서는 나오지 않을 것입니다. (컴파일러에 따라 다를 수
있긴 합니다만.) 그리고 <limits.h>를 보시면
과 같은 식으로 정의된 것도 알 수 있을 것입니다. 왜 이렇게 번거로운 방식으로
정의했냐 하면 214748368은 int로 표현이 불가능한 값이므로 이를 int에 대입하는
결과는 implementation-defined이기 때문입니다. 반면 2147483647는
int로 표현이 가능하고 이에 '-' 연산을 한 후에 1을 뺀 결과 역시 int로 표현이
가능하므로 표준에 의해 그 결과를 보장받습니다. 더욱 자세한 얘기는
http://www.google.co.kr/groups?selm=953qqf%24m63%241%40nnrp1.deja.com
댓글 달기