C 언어 책 문제 한번만 봐주세요!

nosu1234의 이미지

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;

지금 보고있는 책에 나온문제인데 어떻게 풀어야할지를 모르겠네요 ㅠㅠ...

Lipi의 이미지

영어로 문제가 나온 걸로 봐서 원서 인것 같은데요.
실무에는 전혀 사용하지 않을 것 같군요. 저게 C언어 코드로 사용가능한지도 의심스럽군요.

Stephen Kyoungwon Kim@Google의 이미지

첫번째는 컴파일이 되지 않습니다 []의 첫 오퍼런드로 10이 왔는데 10은 int 종류의 상수일 거고 []의 첫 오퍼런드가 될 수 없습니다.

두번째 문제는 어떻게 푸냐면, 먼저 하나씩 하나씩 어떤 operator가 처리되는지 살펴 보시고요, 그 operator가 적용되면 수행 결과가 무슨 타입인지 확인해 보세요. 모든 보기가 다 컴파일 가능하지는 않습니다. 그 다음에 추려진 것을 갖고 값(20)을 집어넣는 메모리 위치가 어딘지 확인해 보세요.

익명 사용자의 이미지

Quote:
첫번째는 컴파일이 되지 않습니다 []의 첫 오퍼런드로 10이 왔는데 10은 int 종류의 상수일 거고 []의 첫 오퍼런드가 될 수 없습니다.

그렇지 않다는 게 재밌는 점입니다.

C언어에서 a[b]는 *(a+b)와 같은 의미를 가지도록 정의되어 있거든요.
그래서 a[b] = *(a+b) = *(b+a) = b[a]라는 이상한 항등식(?)이 성립합니다.
물론 ioccc 출품작 같은 걸 만들 때에나 쓸모있는 항등식이긴 합니다.

위 항등식을 기계적으로 적용하면 대입문의 좌변과 우변이 각각 동등한 expression을 찾는 건 어렵지 않아요.

문제는 우변이 좌변에 대입될 수 있게 만드는 ptr의 타입을 찾기가 어렵다는 겁니다.
대충 봤는데 불가능해 보이는데요;;

Stephen Kyoungwon Kim@Google의 이미지

감사합니다. 말씀대로라면 표준에서는 이렇게 되나 보군요. 그런데 제 코드는 컴파일이 되지 않는 듯 한데 컴파일러가 그 표준을 굳이 구현하지 않는 거라고 볼 수 있나요?

#include <stdio.h>
#include <stdlib.h>
 
int main() {
  unsigned char *ptr = (unsigned char*) malloc(sizeof(unsigned char) * 30);
  ptr = ptr + 10;
  10[15 + ptr] = -10[ptr[-10]] + 5;
  return 0;
}

gcc x.c
x.c: In function ‘main’:
x.c:7:21: error: subscripted value is neither array nor pointer nor vector
    7 |   10[15 + ptr] = -10[ptr[-10]] + 5;
      |                     ^
 
Compilation exited abnormally with code 1 at Wed Jun 10 17:12:23

clang도 gcc와 같은 결과거든요.

Stephen Kyoungwon Kim@Google의 이미지

ptr[-10]이 포인터가 아니란 얘기군요. 놀랍네요. 전 당연히 a[x]에서 a는 어레이/포인터 같은 거고 x는 integral value일 거라고 생각했는데. 감사합니다.

왼쪽은 *(ptr + const) 꼴이고 우변에는 *( *(ptr + const) + const ) 형태라서 const를 빼고 보면 *ptr := **ptr 이 가능해야 할 거 같은데 unsigned char나 그 N차원 포인터로는 안 될 것 같네요.

익명 사용자의 이미지

말씀드렸다시피 제시된 코드는 우변이 좌변에 대입될 수 있는 형태의 표현식이 아니어서 컴파일이 안 되는 것이지, a[i] ≡ i[a] 꼴의 항등식은 원래 성립합니다.

#include <stdio.h>
 
int main(void) {
	int array[10];
 
	for (int i=0; i<10; ++i){
		scanf("%d", &array[i]);
	}
 
	for (int i=9; i>=0; --i){
		printf("%d ", i[array]);
	}
	puts("");
	return 0;
}

이건 컴파일 잘 될 거에요. ioccc 출품작들 같은 데서 자주 보이는 패턴이지요.

Stephen Kyoungwon Kim@Google의 이미지

말씀하신 부분은 이 댓글 달아주시기 전에 이해 했었습니다. ptr의 타입에 대해 우변이 좌변에 대입할 수 없는 타입이 되어 컴파일 에러가 났다고 생각했습니다. 에러 메시지를 다시 자세히 보니 왼쪽은 넘어가고 오른쪽에서 에러가 났더군요.

왜 이렇게 표준을 정했는지는 아직도 잘 이해가 안 되네요. 0[5+arr] 이라고 쓴 코드를 저는 읽기 싫을 것 같은데, compatibility 문제였나요?

어쨌거나 오래 C/C++을 했지만 전혀 몰랐던 것이었는데 거듭 감사드립니다.

익명 사용자의 이미지

정말 되네요!! 20년 가까이 몰랐던 사실입니다.... 좋은 정보 감사드립니다.

#include<stdio.h>
 
int main()
{
        int a[10];
 
        a[0]=100;
        a[1]=200;
 
        printf("%d %d %d %d\n",0[a],1[a],*(a+0),*(1+a));
 
        return 0;
}
세벌의 이미지

Q4

int main()
{
	unsigned char ptr;
	10[15 + ptr] = -10[ptr[-10]] + 5;
}
컴파일 에러 나오네요...
파이썬3의 이미지

C언어 입문은 "씹어먹는 C언어" 가 좋더이다...
https://modoocode.com/23 (포인터 시작)

[우분투 18.04 파여폭스 나비에서 적었어요~]

댓글 달기

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