[CodeEater와 제로부터 시작하는 C언어] 6장 - 연산자

프로그래밍은 기초에는 수학을 계산하기 위해서 나온 장치이다.
그래서 영어로도 컴퓨터(Computer: 계산하는 것)일 것이다.
그렇기 때문에 우리는 이제 연산자라는것을 무조건 알아야할 필요가 있다.

수학을 배웠으면 연산자에 대해서 어느정도 알것이다.
그런데 저번에 말했던것과 마찬가지로 수학의 연산자와 프로그래밍의 연산자는 조금은 다르다.
여러분이 취해야할 스탠스는
수학과 프로그램의 연산자는 기본적으로는 같지만 차이가 있다
라고 보면 된다.

연산자는 크게보면 세가지로 나뉜다.
단항, 이항, 삼항 연산자 이다.

당연하다고 생각할 수 있다.
C언어에서는 각 연산자가 단항인지 다항인지는 그리 중요하지는 않다.
C++에서는 연산자 오버로딩 때문에 꽤 중요해지지만 말이다.
이제 연산자에 대해서 하나씩 알아보도록 하자.

부호 연산자(+, -) - 단항 연산자, 수의 부호를 결정
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
int a = 10;
printf("%d\n", +a);
printf("%d\n", -a);
printf("%d\n", -(-a));
return 0;
}

부호 연산자는 숫자의 부호를 결정한다.
당연한 이야기이지만 일반적으로 +부호는 큰 의미는 없다.
만약 음수 부호를 두번 하고 싶다면 수학 수식처럼 괄호를 감싸줘야한다.
양수 부호는 실제로는 거의? 아예? 쓰이지 않는다고 보면된다.

산술 연산자(- , +, *, /, %) - 이항 연산자, 사칙 연산을 담당
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
int a = 10;
int b = 3;
int sum = a + b;
int sub = a - b;
int mul = a * b;
int div = a / b;
int rem = a % b;
printf("%d + %d = %d\n", a, b, sum);
printf("%d - %d = %d\n", a, b, sub);
printf("%d * %d = %d\n", a, b, mul);
printf("%d / %d = %d\n", a, b, div);
printf("%d %% %d = %d\n", a, b, rem);
return 0;
}
사칙연산자는 우리가 아는 그 사칙 연산자 맞다.
다만 곱하기와 나누기는 ×와 ÷가 아닌 *와 /이다.
이 기호를 각각 애스터리스크(Asterisk)와 슬래시(Slash)라고 부른다.
sum은 더하기, sub은 빼기, mul은 곱하기, div는 나누기를 하는 변수이다.
그러면 결과를 보도록 하자.

결과를 보면 알겠지만 하나가 예상대로 되지 않았다.
바로 나누기이다.
원래라면 3.333333이 되야하겠지만 그렇게 되지 않았다.
이제 여러분은 여기에 대해서 익숙해져야한다.
그 이유에 대해서 설명하기 전에 이야기를 하자면
쉽게 이야기해서 일반적인 나누기는
결과적으로 초등학생때 쓰는 나누기 연산이라고 생각하면된다.
초등학교때 나누면 몫과 나머지를 남기는 나누기 연산을 한다.
컴퓨터의 int끼리 연산도 결과적으로는 그렇게 된다는 것이다.
그리고 나머지를 알 수 있는 연산까지 제공되어 있다.
%기호의 연산자이다, 이를 mod연산이라고 많이들 부른다.
이 연산을 시행하면 결과를 나눈 나머지 값을 얻을 수 있다.
그럼 여러분이 원하는게
3.3333이라고 하고 그 결과를 출력하고 싶다면 어디를 손봐야하는지 알려주겠다.

일단 %d도 정수형, div역시 정수형이다.
그렇기 때문에 설사 값이 실수로 나왔다고 할지라도 정수로 나올 수 밖에 없다.
출력을 실수형으로 해야하니 우리는 이를 실수형으로 바꿔준다.
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
int a = 10;
int b = 3;
int sum = a + b;
int sub = a - b;
int mul = a * b;
float div = a / b;
printf("%d + %d = %d\n", a, b, sum);
printf("%d - %d = %d\n", a, b, sub);
printf("%d * %d = %d\n", a, b, mul);
printf("%d / %d = %f\n", a, b, div);
return 0;
}
div를 float으로 바꿔줘서 실수를 담을 수 있는 변수로 바꿨다.
출력 포맷을 float을 출력가능한 %f로 바꾸었다.

