int val2=(val1--)+2; 여기에서 ()이 괄호때문에 혼동이 있으신듯 하네요..
물론 ()는 우선순위 1위 로서 쉽게 생각하면 val1-- 먼저 해주고 +2를 해준다고 생각되겠지만
여기에서는 우선순위가 아닌 구별을 위해 사용한듯 싶습니다.
즉, (val1--)+2; 나 val1--+2나 똑같은 결과값을 나타냅니다.
그리고 증감연산자는 선증감과 후증감이 있는데요
선증감은 변수명앞에 ++혹은--가 있는거고 후증감은 변수명 뒤에 오는 겁니다.
다시 말해
선증감은 마치 ()와 같이 먼저 그 값을 증감시킨후 연산한 값을 리턴하고,
후증감은 먼저 연산한 값을 리턴 후 증감하는 거죠..
즉, 선증감은 수학적으로(C언어와는 다름) 나타내면 (val1--)+2와 같고
후증감은 val1+2 후 val1-- 입니다.
즉, 선증감을 쓰느냐 후증감을 쓰느냐에 따라 우선순위가 달라집니다.
물론 좌변이 없는 예로 a++; 혹은 ++a;처럼 단항으로 쓴다면 선증감과 후증감의 차이는
없습니다. 단 예외는 있죠. return 처럼. return ++a;와 return a++; 값의 차이는 있습니다.
#include <stdio.h>
int test(int a);
int main(void)
{
int val1=10;
int val2;
val2 = test(val1);
printf( "val1 : %d \n", val2);
return 0;
}
int test(int a)
{
return ++a;
}
즉, test함수의 return문장에서 ++a;로 할 경우 증가 후 리턴 이기 때문에 11이 val2에
대입되고, a++;로 할 경우 리턴 후 증가이기 때문에 val2에 10이 대입됩니다.
여튼 본론으로
int val2=(val1--)+2;
문장에서 val2에 val1의 값과 상수 2를 더해서 리턴 후 val1값을 감소시키는거죠
그래서 val2에 12가 대입됩니다. 그리고 val1은 리턴 후 증감되었기 때문에 9가 되는거구요..
풀어말하자면
int val2=(val1--)+2; 는 한줄이지만 다음과 같은 연산을 하신다고 생각하시면 됩니다.
1. int val2라는 변수를 선언
2. val1은 후증감 연산자이기 때문에 먼저val1(현재 10)값과 상수 2를 더함
3. 2번의 값을 val2라는 변수에 대입함 (즉 12가 대입됨)
4. 후증감 연산자인 val1--를 실행함(즉, val1값을 -1시킴)
물론 int val1=10;
val1 = val--;
라는 문장이 있다면 제가 말한대로 한다면
이는 후증감이기 때문에 먼저 값을 리턴 후 감소하기 때문에 10이라고 생각하시겠지만..
물론 val1에는 10이 들어가겠지요,, 허나 val1를 --하라고 했으니 결국은 9가 되는겁니다.
헷갈릴 수 있는데 이거를 printf로 이용해서 비교하면 이해가 쉽게 가실껍니다.
int val1=10;
printf("val1 = %d\n", val1--);
이렇게 하면 화면에는 후증감으로 인해 값을 리턴 후 감소하기 때문에 10을 출력하지만
결국은 val1은 9를 갖게 됩니다.
그것을 확인하는방법은 바로 아래 다음과 같은 문장을 코딩합니다.
printf("val1 = %d\n", val1);
즉, 이말은 그냥 val1값을 출력하라는 건데 첫번째 printf문에서 값을 리턴 후 감소시켰기 때문에
첫번째 printf문에서 val1은 10이 되고 두번째 printf는 첫번째 printf문에서 후증감이
사용되었기 때문에 결국 val1을 출력하면 9가 출력됩니다.
이와 동일하게
int val1=10;
printf("val1 = %d\n",++val1);
으로 하면 선증감으로 인해 먼저 증가 후 리턴 하기 때문에 11이 되는 거구요..
증감연산자가 은근 헷갈립니다.