티스토리 뷰




문자열 출력 함수 printf


printf 함수


printf는 C의 표준 출력 함수 중에서 가장 많이 사용하는 함수이다. printf의 뒤에 있는 f는 formatting의 약자이며,

형식화된 문자열을 출력할 수 있다.


printf 함수를 사용하는 방법


% 서식 지정 키워드를 사용하여 변수 값을 일정한 형식으로 출력할 수 있다.

       



printf 함수


%c는 변수가 가지고 있는 값을 아스키 표에 대응하는 문자로 출력한다.

     

#include <stdio.h>


int main (void){

char data = 65;

printf("%c의 아스키 코드 표에서 해당되는 정수는 %d \n", data, data);

return 0;

}



     

실수와 정수는 숫자를 표현하는 방식이 다르다. (정수는 %d를 사용, 실수는 %f를 사용)

float value =2.1f //그냥 2.1을 적으면 데이터 타입을 double으로 인식하기에 f를 적어 넣어 float임을 알려준다.

실수 데이터를 정수 표현 키워드인 %d로 출력하면 엉뚱한 값이 출력된다.


만약 실수 값을 정수로 표현하고 싶으면 (int) value로 데이터 타입 캐스트를 해주면된다. 형 변환을 해준다.

C언어는 반올림을 해주지 않고, 무조건 버림으로 출력된다.


#include <stdio.h>


int main (void){

float value = 2.1f;

printf("%d\n", (int)value);

return 0;

}




%d와 %u 에 대해서 알아보자. %d의 의미는 부호가 있는 정수 출력에 사용되는 키워드이고, %u는 unsigned로 부호가 없는 정수 출력에 사용되는 키워드이다. 이 두 키워드를 사용하면 내부적으로 정수(int)형으로 변환되기 때문에, char 데이터 변수 크기인 1바이트를 4바이트로 값을 변환해서 출력한다.

한 예시를 들면, 아래의 코드를 보자.



#include <stdio.h>


int main (void){

char data = -1;

printf("%d, %u \n", data, data);

return 0;

}


위의 코드를 출력하면 결과가 이상하게 나온다는 것을 알 수 있다. 
먼저 char은 1바이트를 사용한다. -1을 비트로 표현하면 


위의 그림과 같다. 우리가 정수를 표현하기 위해 사용하는 %d는 기본적으로 int 로 형변환 시켜서 출력을 해주는데,
이때 1바이트에서 4바이트로 확장이 된다. 그러면 1111 1111 1바이트에서 1111 1111 1111 1111 1111 1111 1111 1111 4바이트로 확장이 된다. 부호를 고려하는 키워드 %d에서는 -1로 출력되고, 그와 반대인 %u에서는 4294967295로 출력되는 것이다.

     

%o는 8진수, %x는 16진수 형태로 정수를 출력한다.


#include <stdio.h>


int main (void){

char data = 10;

printf("%o, %x \n", data, data);

return 0;

}




%e는 실수를 지수 형태로 출력한다.


#include <stdio.h>


int main (void){

double data = 3.5234577;

printf("%e \n", data);

return 0;

}



    

출력 칸 수 조절하기


         #include <stdio.h>


int main (void){

int data = 7;

printf("[%d], [%5d]\n", data, data);   //[] 자릿수 확인을 위해 사용함

return 0;

}




    오른족 정렬과 왼쪽 정렬


        #include <stdio.h>


int main (void){

int data = 7;

printf(" [%5d] [%05d] [%-5d] \n",data, data, data);

return 0;

}



        칸 수를 가지는 이유는 프로그래머가 자리수를 이용해 데이터를 좀더 직관적으로 보여줘 판단하라는 의미에 사용한다.


    실수의 소수점 자릿수 지정하기


        실수는 출력한 칸을 지정하는 것 외에도 마침표를 사용하여 소수점 이하 자릿수를 몇 자리까지 출력할 것인지를

   명시할 수 있다.


        #include <stdio.h>


int main (void){

double data = 3.141592;

printf("[%f] [%.4f] [%8.4f] [%-8.4f] \n", data,data,data,data);

return 0;

}


위의 결과를 확인하면, 뒤의 세개의 결과가 앞의 결과와 차이가 난다는 것을 알 수 있다. 바로 4째자리 이후부터

반올림이 되어 표현된다는 것이다. 실수형에서 표현하고자 하는 자릿수까지만 잘랐을 때, 숫자들이 버려지는 것이