하지만 출력해도 값이 그대로 3인것을 확인할 수 있다.
그 이유를 아는 것은 여러분이 프로그래밍을 하는데 아주 중요하다.

정수와 정수의 연산 결과는 반드시 정수로 나온다.
a와 b는 정수이기 때문에 a와 b의 연산결과는 정수가 되고
따라서 div의 값은 이미 정수화된 a/b를 float으로 바꿀 뿐이다.
3을 float으로 바꿔봤자 3.000000이 될것임은 자명하다.
왜냐하면 실수 3도 당연히 존재할거 아닌가.
그래서 a/b는 정수와 정수의 연산이 아닌 다른 형태끼리의 연산이 필요해지게 된다.
그러면 두가지의 경우의 수가 생긴다.
정수와 실수의 연산, 실수와 실수의 연산이다.
사실 궁금하긴 할것이다. 실수와 실수의 연산은 당연히 실수다.
실수와 정수의 연산은 어떻게 되는 것인가?
그리고 이를 유도하려면 어떻게 해야하는가?
실수와 정수의 연산의 결과는 실수가 된다.
따라서 a / b에서 한쪽이 실수이면 이 문제는 간단하게 해결된다.
문제는 a나 b 둘중하나를 어떻게 하면 실수를 바꿀 수 있느냐인데...
다행이도 C언어에서는 이를 지원해준다.
바로 캐스팅 연산자 이다.

캐스팅 연산자((char), (int), (byte), ...) - 단항 연산자, 데이터 타입을 바꿈
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
int a = 10;
int b = 3;
int sum = a + b;
int sub = a - b;
int mul = a * b;
float div = (float)a / b;
printf("%d + %d = %d\n", a, b, sum);
printf("%d - %d = %d\n", a, b, sub);
printf("%d * %d = %d\n", a, b, mul);
printf("%d / %d = %f\n", a, b, div);
return 0;
}
캐스팅 연산자는 강제로 타입을 바꿔버린다.
항상... 강제라는 것에 주의해야하지만 지금은 고민할 필요 없다.
캐스팅 연산자는 현재 사용할 수 있는 어떠한 타입도 다 가져다가 사용할 수 있다.
이를 변수 앞에 붙혀주면 강제로 타입이 변형된다.
위의 경우 a는 int지만 float으로 강제로 바꾸었다.
이제 a/b는 더이상 정수, 정수의 연산이 아니라 실수와 정수의 연산이다.
따라서 결과는 float이 된다.

드디어 우리가 원하는 값을 얻을 수 있게 되었다.
다른 타입 끼리의 변환과 거기에 대한 이해는 조금 내용이 많다.
그래서 부록으로 언급할 테니 여기서는 여기까지만 다루도록 하겠다.

