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번씩 써보면서 암기하고 가려한다.

+ Recent posts