C synatx에 대한 질문

eminency의 이미지

int a[3]={0,1,2};
printf("%d\n",1[a]);

위와 같이 실행했을 경우 1이 출력되는데.. gcc에서만 그런건가요? -_-;;
귀찮아서 C의 BNF 문법 같은 건 살펴보지 않았습니다만... C에서는 배열의 이름과 index를 따로 구분하지 않고 그냥 주소값으로 계산하기 때문인가요? 즉 위같은 경우는 1+a로 해석하기 때문에...?

1[a] 대신 (1+1)[a]라든가 등등으로 해 보았는데 문법상으로도 그렇고 실행도 잘 되네요..ㅡ.ㅡ;;

거 참...-_-; 물론 파이썬이나 루비 등등 최근 나온 스크립트 언어들에서는 에러가 납니다. 다른 데서는 안해봤는데 아마 에러가 날 거 같고...ㅡ.ㅡ;;

많은 분들의 고견을 부탁드립니다.[/code]

dondek의 이미지

C 에서 배열이란 것은 포인터로 변환되어 계산되기 때문입니다.

a[3] == *(a + 3)
3[a] == *(3 + a)

위의 코드에서 a + 3과 3 + a는 같은식입니다.

따라서 전혀 문제되지 않는 코드입니다.

진리를 나의 수준으로 끌어내리지 마라.
나를 진리의 수준으로 끌어올려라. - 배꼽 중에서

익명 사용자의 이미지

기가막힌 발상이네요.
gcc 너무 좋은거 아닌가?

결론은 세상에서 제일 좋은 컴파일러 = gcc

:D

vacancy의 이미지

gcc에서만 되는 건 아닐거예요.
c 표준이 아닐까 생각해봅니다.

그리고 gcc가 아주 좋은 compiler이긴 하지만,
사실 가장 좋은 compiler는 대부분 ( 좋다는 걸 performance로 본다면요. )
cpu를 만드는 vendor들이 내놓는 것들이죠.
gcc가 그런 compiler들에 비하면 최적화 정도가 떨어집니다.
( 대신 portability 측면에선 압도적이겠죠. )

뭐 여튼 이제 gcc가 무시할만한 레벨에 있는게 아니라
여러 vendor들이 직접 gcc 개발에
울며 겨자먹기로 참여하고 있는것으로 알고 있습니다.
gcc 사용자들이 '어 이 cpu는 뭔가 떨어지네' 해서는 그들로선 곤란하니까요.

mtorange의 이미지

C 표준 맞습니다...

M.W.Park의 이미지

소시적에 밥벌이가 아닌 하나의 과목으로 공부했을 때 책에서 본게 생각나는 군요.
[] 연산자의 정식 명칭은 address of 입니다. 즉, 일반적으로 생각하는 배열의 member를 참조하는 것(실제 행동은 그럴지라도....^^;)과는 약간 다른 것으로 파악될 수 있죠.

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

mach의 이미지

Quote:
기가막힌 발상이네요.

여기에 한표 :D

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

전웅의 이미지

M.W.Park wrote:
소시적에 밥벌이가 아닌 하나의 과목으로 공부했을 때 책에서 본게 생각나는 군요.
[] 연산자의 정식 명칭은 address of 입니다.

정식 명칭이 "address of" 인 연산자는 C 언어에 없습니다. 다만, 명칭이
"address operator" 인 단항 & 연산자가 있습니다 - 그 연산자를 프로그램
소스 내에서 읽을 때 관례적으로 "address of" 라는 읽을 뿐입니다.

[] 는 배열 첨자 지정 연산자 (array subscripting operator) 로 연산자
자체가 포인터 참조 연산자 (indirection operator) 로 정의되어 있습니다.
이것이 바로 위와 같은 이상한 형태의 연산이 문제 없이 허락되는 이유입니
다 - 어셈블리어에 익숙하신 분들에게는 많이 이상해 보이지도 않을 것이라
생각합니다만...

그와 같은 트릭은 주로 IOCCC 같은 곳에서나 사용되지만, 경우에 따라 어떤
implementation 이 표준 라이브러리를 잘못 제공하는 경우 (예를 들어,
가변 인자 접근에 사용되는 va_end() 매크로를 #define va_end() (void)0
로 잘못 제공하는 경우 등) 문제가 있음을 증명하기 위해 쓰일 수도 있습
니다.

그럼..

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

M.W.Park의 이미지

예전 텍스트를 꺼내어 인덱스를 찾아보니 정식 명칭이 "address of "인 연산자는 '&'이군요... -_-;;
왜 몇년동안 그렇게 알고 있었는지.... -_-;;

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

전웅의 이미지

M.W.Park wrote:
예전 텍스트를 꺼내어 인덱스를 찾아보니 정식 명칭이 "address of "인 연산자는 '&'이군요... -_-;;
왜 몇년동안 그렇게 알고 있었는지.... -_-;;

"address of" 는 단항 & 연산자의 "구어적인" 명칭입니다. "정식" 명칭은
그냥 "address operator" 라고만 해주시면 됩니다.

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

Ooryl Qrygg의 이미지

그냥 덧 붙여 봤읍니다. :D
The array subscripting operation is defined so that E1[E2] is identical to *(E1 + E2). Therefore, despite its asymmetric appearance, subscripting is a commutative operation.
- from The C programming language, pp. 217[/u]

Gands considered it the height of presumption to use personal pronouns to refer to themselves, because it arrogantly assumes the listeners know who the speaker is.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.