아니라 반올림이 된다. 이것은 프로그램에서 엄청난 결과를 초래하게 된다.

printf함수에서 %자체를 출력하고 싶다면 %%라고 쓰면 된다.


#include <stdio.h>


int main (void){

printf("95%%\n");

return 0;

}



제어 코드 사용하기


아스키 표에는 소리를 내거나 콘솔의 출력과 입력의 현재 위치를 알려주는 캐럿(우리는 커서라고 알고 있는 것이 원래는 캐럿이다.) 위치를 변경할 수 있는 제어 코드가 있다.


제어 코드는 키보드에 있는 문자가 아니기 때문에 제어코드를 직접 입력할 수 없기 때문에 C언어는 \와 키워드로 제어코드를 사용할 수 있는 문법을 제공한다.




연산자


기본 연산자


대입 연산자


수학에서 '='는 같다라는 의미로 사용되지만, C언어에서 대입 연산자로 사용된다. 즉 변수에 값을 대입할 때 사용된다. 


int value = 15; // value 라는 변수에 15를 대입


또, 변수에 상수 값 또는 다른 변수 값을 대입할 때 사용될 수 있다.


int result ;

int num = 10;

result = num;


꼭 기억하자. 절대 '='는 위에 따르면 변수가 10라는 의미로 사용하지 않는다.

num이라는 변수에 10을 대입하자라는 의미이다.



산술 연산자


산술 연산자는 상수 또는 변수 값을 이용한 산술 연산에 이용되는 연산자이다.

연산자의 종류는 아래와 같다.

+ : 더하기                               

- : 빼기 연산자

* : 곱하기

/ : 나눗셈 결과 중에 몫

% : 나눗셈 결과 중에 나머지


증감 연산자



++ 증가 연산자 : 변수가 가지고 있는 값을 1 증가

-- 감소 연산자 : 변수가 가지고 있는 값을 1 감소

위의 두가지가 존재한다.


덧셈 연산자는 이항 연산자로, 두 개의 메모리가 연산에 사용된다. 


int num = 10;

num = 1 + num;


위의 코드에서 사용된 1도 메모리를 차지하고 있다. 그 이유는 상수가 메모리 영역에 따로 복사되어 있기 때문이다.

그래서 상수를 가져올때 메모리를 사용하게 된다. 그리고 num의 메모리까지 덧셈 연산을 할때, 두 개의 메모리가 사용된다.

반면 증감 연산자는 단항 연산자로써, 한 개의 메모리가 연산에 사용된다.


증감 연산자는 변수 앞, 뒤에 사용 가능 i++ (Postifix), ++i (Prefix)로 사용가능하다.

다른 연산자와 함께 연산되는 경우 결과 값이 달라질 수 있다.

전위형 : 먼저 증감한 뒤 연산

후위형 : 연산하고 난 뒤 값을 증감


#include <stdio.h>


int main (void){

int i = 3;

printf("i++ 의 값은 %d 이고, ++i 의 값은 %d이다\n", i++, ++i);

return 0;

}




관계 연산자


두 수치 값을 비교하여 그 결과 값을 참 또는 거짓으로 얻게 된다.

관계 연산의 결과값은 진리값

참 : 1, 거짓 : 0으로 처리한다.

진리 판단할 때, 0을 제외한 나머지 수들은 전부 참으로 판단한다.

== 연산자는 같다 라는 관계를 나타내는 연산자

!= 연산자는 같지 않다 다른 관계를 나타내는 연산자


논리 연산자


A와 B의 상황을 일정한 규칙으로 연결해주는 연산자

&&키워드 : 논리 연산자 AND, ||키워드는 : 논리 연산자 OR

!키워드 : 논리 연산자 NOT


연산자 우선 순위와 연산 방향


연산 방향


연산자 우선순위가 같은 연산자들에 대해서 먼저 연산할 순서를 정한다.

연산방향이라는 개념이 추가로 적용된 이유는 연산 방향에 따라 결과 값이 다르게 나올 수 있다.

연산 수식을 구성할 때 연산자의 우선순위와 연산 방향을 고려해야 한다.



        2 * (3 / 4)          --->           (2 * 3) / 4

        2 * 0              2 * 3 / 4        =   6 / 4

        0                    <---           =   1



