[질문] C언어 다음이 어떤 차이가 있는지 궁금합니다.

keston의 이미지

int i[]={1,2,3};
for(j=0; j<3; j++)
   printf("%d\n", *(i+j));     (1)
   
   printf("%d\n", *i++);       (2)

C언어를 다시 공부중인데..책에 이런 예제가 나왔네요.
전 (1)이나 (2) 모두 같은 거 같은데 (2)는 컴파일 자체가 안되군요.
(실은 (1)도 안되는줄 알았는데 (1)은 가능하군요.)
(1)은 가능한데 (2)는 왜 안될까요?

C언어 책만 수차례 봤는데도 항상 수박 겉핥기식이다 보니 볼때마다 새롭네요. :oops:

kslee80의 이미지

i 가 변수가 아니기 때문에 ++ 연산을 할 수 없기 때문입니다.
저 경우에 i 는 named-pointer 라고 분류될텐데....
포인터처럼 쓸 수는 있지만 저 값 자체를 변경할 수 없습니다.

*(i+j) 는 일반 연산이며, 결과로 인해 i 값이 변경되지 않지만,
*i++ 은 ++ 연산의 결과가 i 값을 변경시키기 때문에 허용되지 않죠.

lsj0713의 이미지

배열의 이름은 &array_name, sizeof(array_name), char *s = "string literal"; 의 세 경우를 제외하고는 항상 그 자신의 첫번째 원소를 가리키는 포인터 주소 값으로 변환됩니다.

또한 a[i]라는 배열 참조식의 정의는 *(a + i) 입니다. 이 정의에 의해서 a[i] 를 *(a + i)로도, i[a]로 바꾸어 쓸 수도 있습니다. 좀 더 응용하면 4["ABCDEFG"] (그 결과는 'E') 같은 것 또한 가능합니다.

또한 배열 이름은 lvalue이되 변경될 수 없는 lvalue 입니다. 따라서 대입 연산자의 좌변에 올 수 없습니다. (대입 연산자의 좌변에 올 수 있는 것은 변경가능한 lvalue 뿐입니다) 또한 마찬가지 이유로 ++, -- 연산자의 피연산자로도 사용될 수 없습니다.

익명 사용자의 이미지

C++로 얘기하면 (C99 스펙을 보지 않아서 모르겠지만)

int i[] = { 1, 2, 3 ... };
에서 i의 type은
int* const i;
와

등가입니다.
i의 값은 Update 불가능하게 돼 있습니다.
GunSmoke의 이미지

lsj0713 wrote:
배열의 이름은 &array_name, sizeof(array_name), char *s = "string literal"; 의 세 경우를 제외하고는 항상 그 자신의 첫번째 원소를 가리키는 포인터 주소 값으로 변환됩니다.

또한 a[i]라는 배열 참조식의 정의는 *(a + i) 입니다. 이 정의에 의해서 a[i] 를 *(a + i)로도, i[a]로 바꾸어 쓸 수도 있습니다. 좀 더 응용하면 4["ABCDEFG"] (그 결과는 'E') 같은 것 또한 가능합니다.

또한 배열 이름은 lvalue이되 변경될 수 없는 lvalue 입니다. 따라서 대입 연산자의 좌변에 올 수 없습니다. (대입 연산자의 좌변에 올 수 있는 것은 변경가능한 lvalue 뿐입니다) 또한 마찬가지 이유로 ++, -- 연산자의 피연산자로도 사용될 수 없습니다.

배열형 수식이 대입 연산자의 좌측 피연산자로 사용될 수 없는 이유는 modifiable lvalue 이기 때문이 아니라, lvalue 이던 배열이 몇몇 문맥을 제외하고는 포인터로 변환되며 더이상 lvalue 가 아니기 때문입니다.

아래의 길고 긴 링크를 확인해 주시기 바랍니다.
http://groups.google.com/groups?q=author:mycoboco%40hanmail.net+%ED%8F%AC%EC%9D%B8%ED%84%B0+modifiable+lvalue&hl=ko&lr=&ie=UTF-8&scoring=d&selm=9jmp52%24lqn%241%40news.netple.com&rnum=2

大逆戰

keston의 이미지

관심 가져주셔서 감사합니다. :D

lsj0713의 이미지

...제가 그동안 꽤 오랫동안 유언비어를 퍼트려 온 셈인데 참으로 걱정이군요. -_-; 포스팅된지 꽤 오래된 글인데 아직 읽어보지 못했었다니...그래도 활동한곳이 kldp 외엔 별로 없으니 그나마 다행입니다. -_-; 외운거 그대로 읊는 제 문제점이 드러나는 순간인데... 그동안 피해 입으신 분들께 사과드립니다.

그래도 유언비어는 계속됩니다. 기대해주세요(...)

댓글 달기

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