비트 연산자(&, |, ^, <<, >>, ~) - 대체적으로 이항 연산자, 비트 단위로 연산을 함, 단 ~는 유일한 단항 연산자
비트 연산자는 당연하지만 비트단위로 연산을 해주는 연산자이다.
비트에 대한 이야기는 4-1장 부록 변수는 어떻게 표현되는가에 상세하게 설명되어 있다.
그렇기 때문에 비트에 대한 이야기는 설명을 생략하고 각각의 연산자들에 대해서 알아보자.
하지만 이 마저도 상세한 설명은 하지 않겠다.
여기서는 대충 설명을 듣고 이러이러하구나 정도로만 이해해도된다.
아직 쓸일도 없을 뿐더러 추후 11장에서 비트에 대해서 상세히 설명하도록 하겠다.
& - AND연산을 비트 단위로 시행한다.
| = OR연산을 비트 단위로 시행한다.
^ = XOR연산을 비트 단위로 시행한다.
<< = 비트를 왼쪽으로 한칸씩 민다(Left Shift). 새로운 칸에는 0을 채운다.
>> = 비트를 오른쪽으로 한칸씩 민다(Right Shift). 새로운 칸에는 0을 채운다.
~ = NOT연산을 비트 단위로 시행한다. 결과적으로 보수가 된다.
코드 보기↓
#include <stdio.h>
#pragma warning(disable:4996)
void bin(char n, int cnt);
int main() {
unsigned char a = 0b00101011;
unsigned char b = 0b00011010;
int c = 1;
printf("a : ");
bin(a, 1);
printf("\n");
printf("b : ");
bin(b, 1);
printf("\n\n");
printf("a & b : ");
bin(a & b, 1);
printf("\n");
printf("a | b : ");
bin(a | b, 1);
printf("\n");
printf("a ^ b : ");
bin(a ^ b, 1);
printf("\n");
printf("a << c : ");
bin(a << c, 1);
printf("\n");
printf("a >> c : ");
bin(a >> c, 1);
printf("\n");
printf("~a : ");
bin(~a, 1);
printf("\n");
return 0;
}
void bin(unsigned char n, int cnt) {
if (n == 1) {
printf("%d", n);
if (cnt % 4 == 1) {
printf(",");
}
}
else if (n > 1) {
bin(n / 2, cnt + 1);
printf("%d", n % 2);
if (cnt % 4 == 1 && cnt != 1) {
printf(",");
}
}
}
상세한 코드는 아주 길다.
그리고 함수를 알아야 이해할 수 있다.
따라서 중요한 개념적인 부분만 보자.
상세하게 보고 싶다면 위에 접은 글을 봐주기를 바란다.
int main() {
unsigned char a = 0b00101011;
unsigned char b = 0b00011010;
int c = 1;
printf("a : ");
bin(a, 1);
printf("\n");
printf("b : ");
bin(b, 1);
printf("\n\n");
printf("a & b : ");
bin(a & b, 1);
printf("\n");
printf("a | b : ");
bin(a | b, 1);
printf("\n");
printf("a ^ b : ");
bin(a ^ b, 1);
printf("\n");
printf("a << c : ");
bin(a << c, 1);
printf("\n");
printf("a >> c : ");
bin(a >> c, 1);
printf("\n");
printf("~a : ");
bin(~a, 1);
printf("\n");
return 0;
}
지금은 상세한 설명대신 결과만 보도록하자.

결과에 대한 상세한 피드백을 해주려면 내용이 길다.
그래서 11장에서 다시 언급하도록 하겠다.

대입 연산자(=, +=, -=, /=, *=, %=, &=, |=, ^=, <<=, >>=) - 이항 연산자, 값에 대입하는 연산자
꽤나 여러 종류의 연산자가 있는게 대입 연산자이다.
그 이유는 일반적인 대입연산자와 산술연산이 포함된 대입연산자가 존재하기 때문이다.
비트 연산이 없는 대입 연산자 들만 보도록하자.
비트 연산이 포함된 대입 연산자들인 11장에서 다시 이야기하도록 하겠다.
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
int a;
a = 10;
printf("= 10 결과 : %d\n", a);
a += 3;
printf("+= 3 결과 : %d\n", a);
a -= 2;
printf("-= 2 결과 : %d\n", a);
a *= 4;
printf("*= 4 결과 : %d\n", a);
a /= 2;
printf("/= 2 결과 : %d\n", a);
a %= 7;
printf("%%= 7 결과 : %d\n", a);
return 0;
}
대입 연산자에서 =은 아주 많이 봐왔다.
그래서 설명이 필요없다.
10을 대입한다는 뜻이지 않겠는가?
그런데 =앞에 사칙연산이 붙어있는 경우가 있다.
이 대입 연산자들의 결과를 보도록 하자.

결과를 보면 똑똑한 우리 여러분들은 충분히 이해할 수 있다.
<a> += <b> : <a>=<a>+<b>와 같다
<a> -= <b> : <a>=<a>-<b>와 같다
<a> *= <b> : <a>=<a>*<b>와 같다
<a> /= <b> : <a>=<a>/<b>와 같다
<a> %= <b> : <a>=<a>%<b>와 같다
그런데 왜 이런게 가능할까?
A = A + B는 사실 수학적으로 성립하지 않는 식이다.
하지만 수학의 =과 동일하게 생각하면 문제가 있다.
수학의 =는 좌변과 우변이 같다는 뜻이다.
그러나 프로그래밍의 =는 좌변에 우변을 대입해라는 뜻이다.
그래서 a = a + b라는 구문이 존재한다면,
면저 a + b라는 구문을 시행한다.
그 다음 a에 a+b의 값을 넣게 되는 것이다.
이걸 더 간편히 표현한게 a += b라는 구문이다.

