연산자 우선순위 관련 질문 드립니다.

is1472의 이미지

후위 연산자 , i++ j++ 과 같은 후위연산자가 연산자 우선순위에서 가장 높은 등급에있습니다.

그런데
i = j++; 같은경우를 보면 j값을 i에 넣고 j를 증가시킵니다. 연산자 우선순위에 따르면 ++를 먼저 해야 하지 않나나요? 그냥 당연시 여기는 계산법에 연산자 우선순위가 헷갈려서 질문 드립니다.

그리고

void main()
{
	char s[10] ="hello";
	char sr[10] ="xyz";
	char *t,*t2;
 
 
 
	t=s;
	t2=sr;
	printf("%p  %p \n",t,t2);
	printf("%s  %s \n",t,t2);
 
	*t ++=*t2++;
	//*t  = *t2;
	//t++;t2++; 와 같이 동작
	printf("%p  %p \n",t,t2);
	printf("%s  %s \n",t,t2);
 
 
}

처음에는 코드중 *t ++=*t2++; 이 부분의 동작 원리를 제 나름 주석으로 결론 지었는데 맞는지에 대한 질문역시 드립니다.
shint의 이미지

t-1 로 값을 출력해보면. 바뀐 값이 보입니다.
http://codepad.org/EYq18h48

확실하지 않다면. 나눠서 연산하고. 확인해보세요.
t=t+1;

void main()
{
	char s[10] ="1234567";
	char sr[10] ="abcdefgh";
	char *t,*t2;
 
 
 
	t=s;
	t2=sr;
	printf("%p  %p \t",t,t2);
	printf("%10s  %10s \n",t,t2);
 
 	*t = *t2;
	printf("%p  %p \t",t,t2);
	printf("%10s  %10s \n",t,t2);
 
 	*t ++;
        *t2++;
	printf("%p  %p \t",t,t2);
	printf("%10s  %10s \n",t,t2);
 
	*t ++=*t2++;
	//*t  = *t2;
	//t++;t2++; 와 같이 동작
	printf("%p  %p \t",t,t2);
	printf("%10s  %10s \n",t,t2);
 
	printf("%p  %p \t",t-1,t2-1);
	printf("%10s  %10s \n",t-1,t2-1);
 
 	*t ++=*t2;
	printf("%p  %p \t",t,t2);
	printf("%10s  %10s \n",t,t2);
 
 	*t =*t2++;
	printf("%p  %p \t",t,t2);
	printf("%10s  %10s \n",t,t2);
 
}

//출력 결과
0xffef231a 0xffef2310 1234567 abcdefgh
0xffef231a 0xffef2310 a234567 abcdefgh
0xffef231b 0xffef2311 234567 bcdefgh
0xffef231c 0xffef2312 34567 cdefgh
0xffef231b 0xffef2311 b34567 bcdefgh
0xffef231d 0xffef2312 4567 cdefgh
0xffef231d 0xffef2313 c567 defgh

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

is1472의 이미지

네 저도 이런식으로 테스트 해봤습니다. 그래서 주석처리 된 부분으로 결론 지었구요
다만 연산자 우선순위를 적용시키면 당연시 여기던 ++의 전위또는 후위처리가 잘 이해가 되질 않아서 질문 드립니다.

익명 사용자의 이미지

세벌의 이미지

++i 와 i++ 이 다릅니다. 직접 비교해 보셔요.

peecky의 이미지

연산자 우선순위랑은 관련 없고, ++ 연산자 자체가 그렇게 동작하는 겁니다.

++ 연산자를 함수로 표현해보면 다음처럼 할 수 있습니다. (컴파일러에 따라 저 함수와 조금 다르게 동작하는 경우도 있습니다)

#include <stdio.h>
 
int postPlusPlusOperator(int * p) {
	int temp = *p;
	*p += 1;
	return temp;
}
 
int main() {
	int i = 0, j = 0;
 
	i = j++;
	printf("%d %d\n", i, j);
 
	i = postPlusPlusOperator(&j);
	printf("%d %d\n", i, j);
}
jick의 이미지

초보자들이 많이 하는 실수인데, 연산자 우선순위는 "어느 연산과 어느 연산을 먼저 묶을 것인가"를 결정하는 거지 "어느 연산을 *먼저* 할 것인가"를 결정하지 않습니다.

예를 들면 f() + g() * h() 같은 코드가 있다고 할 때, 우선순위가 뜻하는 것은 "g() * h()의 결과와 f()를 더한다"라는 것입니다. g나 h를 먼저 부른다는 보장은 전혀 없습니다. 이 코드에서 f, g, h 세 함수가 어떤 순서로 불릴 것이냐는 완전히 컴파일러 마음대로입니다. (아무리 괄호를 더해도 그 사실은 변하지 않습니다.)

is1472의 이미지

먼저 ++i 와 i++가 다르다는것은 저도 알고요 어떻게 동작하는지 알고있습니다. 그 문장이 처리되기전 ,처리된후 증가 등등
다만 제 질문에 대해서 어느정도 답변 해주신분이 jick 분이신데

어느 연솬과 어느연산을 먼저 묶을 것인가? 를 결정 한다고 해주셧습니다.
그러면 제 코드에 적용 시킨다면 어떻게 이해하는것이 옳은 것인지 자세히 설명 해주실수 있나요? 말로만은 정확히 이해가 되지 않아서 질문 드립니다.

*t ++ = *t2++;

이러한 경우 어느 연산을 먼저묶을 것인가에 대한 답은 무엇인가요?

karkayan의 이미지

이경우 후위 ++이 참조* 보다 우선순위가 높기때문에
*(t++) = *(t2++); 형태로 묶입니다.

*(t2++)의 연산 순서는 t2++이 먼저 연산되고 *(t2++)이 연산됩니다.

라스코니의 이미지

A = B 라는 식에 있어서 항상 B가 먼저 결정되고 그 값이 A에 할당됩니다.

그리고

int a[2] = {10, 100};
int *ptr = &a[0];
a[0]++; -- (1) 변수값을 증가, a[0]는 11이 됨
*ptr++; -- (2) 변수값(즉 포인터 변수이므로 주소값이 증가됨)을 증가, ptr은 a[1]을 가리킴

그리고 아래도 참고하세요.
http://jeremyko.blogspot.kr/2012/08/lvalue-rvalue.html

댓글 달기

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