1. 연산자
연산자란 +, - , * , / , % 처럼 피연산자와 함께 사용되어서 계산 결과를 만들어내는 기호이다.
참고로 %는 나눗셈의 나머지를 의미한다. %는 주로 홀짝 구분에 제일 많이 사용된다.
연산자는 우선순위가 있다. 예를 들어, 덧셈은 왼쪽부터 하고, 곱셈이 섞여있으면 곱셈부터 한다.
우선순위에 따라서 먼저 계산 결과를 도출한다.
| 우선순위 | 연산자 | 의미 |
| 1 | ( ) , [ ] | 괄호, 대괄호 |
| 2 | ! , ~ , ++ , -- | Not연산자(true=0, false=1), 비트 not 연산자, 후위 증가, 후위 감소 |
| 3 | * , / , % | 곱셈, 나눗셈, 나눗셈 나머지 |
| 4 | + , - | 덧셈, 뺄셈 연산자 |
| 5 | << , >> , >>> | 비트 단위의 쉬프트 연산자 |
| 6 | < , <= , > , >= | 관계 연산자 |
| 7 | == , != | Equal, Not Equal(다르면 true값) |
| 8 | & | 비트단위의 논리연산자 |
| 9 | ^ | |
| 10 | | | |
| 11 | && | 논리곱 연산자(and) |
| 12 | || | 논리합 연산자(or) |
| 13 | ? : | 조건 |
| 14 | = , += , -= , *=, /= , %= , <<= , >>= , &= , ^= , ~= |
대입 / 할당 연산자 |
볼드처리 해놓은 것은 외우려고 한 것이다.
1) 비트 not 연산자?: 비트가 0이면 1로, 비트가 1이면 0으로 반환하는 연산자이다.
2) 쉬프트 연산자? : 2진수로 표현된 비트를 해당 방향으로 이동시키는 연산자이다.
예를 들어, 10 >> 2라면 10은 10진수로 표현된 것이고, 2는 10을 2진수로 변환한 값을 오른쪽으로 2칸만 이동시키는 것이다.
즉, 10칸인 경우 0000001010 → 0000000010. 즉, 10진수로 따지면 값이 4가 된다. 오른쪽으로 이동하면서 1 하나가 사라짐.
만약 10 << 2라면 0000001010 → 0000101000. 즉, 10진수로 따지면 값이 40이 된다.
산식으로 표현하면 x << n 은 x * 2^n 이 된다.
3) int 자료형끼리의 나눗셈은 그 결과도 int이다. float 자료형끼리의 나눗셈은 그 결과도 float임에 주의.
예를 들어, 5.0f / 2.0f = 2.5f. 즉, 실수 / 실수 = 실수 꼴로 출력된다.
4) 복합 대입 연산자? : 산술 연산과 대입 연산이 함께 계산되는 연산자. 계산 반복 시 자주 사용한다.
예를 들어, *= 는 곱셈 연산 후 대입된다. Mul *= 3; // Mul = mul * 3;' 과 똑같다.
5) 피드백 코드(Feed-back)?
int s = 0;
s = s + 10; // S += 10 과 같다.
int currentPlayerExp = 1234
void kill(int MonsterExp)
{
CurrentPlayerExp = CurrentPlayerExp + MonsterExp
return 0;
}
즉, 이전 값에 사칙연산을 적용하고 싶으면 피드백 코드를 사용한다. 어떤 산식을 적용할 때, 이전 변수 값에 그대로 적용하라는 것이다.
6) 증감 연산자
전치 증감 연산자 : ++Num, --Num (Num은 예시임) → 지금 당장 Num이 1이 증가한다.
후치 증감 연산자 : Num++ , Num-- → 다음 줄부터 Num이 1이 증가한다.
//Main.c
#include <stdio.h>
int main(void)
{
int Num = 3;
printf("%d", ++Num);
printf("%d", Num++);
printf("%d", Num--);
return 0;
}
결과값은 445가 된다.
세번째 printf("%d", Num--); 은 다음 라인에서부터 -1이 되므로 5가 출력이 된다. 다음 줄부터 printf() 함수 사용시 4로 세팅되어 있을 것이다.
7) 논리 연산자 : 피연산자를 참 혹은 거짓을 평가한 후에 논리 연산을 수행하는 것이다. 계산된 결과값도 참(1) 혹은 거짓(0)이다. 0은 Null과도 같다.
예를 들어
(1) 논리 곱 연산자(And) && : 둘다 참(True)여야 1이 된다.
(2) 논리 합 연산자(Or) || : 둘 중에 하나라도 거짓(False) 이면 0이 된다.
(3) 논리 반전 연산자 ! : True 값이라면 0으로 반전된다. 예를 들어, if(!isReady); : isReady가 false일 때 실행된다.
//main.c
#include <stdio.h>
int main(void)
{
int Num = 3;
printf("%d", 5 < X && X < 10); // printf("%d", 5 < X < 10); 으로 하지 않도록 주의.
return 0;
}
만약에 논리 연산자를 잘못 사용해서 printf("%d", 5 < X < 10); 이와 같이 사용하게 되면, 5 < X 에서 false값이 도출되어 0이 되고, 이후 0 < X < 10 을 비교 연산하여 True값이 도출되어 1의 결과값이 나오게 된다. 따라서 논리 곱 연산자를 잘 사용할 수 있어야 한다.
8) 형변환 연산자 : 자료형 A에서 자료형 B로 변환시켜주는 연산자이다. 명시적 형변환이라고도 부르는데, 예를 들어 정수끼리의 나눗셈 연산의 결과가 실수로 계산되게끔 하려면, (float)5 / 2; 와 같이 사용하게 된다.
9) 삼항 연산자(Ternary operator) : 피연산자로 세 개의 항을 갖는 연산자다. 조건문 if-else의 대용(? 연산자)으로도 가능하다.
예를 들어,
4 < 5 ? 0 : 1;
1 ? 0 : 1;
0;
이때 ? 연산자 앞은 조건, 그 다음에 오는 값은 참일 경우의 값, : 다음에 오는 값은 거짓일 경우의 값이다.
첫번째 4< 5 ? 0 : 1; 은, 4<5가 참이면 0, 거짓이면 1을 도출하라는 의미이다. 즉 조건문 대신 사용할 수 있다.
if-else 조건문을 한 줄의 코드로 직관적으로 만들고 싶을 때 사용할 수 있다.
2. sizeof() 함수
단항 피연산자를 가지며, 피연산자의 자료형 크기를 바이트 단위로 반환한다.
예를 들어 char는 1, int는 4가 도출된다.
3. if문(조건문)
조건식 안의 값이 True이면 명령어가 수행된다. 조건문에서 ; 세미콜론 안달도록 주의!
1) 단순 if문
#include <stdio.h>
int main(void)
{
int Num = 102; // int 자료형 변수 Num에 102를 대입한다.
if (Num < 102) // 조건식을 계산한다. 참이면 true값이고 명령문을 실행한다.
{
printf("Num < 102"); // 명령문 실행
}
return 0;
}
2) if-else문
조건식이 참 혹은 거짓, 모든 경우를 처리할 수 있다. else문 단독으로 쓸 수는 없다.
간단한 if-else문은 삼항 연산자로 대체 가능하다.
#include <stdio.h>
int main(void)
{
int Num = 102;
if (Num < 105) //세미콜론 안 붙이게 주의
{
printf("Num < 105");
}
else
{
printf("105 <= Num");
}
return 0;
}
3) if-else if- else문.
조건식을 여러개 쓰고 싶을 경우에 사용한다.
if문을 연달아 쓰는 것과는 다르다. if문이 여러개 나오면 따로따로 조건을 체크하는 것 뿐으로 여러개의 값이 도출된다.
#include <stdio.h>
int main(void)
{
if(Num < 105)
{
printf("Num < 105");
}
else if (Num < 110)
{
printf("105 <= Num && Num < 110"); // 비교 연산자 두개 쓸 때 왼쪽처럼 정렬해서 쓰는 습관들이기
}
else
{
printf("110 <= Num");
}
return 0;
}
4) if if-else문
#include <stdio.h>
int main(void)
{
int Num = 102;
if (Num < 105)
{
printf("Num < 105\n"); // \n이 들어가면 개행(줄바꿈)한다. \n이 "" 안에 들어간다. if문이 하나 더 들어가서 구분짓기 위함.
}
if (Num < 110)
{
printf("Num < 110");
}
else
{
printf("110 <= Num");
}
return 0;
}
조건식이 달린 if문이 두개이므로 두개의 결과값이 도출된다.
"Num < 105"
"Num < 110"
이 도출된다.
5) 중첩 if문(Nested-if statement)
if 안에 if가 들어가있는 경우.
앞의 조건문이 참 값이어야 다음 if 조건식을 확인한다.
소스코드 작성할 때 {} 중괄호 잘 쓰게 연습하자.
#include <stdio.h>
int main(void)
{
int Num = 102;
if (Num < 105)
{
printf("Num < 105\n");
if (102 < Num)
{
printf("102 < Num && Num < 105");
}
else
{
printf("Num <= 102");
}
}
return 0;
}
6) switch-case문
#include <stdio.h>
int main(void)
{
int Num = 101;
switch (Num)
{
case 100:
printf("Num == 100");
break;
case 101: //고의적으로 case 내부에 break 구문을 적지 않는 경우(intentional-Fallthrough)
case 102: //case 101: 에서 break 없었으므로 Num == 101인 경우 그 다음 명령어까지 모두 실행한다
printf("Num == 101 || Num == 102");
break;
default
print("default");
break; //누락 유의!!!!
}
return 0;
}
Num이 어떤 경우에도 속하지 않는 경우 default로 가게 된다. break는 case간 구분을 위해 사용하는 것. 누락에 항상 유의하자!
break가 없으면 앞에 조건이 만족되게 되면 다음 조건까지 넘어가서 수행하게 된다(Intentional-Fallthrough). 일부러 생략한 경우 항상 주석을 달아줘야 다른 사람이 볼 때 오해하지 않는다. 조심조심.
7) While문
#include <stdio.h>
int main(void)
{
int i = 1;
while (i<5) //while문을 실행. 조건식 계산 결과 true이면 중괄호 안쪽을 실행한다
{
printf("%d ", i);
++i; //증감식. i를 하나씩 증가시켜 조건식이 false가 될때까지 반복한다
}
return 0;
}
(while문 사용 연습)
while문을 사용해서 누적합을 구하는 소스코드를 작성해보는 연습.
키보드로 값을 입력해서 Sum 값을 구해보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int input;
int i = 0; //누적합을 구하기 위해서 이므로 초기값을 0으로 잡는다. 0은 누적합에 영향이 없기 때문. 누적곱이면 1을 초기값으로 한다.
while (i<5)
{
scanf("%d", &input); //&input. &은 at. input이라는 변수의 주소를 의미.
Sum = Sum + input;
++i;
}
printf("%d", Sum);
return 0;
}
이처럼 while문을 이용해서 코드를 간략하게 작성할 수 있다.
최대값은 int_max, 최소값은 int_min을 활용할 수 있다.
8) for문
for(초기식; 조건식; 증감식;)의 형태로 사용한다.
#include <stdio.h>
int main(void)
{
int i; //int 자료형에 변수 i 선언. 이후에 꼭 i에 값을 대입해야함
for(i=1; i<5; ++i) //while문 쓰는 대신에 for문으로 한줄에 쓰겠다는 마인드. 초기식; 조건식; 증감식;
{ //중괄호 끝 도달하면 ++i 실행해라. 실행한 후에 다시 조건식(for문) 처음으로 돌아간다
printf("%d ", i);
}
return 0;
}
for문 안 증감식을 계속 실행하다가 조건식 i<5 가 false값이 도출되면 ++i를 실행하지 않고 조건식을 끝낸다.
최대값을 입력하고 구해보는 연습.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <limits.h> //최소값, 최대값 구하고 싶으면 이거
int main(void)
{
int Min = int_Min;
int i;
int input;
for (i=0; i<5; ++i)
{
scanf("%d", &input);
if (input < Min)
{
Min = input;
}
}
printf("%d", Min);
return 0;
}
9) do-while문
do는 실행. while은 조건. 즉, 조건식이 true이면 do를 반복한다. 조건식이 false이면 실행이 종료된다. 대부분 for문을 사용하기 때문에 가끔 사용한다.
#include <stdio.h>
int main(void)
{
int i = 0, Boom = 5; // 처음 I = 0 에서는 do 를 실행한다. Boom이라는 변수는 5로 정의.
do
{
printf("%d...\n", i); //…하고 \n. 한 줄 내려가라는 의미이다.
++i; //증감식
} while (i < Boom); // 아까 Boom = 5라고 정의했음.
printf("BOOM!!!");
return 0;
}
10) 무한 반복문
for문보다 while문으로 구현하는 경우가 많다. for문은 가독성이 좀 떨어지기 때문이다.
break : 무한하게 반복하는 것을 막기 위해 조건문에 함께 break를 걸어 반복을 멈추게 한다.
continue : 반복문에서 continue를 만나면 해당 회차는 건너뛰고 다음 회차를 진행한다. intentional-fallthrough와는 다름. 반복문을 탈출하는 것이 아니라 특정 순회번째를 무시하고 싶기 때문에 사용하는 것이다. 예를 들어 i=5를 무시하고 i=6으로 넘어가게 할 수 있다.
#include <stdio.h>
int main(void)
{
int i = 0;
while (i) //i라는 변수에 대한 while문
{
if(i % 2 == 1) //조건식 1. i가 홀수라면,
{
++i; //i에 1을 추가하고,
continue; //i가 홀수라면 i에 1을 추가하고 넘어가시오. 즉 i가 홀수일 경우 printf() 실행안함
}
if(5 >= i) // 5 >= i를 만족하면 true값.
{
break; //이 break는 속해있는 조건문만 탈출시켜준다. 즉, i가 5가 되면 반복을 중단한다.
}
}
printf("%d ", i); i를 "%d " 형식으로 출력한다. 위의 조건문으로 인해 i가 짝수인 경우에만 출력된다.
return 0;
}
11) 이중 반복문
나중에 복잡해지면 머리 아플 것 같은 조건문. 그럼에도 잘 숙지해야 하는 것이 있다면,
(1) 줄의 개수를 파악하고 줄 번호를 매기자(i) : 세로칸 개수
(2) 각 줄의 칸 개수를 파악하고 칸 번호를 매기자(j) : 가로칸 개수
(3) 각 칸의 출력을 적기.
#include <stdio.h>
int main(void)
{
int i, j, k;
for (i=1; i<=3; ++i) //i는 1, 2, 3
{
for (j=1; j<3; ++j) //j는 1, 2.
{
printf(" ");
}
for (k=1; k<=i; ++k) //k는 조건식이 참일 때 *로 채운다
{
printf("*");
}
printf("\n"); //앞의 조건식을 모두 수행하면 개행(줄바꿈)한다
}
return 0;
}
조건식은 당연히 많이 써야되고 익숙해져야 할 것 같다.
오늘도 5번씩 써보면서 암기하고 가려한다.
'게임 프로그래밍 공부 > 게임 개발을 위한 C++' 카테고리의 다른 글
| [C++학습] 3. Class 개념, 객체지향 프로그래밍 (0) | 2026.05.02 |
|---|---|
| [C++학습] 2. 포인터와 레퍼런스~클래스 (0) | 2026.05.01 |
| [C++학습] 1. 배열 함수, 조건문 작성 (0) | 2026.04.30 |
| [C언어] 3. 배열~함수 (0) | 2026.04.28 |
| [C언어] 1. 기본 ~ scanf()함수 (0) | 2026.04.25 |
