C언어 이거 결과가 예상한거하고 다르네요

stargt의 이미지

#include <stdio.h>

main()
{
      int i = 0, j = 0;
      char a[12] = "book", b[] = "marks";
      
      printf("%s+%s=", a, b);
      while(a[i] != '\0')
            i++;
      while(b[i] != '\0'){
            a[i] = b[j];
            i++;
            j++;
      }
      a[i] = '\0';
      printf("%s\n", a);
}

이렇게 짧게 썼는데요

원하는 결과는

book+marks=bookmarks

이건데 계속

book+marks=bookm

이렇게 나오네요;;
끝에 bookm 이거 표시하는 변수가 결과적으로 a인데 a의 길이를 조사해보니까 5던데

이게 왜 원하는 결과가 안나오는거예요;

익명 사용자의 이미지

 while(b[i] != '\0'){ [code/]
 
이 것을
 
[code] while(b[j] != '\0'){ [code/]
 
이렇게
sangwoo의 이미지

오프토픽입니다만,

a[i] = b[j];
i++;
j++;


a[i++] = b[j++];

둘중에 어느 걸 많이들 쓰시는지요?

----
Let's shut up and code.

stargt의 이미지

이거 성안당에서 나온 번역본이 원래 이런가요?

한 5번정도 소스코드 오류를 본것같은데..

어쩄든 해결해주셔서 감사합니다

#include <stdio.h>

int main()
{
while(1)
printf("0");
return 0;
}

xster의 이미지

sangwoo wrote:
오프토픽입니다만,
a[i] = b[j];
i++;
j++;


a[i++] = b[j++];

둘중에 어느 걸 많이들 쓰시는지요?

이런 식의 코드를 아직까지 써본 적이 없어서 잘 모르겠지만
만약 쓴다고 하면 후자를 사용할 것 같습니다.
후자를 쓰는 것이 내용이 복잡해지거나 애매해지는 경우는 없을 것 같아서요.
Fe.head의 이미지

sangwoo wrote:
오프토픽입니다만,
a[i] = b[j];
i++;
j++;


a[i++] = b[j++];

둘중에 어느 걸 많이들 쓰시는지요?

전 전자 입니다.

a[i] = b[j];
++i;
++j;

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

addnull의 이미지

xster wrote:
sangwoo wrote:
오프토픽입니다만,
a[i] = b[j];
i++;
j++;


a[i++] = b[j++];

둘중에 어느 걸 많이들 쓰시는지요?

이런 식의 코드를 아직까지 써본 적이 없어서 잘 모르겠지만
만약 쓴다고 하면 후자를 사용할 것 같습니다.
후자를 쓰는 것이 내용이 복잡해지거나 애매해지는 경우는 없을 것 같아서요.

후자의 경우엔 애매한 경우가 생길 수도 있습니다...

a[i++] = b[i++];

이런 류의 애매함이 생길 수 있다는 거죠.
전에도 이런 글타래에 참가를 했었는데
http://bbs.kldp.org/viewtopic.php?t=64841
아직 a[a[i]]의 진실을 모르겠군요.. +_+;;

2006년 1월 21일.

IsExist의 이미지

result = (i=pop())-(j=pop());
printf("%d %d\n", i, j);

연산자는 우선순위 외에도 결합 방향이 있습니다.
결합방향에 따르면 a - b 에서 a 가 먼저 실행되고 b가 실행이 됩니다.
따라서 위의 코드에서는 앞의 pop이 먼저 실행된다고 예측되는군요.

-S 옵션을 줘봐서 어셈으로 펼쳐 보는 방법으로 확인 가능할듯 합니다.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

익명 사용자의 이미지

IsExist wrote:
result = (i=pop())-(j=pop());
printf("%d %d\n", i, j);

연산자는 우선순위 외에도 결합 방향이 있습니다.
결합방향에 따르면 a - b 에서 a 가 먼저 실행되고 b가 실행이 됩니다.
따라서 위의 코드에서는 앞의 pop이 먼저 실행된다고 예측되는군요.

-S 옵션을 줘봐서 어셈으로 풀어 보는 방법으로 확인 가능할듯 합니다.

전 글타래를 잘 보시면
상관 없다는 것(예측 불가)을 아실 수 있습니다.
결합방향에 상관이 없이 operand의 평가시점은
임플리멘테이션에 의존하기때문에 모른다는게 요점입니다.

익명 사용자의 이미지

Quote:
아직 a[a[i]]의 진실을 모르겠군요.. +_+;;

a[i] == i 인 경우에 문제가 되는 것이 아닐까요? 이런 경우, 다음과 같은 수식에서 두 시퀸스 포인트 사이에서 a[i]에 대한 참조와 수정이 동시에 일어나게 됩니다.

a[a[i]] = 1;

하지만, 어떤 순서로 동작이 일어날 때 문제가 발생하는 지는 잘 모르겠군요. 역시 전웅님이 오셔야...;;;

익명 사용자의 이미지

IsExist wrote:
-S 옵션을 줘봐서 어셈으로 펼쳐 보는 방법으로 확인 가능할듯 합니다.

어셈으로 펼쳐보는 것만이 능사는 아닙니다. A + B라는 수식이 있을 때, 컴파일러가 어떤 기준으로 먼저 평가할 피연산자를 선택하는지 알 수 없기 때문입니다. 실제로, 컴파일러는 최적화를 위해 피연산자들의 평가 순서를 멋대로 바꾸기도 합니다.

길게 설명하기 귀찮으니 걍 긁겠습니다.

The grouping of operators and operands is indicated by the syntax. Except as specified later (for the function-call (), &&, ||, ?:, and comma operators), the order of evaluation of subexpressions and the order in which side effects take place are both unspecified.

댓글 달기

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