조건문


    제어문


        프로그램의 실행 흐름을 제어하는 문법

        여러가지 조건에따라 기존에 정해 높은 형식과 다르게 추가 작업을 하거나 다른 형식으로 진행할 수 있도록 제공


    조건문(흐름의 분기)


        예외사항에 대처하기 위한 문법

        특정 조건을 부여하고 해당 조거능을 만족하면 지정한 문장을 수행

        조건은 수식으로 표현, 수식의 진릿값이 참이면 지정한 문장을 수행


반복문


반복하는 행위를 효과적으로 표현하기 위한 문법이다. C언어에서 총 3가지의 반복문을 제공하고 있다.

반복 조건을 부여하고 해당 조건을 만족하는 동안, 특정영역을 계속해서 반복하는 구조이다.


if 조건문의 구조


문법 구성이 간단하고 직관적인 표현을 사용

( ) 안의 조건 수식의 결과 값이 참으로 나오면 그 뒤 명시한 명령문 1개를 수행하는 문법

참은 0이 아닌 모든 값을 의미


if ~ else ~ 조건문

       

서로 반대되는 조건을 한 번에 표현하는 형식

조건 수식은 한 번만 수행

수행 속도가 좋아지고 프로그램 이해도도 더 좋아짐

단일 문장, 복합 문장 모두 사용 가능


조건 수식 연산자


if ~ else 조건문과 비슷한 형태를 가진 연산 수식

단일 문장으로 구성된 명령문만 사용 가능

명령을 처리하고 나면 결과 값을 반환

결과값 = (조건 수식) ? 수식 1: 수식2 (예시 http://jihoon6078.tistory.com/66)

전자가 조건 수식이 참일 때 사용되고, 후자가 조건 수식이 거짓일때 사용된다.


중첩된 if 조건문

        

조건 수식이 만족되어 실행하는 명령문안에 조건문이 또 포함되는 상황


int year = 2015, month =12, day = 31;

day++;


if(day > 31){

month++;

day = 1;

if(month > 12){

year++;

month = 1;

}

}


if문이 비효율적인 경우


C언어에서 모든 조건문은 if문으로 표현 가능하지만, 정해진 상수와 조건을 여러 번 비교하는 경우 비효율적이다.

그래서 else if 문을 사용한다.



switch 문에 대해서 공부


소스코드가 더 길다고 실행 동작이 느려지지 않음

예시 코드는 switch문이 연산이 더 작고 간결한 형식



반복문


반복문이란 지정한 작업을 반복해서 수행하는 문법이다.

반복문에 필요한 요소가 3가지가 존재하는데, 시작 조건, 조건 변화 수식, 종결 조건 이렇게 이루어져 있다. 


for 반복문의 기존 구조


for 반복문은 반복의 3요소를 제일 단순하고 정확하게 표현한 반복문이다.

반복문 중 가장 많이 사용되며 시작과 끝이 명확한 반복문에서 많이 사용된다.



for (시작 조건; 종결 조건; 조건 변화 수식) {


명령문;


}


for 반복문의 변형과 이해


for 반복문에서 반복의 3요소는 사용할 필요가 없는 경우 생략 가능이 가능하다. 


for 반복문으로 무한 루프 만들기


무한 반복문 (무한 루프) 무한히 반복하는 형태의 반복문


int sum = 0, num = 1;


for( ; ; ) {

sum += num;

num++;

}


시작 조건, 종결 조건, 조건 변화 수식 모두 사용하지 않으면 for 문은 무한 루프형태를 갖게 된다.


while 반복문의 기본 구조


while 문은 명령문을 반복하는 문법

종결 조건만 형식으로 가지고 시작 조건과 조건 변화 수식은 프로그래머가 적절하게 사용할 수 있는 문법

생각하고 행동하는 스타일


while ( 종결 조건 ) {

명령문 ;

}


while 문으로 무한 루프 만들기


while ( 1 ){

명령문;

}


종결 조건을 진릿값으로 참을 나타내는 1으로 하면 while문을 무한 루프로 만들 수 있다.



do ~ while 문


while문과 유사하지만 종결조건을 명령문을 수행한 후에 체크한다. 

종결 조건이 거짓인 상황에도 명령문을 적어도 한번은 수행

행동하고 생각하는 스타일


do 명령문 ; while (종결 조건)


do {

printf("%d * %d = %d \n", dan, num, dan*num);

num++;

} while(num < 10)





댓글