c언어하다 문제생겼는데 봐주세요

stargt의 이미지

아래 코드에서 굵게 밑줄친 부분이 이상합니다

==========================================

#include <stdio.h>

main()

{

int a[4][3] = {{1, 3, 5}, {2, 4, 6}, {3, 6, 9}, {123, 234, 345}};

int i, in, *pt;

scanf("%d", &in = 3);

pt = a[in-1]; /* 포인터 pt에 a[in-1][0]의 번지를 직접 지정 */

for(i = 0; i < 3; i++)

printf("%d\t", *(pt+i));

}

==========================================

저 부분이 컴파일러로 컴파일 하면 저부분에 대해서 [invalid lvalue in assignment] 이런 오류가 나옵니다

이게 책에있는거 그대로 한건데 왜그런거죠?

컴파일러는 gcc입니다.

정태영의 이미지

stargt wrote:
     for(i = 0; i < 3; i++)

              printf("%d\t", *(pt+i));

}

제가 보긴 여기가 문제네요... for 뒤에 { 가 빠졌습니다

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

vananamilk의 이미지

stargt wrote:
아래 코드에서 굵게 밑줄친 부분이 이상합니다

scanf("%d", &in = 3);

위에서 = 3을 빼 보세요. 근데 책에서 본거라고 하셨는데. 이런표현이
있나요? &in = 3의 의미가 무엇인가요?

익명 사용자의 이미지

정태영 wrote:
stargt wrote:
     for(i = 0; i < 3; i++)

              printf("%d\t", *(pt+i));

}

제가 보긴 여기가 문제네요... for 뒤에 { 가 빠졌습니다


그건 잘못된 것이 없는데요. :)
}는 for를 닫는게 아니고 main() 선언을 닫는 것 뿐입니다.
익명 사용자의 이미지

gcc 4 부터는 &n = 3;
(char*)&temp = xxx;
등과같이 lvalue casting에서 error가 뜨더군요

익명 사용자의 이미지

scanf("%d", &in = 3);

in에 붙은 & 와 = 연산자 중에서 우선순위가 &가 더 높습니다. 그런데 &in의 결과값은 lvalue가 아닙니다. 대입 연산자의 좌변에는 lvalue가 와야 하므로 당연히 잘못된 코드입니다.

&n = 3;
(char*)&temp = xxx;

역시 마찬가지 이유로 잘못된 코드입니다. &가 붙은 순간부터 lvalue라는 조건과는 멀어지지요.

heoks의 이미지

위에 손님께서 잘 말하셨지만 첨언하자면

lvalue 라고 하는 것은 = (대입연산자)의 왼쪽에 오는 것을 말합니다.

대입연산자는 오른쪽에 있는 것을 왼쪽에 저장하라는 것이니까 왼쪽에는 값을 저장할 수 있는 것이 와야합니다.
그런데 &in 에서 &는 '주소연산자'입니다. &in이 수행되면
in이라고 하는 변수의 메모리 주소 값(즉 상수: 변하지 않는 값)이 됩니다.

int in 이 실제 주소가 0xffff0000 이라면
&in = 3 -> 0xffff0000 = 3 으로 해석되어 질 것이면 이것은
처리될 수 없을 것입니다.

소스 문맥상 &in = 3 -> &in 으로 되어야 할 것 같습니다.
왜 &in 이어야 하냐면 포인터에 대한 얘기로 가야하기 때문에...

이제 C를 공부하시는 것 같아서 조언을 좀 더 하자면
모든 입력값은 확인 절차를 거쳐야 합니다.
그냥 책의 예제를 따라 하는 것이라면 책이 잘못되었다고 감히 말할 수 있습니다. 좋은 책들에 대한 소개는 이미 KLDP에서 다루어졌기 때문에 검색을 해보시기 바랍니다.

lifthrasiir의 이미지

heoks wrote:
위에 손님께서 잘 말하셨지만 첨언하자면

lvalue 라고 하는 것은 = (대입연산자)의 왼쪽에 오는 것을 말합니다.

대입연산자는 오른쪽에 있는 것을 왼쪽에 저장하라는 것이니까 왼쪽에는 값을 저장할 수 있는 것이 와야합니다.
그런데 &in 에서 &는 '주소연산자'입니다. &in이 수행되면
in이라고 하는 변수의 메모리 주소 값(즉 상수: 변하지 않는 값)이 됩니다.

int in 이 실제 주소가 0xffff0000 이라면
&in = 3 -> 0xffff0000 = 3 으로 해석되어 질 것이면 이것은
처리될 수 없을 것입니다.

소스 문맥상 &in = 3 -> &in 으로 되어야 할 것 같습니다.
왜 &in 이어야 하냐면 포인터에 대한 얘기로 가야하기 때문에...

이제 C를 공부하시는 것 같아서 조언을 좀 더 하자면
모든 입력값은 확인 절차를 거쳐야 합니다.
그냥 책의 예제를 따라 하는 것이라면 책이 잘못되었다고 감히 말할 수 있습니다. 좋은 책들에 대한 소개는 이미 KLDP에서 다루어졌기 때문에 검색을 해보시기 바랍니다.

책에서 의도적으로 입력값의 확인 절차를 생략하는 경우도 있습니다. (보통 지면 부족 때문에) 하지만 저 코드는 도저히 의도를 알기 힘들군요. in = 3;이 어디 가야 할 지도 의문인데, 설마 기본값라는 생각으로 쓴 걸까요? (이 경우 in = 3;이 scanf 앞으로 가고 &in은 남겨 둠)

- 토끼군

댓글 달기

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