증감 연산자(++(data), --(data), (data)++, (data)--) - 단항 연산자, 값을 1만큼을 변동 시킨다.
이 연산자는 다른 대입 연산자와 궤를 같이한다.
쉽게 이야기해서 값을 1을 변동시키는 연산자이다.
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
int a = 10;
a++;
printf("a++ : %d\n", a);
++a;
printf("++a : %d\n", a);
a--;
printf("a-- : %d\n", a);
--a;
printf("--a : %d\n", a);
return 0;
}
증감 연산자는 값을 1씩 증가시켜서 값을 아예 저장하게 된다.
a++과 ++a는 1을 증가시킨다.
a--와 --a는 1을 감소시킨다.

a++, ++a는 a = a + 1 혹은 a += 1과 동일하다.
a--, --a는 a = a - 1 혹은 a -= 1과 동일하다.
이런식으로 ++이나 --가 변수 앞에 적히는 형태를 전위 연산자라고 한다.
반대로 ++이나 --가 변수 뒤에 적히는 형태를 후위 연산자라고한다.
전위 연산자와 후위 연산자는 차이가 있다.
위의 예제에서는 차이를 확인할 수 없다. 조금 다른 예제에서는 확인이 가능하다.
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
int a, b, c, d;
a = b = c = d = 10;
printf("++a : %d\n", ++a);
printf("--b : %d\n", --b);
printf("c++ : %d\n", c++);
printf("d-- : %d\n", d--);
printf("c : %d\n", c);
printf("d : %d\n", d);
return 0;
}
코드에서는 a, b, c, d를 10으로 초기화 시켰다.
그 다음 a와 b는 전위 연산자이고, c와 d는 후위 연산자를 사용하였다.
코드를 실행하면 둘의 차이를 명백히 알 수 있다.

여기서 a와 b는 바로 값이 변동한걸 확인할 수 있다.
그런데 c와 d는 값이 바로 바뀌지 않고 다음 호출에 바뀐걸 알 수 있다.
그 이유는 전위 연산자는 그 즉시 값이 바뀌고
후위 연산자는 다음 호출 부터 값이 바뀌게 된다.
즉 c와 d는 값 변경 예약이라고 생각하면된다.
위의 코드를 알아먹기 쉽게 바꾸면 아래와 같다.
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
int a, b, c, d;
a = b = c = d = 10;
a += 1;
printf("++a : %d\n", a);
b -= 1;
printf("--b : %d\n", b);
printf("c++ : %d\n", c);
c += 1;
printf("d-- : %d\n", d);
d -= 1;
printf("c : %d\n", c);
printf("d : %d\n", d);
return 0;
}

논리 연산자(&&, ||, !) - &&와 ||는 이항 연산자, 결과가 논리값으로 출력, 단 !는 단항 연산자
논리 연산자는 저번에 말했던 진리값과 관련이 있다.
진리 값에 대한 이야기는 4-1장 부록, 변수는 어떻게 표현되는가에서 언급했었다.
일단 진리값과 논리 연산에 대해서 짤막하게 언급하겠다.
AND연산 - C언어에서는 &&로 표현됨, 두 조건이 모두 참이어야 참이된다.
ex) 밥을 많이 먹고 일찍 자면 키가 큰다. 여기서 밥만 많이먹으면 돼지가 되고, 일찍 자기만하면 멸치가 된다. 따라서 키가 크려면 밥을 많이 먹는 조건도 참이고 일찍 자야되는 조건도 참이어야 한다.
OR연산 - C언어에서는 ||로 표현됨, 두 조건 중 하나라도 참이면 참이된다.
ex) 잘생기거나 돈이 많으면 여자친구가 생긴다. 여기서 잘생기지 않아도 돈이 많으면 여자친구가 생기고, 돈이 없어도 잘생기면 여자친구가 생긴다. 그래서 난 여자친구가 없다.
NOT연산 - C언어에서는 !로 표현됨, 단항 연산자이며 진리값을 반대로 바꾼다.
#include <stdio.h>
#include <stdbool.h>
#pragma warning(disable:4996)
int main() {
bool hasGirlFriend = false;
bool hasMoney, isHandsome;
printf("1이면 여자친구 있는 거임\n0이면 없음\n\n");
hasMoney = true;
isHandsome = false;
hasGirlFriend = hasMoney || isHandsome;
printf("돈이 있지만 못생길 경우 : %d\n",hasGirlFriend);
hasMoney = false;
isHandsome = true;
hasGirlFriend = hasMoney || isHandsome;
printf("잘생겼지만 돈이 없는 경우 : %d\n", hasGirlFriend);
hasMoney = false;
isHandsome = false;
hasGirlFriend = hasMoney || isHandsome;
printf("못생기고 돈이 없는 경우 : %d\n", hasGirlFriend);
return 0;
}
코드를 보면 bool을 사용하기 위해서 stdbool.h를 가져온것을 볼 수 있다.
bool값은 화면에 출력하면 true, false로 출력되지 않고 1, 0으로 출력된다.
즉 1이면 true고 0이면 false이다.
위의 예제는 or연산자를 사용한 예제이다.

