boj 2869번 문제를 통해 알게된 코드에서의 ( )을 통한 우선순위 두기.

처음에 

#include <bits/stdc++.h>
using namespace std;

int a, b, v;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>a>>b>>v;
    cout<<v-a<<'\n';
    cout<<a-b<<'\n';
    cout<<v-a/a-b<<'\n';
    cout<<(v-a/a-b)+1<<'\n';
}

이런 코드를 작성하였을때, 입력값을 5 ,1 , 6으로 주었을때,

각각의 출력값을 일렬로 나열해보면,

 

형태로 

v-a==1

a-b==4

v-a/a-b == 4

(v-a/a-b)+1 ==5 형태로 값이 나와서

왜 1/4을 했을때의 값이 4가 나올까, int로 정의된 수들 끼리의 연산이니까 나누면 몫이 0이니까

v-a/a-b==0으로 나와야 하는데 왜이럴까 싶어서, 오랜시간을 고민했는데, 

 

#include <bits/stdc++.h>
using namespace std;

int a, b, v;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>a>>b>>v;
    cout<<v-a<<'\n';
    cout<<a-b<<'\n';
    cout<<(v-a)/(a-b)<<'\n';
    cout<<(v-a)/(a-b)+1<<'\n';
}

이렇게 처음처럼 v-a/a-b 형태가 아니라, (v-a)/(a-b)형태로 작성하니까 내가 원하는 의도대로 코드가 순서에 맞게 실행되었다.

결국에 단순하게 내가 보기에 이해가 되는 순서대로 작성한것 뿐이고, 컴퓨터가 이해하는데 있어서는

-a/a를 먼저 계산해주어서 6-1-1 ==4 가 된것이다. 

그냥 수를 손으로 써서 계산하는거였으면 

v-a

----------

a-b             

형태로 위아래로 구분지어 있어서 내가 눈으로 보기에는 그냥 정상적으로 작성했구나 생각했던건데, 

이렇게 작성하면 문제가 있는 형태의 코드작성이었던 것이다. 

 

앞으로는 확실하게 +와 -와 *, /가 섞여있는 연산의 경우, 코드의 실행 순서에 대해서 확실하게 이해하고, + , - 가 먼저 실행되어야 하는 경우 ( ) 을 확실하게 쳐주어서 코드가 실행되어야 하는 순서를 명확하게 구분지어 주도록 하자. 

 

  Comments,     Trackbacks