c언어하다 문제생겼는데 봐주세요
글쓴이: stargt / 작성시간: 일, 2005/12/25 - 12:15오후
아래 코드에서 굵게 밑줄친 부분이 이상합니다
==========================================
#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입니다.
Forums:
Re: c언어하다 문제생겼는데 봐주세요
제가 보긴 여기가 문제네요... for 뒤에 { 가 빠졌습니다
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
Re: c언어하다 문제생겼는데 봐주세요
위에서 = 3을 빼 보세요. 근데 책에서 본거라고 하셨는데. 이런표현이
있나요? &in = 3의 의미가 무엇인가요?
Re: c언어하다 문제생겼는데 봐주세요
그건 잘못된 것이 없는데요. :)
}는 for를 닫는게 아니고 main() 선언을 닫는 것 뿐입니다.
lvalue
gcc 4 부터는 &n = 3;
(char*)&temp = xxx;
등과같이 lvalue casting에서 error가 뜨더군요
scanf("%d", &in = 3);in에 붙은 &
scanf("%d", &in = 3);
in에 붙은 & 와 = 연산자 중에서 우선순위가 &가 더 높습니다. 그런데 &in의 결과값은 lvalue가 아닙니다. 대입 연산자의 좌변에는 lvalue가 와야 하므로 당연히 잘못된 코드입니다.
&n = 3;
(char*)&temp = xxx;
역시 마찬가지 이유로 잘못된 코드입니다. &가 붙은 순간부터 lvalue라는 조건과는 멀어지지요.
위에 손님께서 잘 말하셨지만 첨언하자면lvalue 라고 하는 것은
위에 손님께서 잘 말하셨지만 첨언하자면
lvalue 라고 하는 것은 = (대입연산자)의 왼쪽에 오는 것을 말합니다.
대입연산자는 오른쪽에 있는 것을 왼쪽에 저장하라는 것이니까 왼쪽에는 값을 저장할 수 있는 것이 와야합니다.
그런데 &in 에서 &는 '주소연산자'입니다. &in이 수행되면
in이라고 하는 변수의 메모리 주소 값(즉 상수: 변하지 않는 값)이 됩니다.
int in 이 실제 주소가 0xffff0000 이라면
&in = 3 -> 0xffff0000 = 3 으로 해석되어 질 것이면 이것은
처리될 수 없을 것입니다.
소스 문맥상 &in = 3 -> &in 으로 되어야 할 것 같습니다.
왜 &in 이어야 하냐면 포인터에 대한 얘기로 가야하기 때문에...
이제 C를 공부하시는 것 같아서 조언을 좀 더 하자면
모든 입력값은 확인 절차를 거쳐야 합니다.
그냥 책의 예제를 따라 하는 것이라면 책이 잘못되었다고 감히 말할 수 있습니다. 좋은 책들에 대한 소개는 이미 KLDP에서 다루어졌기 때문에 검색을 해보시기 바랍니다.
[quote="heoks"]위에 손님께서 잘 말하셨지만 첨언하자면
책에서 의도적으로 입력값의 확인 절차를 생략하는 경우도 있습니다. (보통 지면 부족 때문에) 하지만 저 코드는 도저히 의도를 알기 힘들군요. in = 3;이 어디 가야 할 지도 의문인데, 설마 기본값라는 생각으로 쓴 걸까요? (이 경우 in = 3;이 scanf 앞으로 가고 &in은 남겨 둠)
- 토끼군
댓글 달기