보다시피 정직한 결과를 얻을 수 있다.
and와 or은 이항 연산자로 두 조건이 모두 참인걸 확인하고 싶다면 and를,
두 연산자중 하나만 참인걸 알고 싶다면 or을 사용하면 된다.
#include <stdio.h>
#include <stdbool.h>
#pragma warning(disable:4996)
int main() {
bool b = true;
int num = 10;
printf("bool을 뒤집었을 경우 : %d\n", !b);
printf("int를 뒤집었을 경우 : %d\n", !num);
return 0;
}
위의 예제는 !연산자를 사용한 예제이다.
그런데 이 녀석은 조금 조심해서 사용해야하는데,
논리 연산자는 결과값이 항상 true와 false, 즉 1과 0으로 나온다.

C언어에서는 0을 제외한 모든 값을 참으로 간주한다.
따라서 10이라는 숫자도 참이라고 간주해서 !를 먹이면 0이 된다.

비교 연산자(==, !=, <=, >=, <, >) - 이항 연산자, 둘의 동등성을 비교
#include <stdio.h>
#include <stdbool.h>
#pragma warning(disable:4996)
int main() {
int a = 10;
int b = 10;
printf("a == b : %d\n", a == b);
printf("a != b : %d\n", a != b);
printf("a > b : %d\n",a>b);
printf("a >= b : %d\n", a >= b);
printf("a < b : %d\n", a < b);
printf("a <= b : %d\n", a <= b);
return 0;
}
아까 =는 대입 연산자라고 했었다.
그러면 비교를 하려면 다른 연산자를 사용해야한다.
바로 == 이다. 그 외의 다른 연산자는 여러분이 생각한 그대로의 효과를 가지고 있다.

결과를 보면 똑똑한 여러분은 이해할 수 있겠지만 그래도 다시 한번 이야기하도록 하자.
== - 양쪽의 값이 같으면 참이다. 다만 나중에 나올 문자열을 이 연산자로 비교하면 절대 안된다.
!= - 양쪽의 값이 다르면 참이다. 마찬가지로 나중에 나올 문자열을 이 연산자로 비교하면 절대 안된다.
> - 왼쪽이 오른쪽 보다 크면 참이다.
>= - 왼쪽이 오른쪽 보다 크거나 같으면 참이다.
< - 왼쪽이 오른쪽 보다 작으면 참이다.
<= - 왼쪽이 오른쪽 보다 작거나 같으면 참이다.
양변이 같은지, 작은지, 큰지를 비교할 수 있다.
다만 주의 해야할점은 아직까지 배우진 않았지만 문자열을 이 연산자로 비교하면안된다.
아직 문자열을 배우지 않았으므로 이렇게 짧막하게 이야기 하고 넘어가겠다.
이까지 보다 보면 알겠지만 사실 <와 >는 취향차이이다.
A>B로 쓰는 사람이 있고 B<A로 쓰는 사람이 있다.
그래서 코드를 보다보면 일관되게 하나로만 쓰는 사람이 많다.
그리고 A!=B라는 코드는 !(A==B)와 동일하다.
그래서 이 녀석도 취향을 좀 타는것 같다.

