C 언어 책 문제 한번만 봐주세요!
글쓴이: nosu1234 / 작성시간: 수, 2020/06/10 - 4:02오후
Question 4
Given that ptr is type unsigned char, please select an equivalent statement for:
10[15 + ptr] = -10[ptr[-10]] + 5;
a) 0;
b) *(ptr[10] + 15) = -10[ptr[-10]] + 5;
c) ptr[10 + 15] = (ptr[-10])[-10] + 5;
d) 15[ptr+10] = *(ptr – 20 + 5);
Question 8
Please select an equivalent statement for:
((&(i[0]))+5)[5] = 20;
a) (&i)[10] = 20;
b) (i+7)[3] = 20;
c) &(*i)[5][5] = 20;
d) &(i-10)[5] = 20;
지금 보고있는 책에 나온문제인데 어떻게 풀어야할지를 모르겠네요 ㅠㅠ...
Forums:
어떤 책이길래 이런 문제가 나왔는지 궁금하네요.
영어로 문제가 나온 걸로 봐서 원서 인것 같은데요.
실무에는 전혀 사용하지 않을 것 같군요. 저게 C언어 코드로 사용가능한지도 의심스럽군요.
..
첫번째는 컴파일이 되지 않습니다 []의 첫 오퍼런드로 10이 왔는데 10은 int 종류의 상수일 거고 []의 첫 오퍼런드가 될 수 없습니다.
두번째 문제는 어떻게 푸냐면, 먼저 하나씩 하나씩 어떤 operator가 처리되는지 살펴 보시고요, 그 operator가 적용되면 수행 결과가 무슨 타입인지 확인해 보세요. 모든 보기가 다 컴파일 가능하지는 않습니다. 그 다음에 추려진 것을 갖고 값(20)을 집어넣는 메모리 위치가 어딘지 확인해 보세요.
Quote:첫번째는 컴파일이 되지 않습니다 []의 첫
그렇지 않다는 게 재밌는 점입니다.
C언어에서 a[b]는 *(a+b)와 같은 의미를 가지도록 정의되어 있거든요.
그래서 a[b] = *(a+b) = *(b+a) = b[a]라는 이상한 항등식(?)이 성립합니다.
물론 ioccc 출품작 같은 걸 만들 때에나 쓸모있는 항등식이긴 합니다.
위 항등식을 기계적으로 적용하면 대입문의 좌변과 우변이 각각 동등한 expression을 찾는 건 어렵지 않아요.
문제는 우변이 좌변에 대입될 수 있게 만드는 ptr의 타입을 찾기가 어렵다는 겁니다.
대충 봤는데 불가능해 보이는데요;;
...
감사합니다. 말씀대로라면 표준에서는 이렇게 되나 보군요. 그런데 제 코드는 컴파일이 되지 않는 듯 한데 컴파일러가 그 표준을 굳이 구현하지 않는 거라고 볼 수 있나요?
clang도 gcc와 같은 결과거든요.
아..
ptr[-10]이 포인터가 아니란 얘기군요. 놀랍네요. 전 당연히 a[x]에서 a는 어레이/포인터 같은 거고 x는 integral value일 거라고 생각했는데. 감사합니다.
왼쪽은 *(ptr + const) 꼴이고 우변에는 *( *(ptr + const) + const ) 형태라서 const를 빼고 보면 *ptr := **ptr 이 가능해야 할 거 같은데 unsigned char나 그 N차원 포인터로는 안 될 것 같네요.
말씀드렸다시피 제시된 코드는 우변이 좌변에 대입될 수
말씀드렸다시피 제시된 코드는 우변이 좌변에 대입될 수 있는 형태의 표현식이 아니어서 컴파일이 안 되는 것이지, a[i] ≡ i[a] 꼴의 항등식은 원래 성립합니다.
이건 컴파일 잘 될 거에요. ioccc 출품작들 같은 데서 자주 보이는 패턴이지요.
감사합니다
말씀하신 부분은 이 댓글 달아주시기 전에 이해 했었습니다. ptr의 타입에 대해 우변이 좌변에 대입할 수 없는 타입이 되어 컴파일 에러가 났다고 생각했습니다. 에러 메시지를 다시 자세히 보니 왼쪽은 넘어가고 오른쪽에서 에러가 났더군요.
왜 이렇게 표준을 정했는지는 아직도 잘 이해가 안 되네요. 0[5+arr] 이라고 쓴 코드를 저는 읽기 싫을 것 같은데, compatibility 문제였나요?
어쨌거나 오래 C/C++을 했지만 전혀 몰랐던 것이었는데 거듭 감사드립니다.
정말 되네요!! 20년 가까이 몰랐던 사실입니다...
정말 되네요!! 20년 가까이 몰랐던 사실입니다.... 좋은 정보 감사드립니다.
문제를 위한 문제인 듯
Q4
세벌 https://sebuls.blogspot.kr/
C언어 입문은 "씹어먹는 C언어" 가 좋더이다..
C언어 입문은 "씹어먹는 C언어" 가 좋더이다...
https://modoocode.com/23 (포인터 시작)
[우분투 18.04 파여폭스 나비에서 적었어요~]
댓글 달기