c언어 증가 감소 연산자 중 질문

c언어 증가 감소 연산자 중 질문

작성일 2010.07.16댓글 4건
    게시물 수정 , 삭제는 로그인 필요

#include <stdio.h>

 

int main(void)
{
     int val1=10;
     int val2=(val1--)+2;

    

     printf( "val1 : %d \n", val1); //1번
     printf( "val2 : %d \n", val2); //2번

    

     return 0;
}

 

여기서 왜

 

val1 이 9가 나오고 val2가 12가 나오나요?

 

제 생각엔 1번엔 val1=10이라 10이나오고 2번엔 val1 감소 연산을 해주고 2를 더해줘서 11이 나와야될것같

 

은데;

 

증가 감소 연산을 쉽게 이해시켜주세요 ㅠㅠ

 


#c언어 증감연산자 #c언어 증감연산자 예제 #c언어 증감연산자 문제 #c언어 증감연산자 2증가 #c언어 2씩 증가 #c언어 1씩 증가 #c언어 for문 1씩 증가 #c언어 배열 1씩 증가 #c언어 포인터 증가 #c언어 숫자 증가

profile_image 익명 작성일 -

약간 헷갈리신듯하네요

var1-- << 은      var1변수에 감소연산 한번실행하는겁니다..

괄호로 씌워져있기때문에 그거먼저 실행될꺼고요

var1변수에 감소연산을 한번실행후

그럼 var1가 10에서 9가되구요 또 그 9와 +2를더해서 var1에다가 저장을합니다

그래서 var1이 9가되는거고 var2가 11이되는겁니다

profile_image 익명 작성일 -

 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이 되는 거구요..

 

증감연산자가 은근 헷갈립니다.

profile_image 익명 작성일 -

답변해드리겠습니다.

일단 이거는 아시나요??

a++ : 선연산 후증가

++a : 선증가 후연산

a-- : 선연산 후감소

--a : 선감소 후연산

 

저도 처음에는 이것이 이해가 잘 가지 않았죠.

그런데 나중에 for문 배울때 그때 알았습니다.;;ㄷㄷ

아직은 안 배우셨을 겁니다....

음...

일단

 


 

 

결과가 이렇게 뜨죠.

 

일단 val1--는 "선연산 후감소" 입니다.

 

설명은 일단 쉽게 이해하시는 쪽으로 설명하겠습니다.

자세한건 다음에도 나오니 아마 알 수 있으실 겁니다.

 

처음에 일단 변수 지정을 해주죠??

그때 val1읽고 val2읽고...

그런데 딱 val2를 읽으니 val1--가 있습니다.

질문자님께서 그렇게 생각하신 것은 아마 윗줄에서 아랫줄로 가다보면 아랫줄(변수지정)은 윗줄에 영향을 주지 않을거라고 생각하셔서 그런 걸겁니다.

 

하지만 val1은 변수입니다. 변할 수 있는 수이죠.

윗줄이 아닌 아랫줄에서도 윗줄(변수)를 수정한다면 수정이 가능합니다.

(아직 선연산 후감소 기억하시죠?)

그러니 일단 val2를 연산하면 (아직 감소는 하지 않았습니다.) val1+2는 12

그리고 후 감소니 val1(10)-1은 9

그리고 val1을 출력하면 9

val2를 출력하면 12

그러므로 저 결과가 나옵니다.

이해 가시나요????

 

이해 가시면 좋겠네요.^^

이상~

 

profile_image 익명 작성일 -

     int val1=10;
     int val2=(val1--)+2;

결과 val1=9       val2=12

 

     int val1=10;
     int val2=(--val1)+2;

결과 val1=9       val2=11

 

* 비교하셔서 이해하시면 더 도움이 되실 것 같네요.^^

val=9가 되는 이유는 --val,val-- 자체가 val1에서 값을 감소시킨 후 계산된다고 이해하시면 됩니다.^^

C언어 증가 감소 연산자 질문이요

안녕하세요 지금 C언어 초보자인데요 연산자를... 1 printf("선 연산 후 증가 : %d \n",val1++); 2 printf... 이 행만 보면 아직 val1은 감소가 된게 아니죠? 행이 아직 안...

c언어 증가/감소 연산자 질문

... --a는 전치감소 연산자야 꿍꿍아 내가 유튜브 영상 찾아보면서 복습 해봤는데 애초에 sum=--a를 하면 a가 10이였으니까 a가 그행에서 바로 9가 되고, 9가 된...

c언어 증가 감소 연산자 중 질문

... 증가 감소 연산을 쉽게 이해시켜주세요 ㅠㅠ 답변해드리겠습니다. 일단... 질문자님께서 그렇게 생각하신 것은 아마 윗줄에서 아랫줄로 가다보면 아랫줄...

c언어 질문 증가,감소 연산자 부분

저가 c언어 독학하고잇는데 이해안가는부분이잇어서 증가 감소 연산자 부분인데요 머대충 { int a=3; printf... 40 질문하신거에 답이 벌써 나와있네요 위에 a1...

C언어 증가 감소 연산자 질문

... 이렇게 나오는걸 먼저배웠고 증가감소연산자는 2. int val1=10; int val2=10; printf("선연산 후 증가=%d\n",val1++); printf("다시한번 =%d"\n",val1); printf("선증가 후 연산...

c언어 증가, 감소 연산자

... 그 증가 감소 기준이 한 줄 뛰어쓰는게 아닌가요? 무슨 뜻인지 이해를 못했습니다. 정확하게 질문해주세요(몇 행에서 말씀하시는지) 전위 증가에서는 문장이 끝나기...

c언어 증가,감소 연산자

... 증가,감소 연산자에서 이해가 잘 안되더라구요.. #include <stdio.h> int main(void) { int val1=10; int val2=(val1--)+2; printf("val1 : %d \n", val1); printf("val2 : %d \n", val2); return 0; }...

c언어 증가 감소 연산자

... printf("선 연산 후 증가: %d \n",val1++); printf("다시... 제가 C언어 공부했을때도 전위연산, 후위연산이... 추가적인 질문 쪽지로 언제든 환영합니다...