조건 연산자((<조건>? <조건이 참일 때>: <조건이 거짓일 때>)) - 삼항 연산자, 조건부로 데이터를 출력
데이터를 조건부로 출력할 수 있다. 즉 분기가 가능하다.
아주 중요한 연산자라고도 할 수 있지만 실전에서는 약간 취향차이로 등장한다.
그 이유는 아직은 이야기 안했지만 뒤에 이야기할 분기문이 있기 때문이다.
어쨋든 조건부로 데이터를 출력한다는건 아주 중요하다.
#include <stdio.h>
#include <stdbool.h>
#pragma warning(disable:4996)
int main() {
bool isSale = true;
int shoesPrice = 50;
printf("신발 가격 : %d\n", isSale ? shoesPrice / 2 : shoesPrice);
return 0;
}
가령 세일 중에는 신발을 50%가격으로 판다고 해보자.
그러면 위와 같은 코드를 짤 수 있을 것이다.
세일중이라면 25원이 될거고 아니면 50원으로 팔것이다.
위의 조건식에 의하면 isSale의 값이 true이면 shoePrice를 절반으로,
아니면 shoesPrice를 온전히 출력하게 할 것이다.

위에 신발 가격은 세일 중이므로 가격이 깎이게 된다.
과연 조건을 정말로 타는지는 isSale의 값을 바꾸면서 테스트해보자.

sizeof(<타입 혹은 변수 혹은 값>) - 단항연산자, 해당 피연산자가 시스템에서 몇 바이트인지 출력
#include <stdio.h>
int main() {
int a = 10;
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(10));
return 0;
}
C언어에서는 특정 변수 혹은 타입 혹은 값의 크기가 얼마인지 확인할 수 있는 변수가 있다.
바로 sizeof연산자이다.

해당 연산자는 타입으로 사용할 경우(sizeof(int)) 해당 타입이 시스템에서 몇 바이트인지 알려준다.
그리고 변수 이름이나 값으로 할 경우에도 해당 변수나 값이 현재 시스템에서 몇 바이트에
저장이 되고 있는지를 확인할 수 있다.
사실 이런 확인차 쓰는 용도보다 더 실용적으로 사용하는 상황이 있긴 하지만
이는 그 때가서 확인하도록 하자.

#include <stdio.h>
#include <stdbool.h>
#pragma warning(disable:4996)
int main() {
bool a, b, c, d, e, f;
a = b = c = d = e = f = 2;
printf("%d\n", a++ + b-- * c / (d + e));
return 0;
}
위와 같은 식이 있다고 가정해보자
과연 결과를 알 수 있을까?
처음 보는 사람은 이해를 못할 거다.
사실 복잡해지면 필자도 잘 모른다.
세세한 규칙이 있긴한데 필자도 다 모르기 때문에 아는것만 이야기하려고한다.
연산자 우선순위
1- 대부분의 단항 연산자
2 - *, /, %
3 - +, -
4 - 대부분의 이항 연산자
5 - 관계 연산자(부등호가 있는 식)
6 - 관계 연산자(부등호가 없는 식)
7 - 비트 연산자
8 - &&
9 - ||
10 - 삼항 연산자
11 - 대입 연산자
※ 같은 등급의 연산자는 왼쪽에서 오른쪽으로 우선순위가 결정된다. 그리고 괄호는 항상 우선순위가 앞선다. 그리고 대입 연산자와 삼항 연산자는 오른쪽에서 왼쪽으로 우선순위가 결정된다. 이건 단항 연산자들도 마찬가지
자세한 등급은 이 사이트를 참고해주면 자세히 나와있다.
사실 필자도 항상 외우고 다니는건 아니라서 경우에 따라서 애매해질때가 있다.
그래서 우선순위 애매하다고 싶으면 바로 괄호를 사용해주면된다.
설사 우선순위가 문법적으로 확실할지라도
경우에 따라서 괄호를 써주는게 사람들이 보기 좋을 때가 많다.
결론은 항상 우선순위를 외우는것보단
그냥 괄호 적당히 사용해서 관습적으로 쓰는것이 좋다는 것이다.
'제로부터 시작하는 프로그래밍 > C' 카테고리의 다른 글
[CodeEater와 제로부터 시작하는 C언어] 7장 - 진리값과 부울대수 (0) | 2020.04.13 |
---|---|
[CodeEater와 제로부터 시작하는 C언어] 6.1장 - 자료형끼리의 연산 (0) | 2020.04.13 |
[CodeEater와 제로부터 시작하는 C언어] 5.1장 - scanf (0) | 2019.12.03 |
[CodeEater와 제로부터 시작하는 C언어] 5장 - 입력과 출력 (0) | 2019.12.01 |
[CodeEater와 제로부터 시작하는 C언어] 4.2장 - 서식 지정자 (0) | 2019.11.30 |