unary 연산의 정의..

strongspirit의 이미지

오늘 책을 보고 있는데 unary 연산부분이 나왔습니다.

평소에 알게 모르게 많이 쓰다보니, 정의를 생각하려니 쉽게 떠오르지가 않습니다.

unary 연산의 정확한 정의가 뭔가요?

4+-4와 같은건 너무 분명한데..

-2+3, -3, 모두 unary 연산이 들어갔다고 볼 수 있을까요?

위에 것들이 unary라면 3, 3+4와 같은 경우엔 어떨까요?

명시적으로 +3과 같이 쓸 경우에만 unary일까요?

KLDPer분들의 명쾌한 설명 기다립니다 :shock:

cinsk의 이미지

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입니다.

icanfly의 이미지

몇일전 이런 이야기가 나온적이 있어서 글을 적어봅니다.

추가적인 질문이라면 질문이 될수 있겠습니다만...

-3 이란 것의 -와 int a = 3; b = -a; 란 것의 - 같은 경우..

사람들에 따라서 단항연산자로 볼것이냐 말것이냐 견해차이가 있다고 하던데요.

-3 은 단지 -3이라는 음의 상수로 보는 것과, 일관되게 3이란 피연산자에 -단항 연산자가 역할을 한다고 보는것..어느쪽이 맞는 것인가요?

저는 지금껏 그냥 -3이라는 음의 상수로 봐왔었는데......

컴파일러시간에 파서를 이야기할때 이런 이야기가 나오더군요.

:roll:

htna의 이미지

icanfly wrote:
몇일전 이런 이야기가 나온적이 있어서 글을 적어봅니다.

추가적인 질문이라면 질문이 될수 있겠습니다만...

-3 이란 것의 -와 int a = 3; b = -a; 란 것의 - 같은 경우..

사람들에 따라서 단항연산자로 볼것이냐 말것이냐 견해차이가 있다고 하던데요.

-3 은 단지 -3이라는 음의 상수로 보는 것과, 일관되게 3이란 피연산자에 -단항 연산자가 역할을 한다고 보는것..어느쪽이 맞는 것인가요?

저는 지금껏 그냥 -3이라는 음의 상수로 봐왔었는데......

컴파일러시간에 파서를 이야기할때 이런 이야기가 나오더군요.

:roll:

-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은 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;

doldori의 이미지

icanfly wrote:
-3 이란 것의 -와 int a = 3; b = -a; 란 것의 - 같은 경우..

사람들에 따라서 단항연산자로 볼것이냐 말것이냐 견해차이가 있다고 하던데요.

-3 은 단지 -3이라는 음의 상수로 보는 것과, 일관되게 3이란 피연산자에 -단항 연산자가 역할을 한다고 보는것..어느쪽이 맞는 것인가요?


C나 C++이라면 단항 연산자와 양의 상수로 보는 것이 맞습니다. 이들 언어에서
음의 상수는 존재하지 않습니다. 놀라운 사실이죠? ^^; 2의 보수 표현을 쓰고
INT_MAX == 2147483647인 플랫폼에서 다음 코드를 실행해 보세요.
int i = -2147483648;    // (1)
int j = -2147483647 - 1;  // (2)

(1)에서는 경고가 나오고 (2)에서는 나오지 않을 것입니다. (컴파일러에 따라 다를 수
있긴 합니다만.) 그리고 <limits.h>를 보시면
#define  INT_MIN  (-2147483647 - 1)

과 같은 식으로 정의된 것도 알 수 있을 것입니다. 왜 이렇게 번거로운 방식으로
정의했냐 하면 214748368은 int로 표현이 불가능한 값이므로 이를 int에 대입하는
결과는 implementation-defined이기 때문입니다. 반면 2147483647는
int로 표현이 가능하고 이에 '-' 연산을 한 후에 1을 뺀 결과 역시 int로 표현이
가능하므로 표준에 의해 그 결과를 보장받습니다. 더욱 자세한 얘기는
http://www.google.co.kr/groups?selm=953qqf%24m63%241%40nnrp1.deja.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.