연산자 우선순위 관련 질문 드립니다.
글쓴이: is1472 / 작성시간: 금, 2018/05/11 - 1:22오후
후위 연산자 , 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++; 이 부분의 동작 원리를 제 나름 주석으로 결론 지었는데 맞는지에 대한 질문역시 드립니다.
Forums:
참고해보세요.
t-1 로 값을 출력해보면. 바뀐 값이 보입니다.
http://codepad.org/EYq18h48
확실하지 않다면. 나눠서 연산하고. 확인해보세요.
t=t+1;
//출력 결과
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
네 저도 이런식으로 테스트 해봤습니다.
네 저도 이런식으로 테스트 해봤습니다. 그래서 주석처리 된 부분으로 결론 지었구요
다만 연산자 우선순위를 적용시키면 당연시 여기던 ++의 전위또는 후위처리가 잘 이해가 되질 않아서 질문 드립니다.
http://en.cppreference.com/w
http://en.cppreference.com/w/c/language/operator_incdec
++i 와 i++ 이 다릅니다. 직접 비교해 보셔요.
++i 와 i++ 이 다릅니다. 직접 비교해 보셔요.
세벌 https://sebuls.blogspot.kr/
연산자 우선순위랑은 관련 없고, ++ 연산자 자체가
연산자 우선순위랑은 관련 없고, ++ 연산자 자체가 그렇게 동작하는 겁니다.
++ 연산자를 함수로 표현해보면 다음처럼 할 수 있습니다. (컴파일러에 따라 저 함수와 조금 다르게 동작하는 경우도 있습니다)
...
초보자들이 많이 하는 실수인데, 연산자 우선순위는 "어느 연산과 어느 연산을 먼저 묶을 것인가"를 결정하는 거지 "어느 연산을 *먼저* 할 것인가"를 결정하지 않습니다.
예를 들면
f() + g() * h()
같은 코드가 있다고 할 때, 우선순위가 뜻하는 것은 "g() * h()의 결과와 f()를 더한다"라는 것입니다. g나 h를 먼저 부른다는 보장은 전혀 없습니다. 이 코드에서 f, g, h 세 함수가 어떤 순서로 불릴 것이냐는 완전히 컴파일러 마음대로입니다. (아무리 괄호를 더해도 그 사실은 변하지 않습니다.)많은 분들이 답변해주셧네요 감사합니다.
먼저 ++i 와 i++가 다르다는것은 저도 알고요 어떻게 동작하는지 알고있습니다. 그 문장이 처리되기전 ,처리된후 증가 등등
다만 제 질문에 대해서 어느정도 답변 해주신분이 jick 분이신데
어느 연솬과 어느연산을 먼저 묶을 것인가? 를 결정 한다고 해주셧습니다.
그러면 제 코드에 적용 시킨다면 어떻게 이해하는것이 옳은 것인지 자세히 설명 해주실수 있나요? 말로만은 정확히 이해가 되지 않아서 질문 드립니다.
*t ++ = *t2++;
이러한 경우 어느 연산을 먼저묶을 것인가에 대한 답은 무엇인가요?
이경우 후위 ++이 참조* 보다 우선순위가 높기때문에
이경우 후위 ++이 참조* 보다 우선순위가 높기때문에
*(t++) = *(t2++); 형태로 묶입니다.
*(t2++)의 연산 순서는 t2++이 먼저 연산되고 *(t2++)이 연산됩니다.
A = B 라는 식에 있어서 항상 B가 먼저 결정되고
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
댓글 달기