프로그래밍을 할 때 반복적인 행위를 하는 코드의 양을 줄이고, 효율적으로 명령하기 위해서 반복문을 이용한다.

C에서는 크게 다음과 같이 3개의 반목문을 제공하고 있다. while문, do~while문, for문

 

whule문은 특정 조건을 주고 그 조건을 만족하는 동안 특정 영역을 계속 반복하는 구조이다.

#include <stdio.h>

int main(void){
    int num = 0;

    while (num<5)
    {
        printf("hello world %d \n", num);
        num ++;
    }
    return 0;    
}

위 코드를 보면 변수 num의 크기가 5보다 작을 때 까지 while 밑의 중괄호 안의 코드를 계속 반복 수행하도록 하는 코드이다. 만약 위 코드에서 num ++; 라는 코드가 없다면 반복의 조건이 무너지지 않아서 반복이 멈추지 않는 무한 루프 현상이 발생한다. 반복문의 구성에 있어서 중요한 것 중 하나는 반복의 조건을 무너뜨리기 위한 최소한의 연산이다.

 

반복의 대상이 다음과 같이 하나의 문장이라면 중괄호는 생략하고 들여쓰기 만으로 표현할 수 있다.

while(num<5)
	printf("hello world %d\n", num++);

 

while문에 처음 진입하면 반복의 조건인 비교 연산을 진행하고 참일 경우 반복 영역을 실행후 다시 반복 조건 검사하는 곳으로 돌아온다. 조건이 성립하지 않을 경우(비교 연산 진행 결과 거짓일 경우) 반복문을 종료한다.

 

while문은 조건이 거짓이 되면 반복문을 종료한다. 다음과 같이 조건을 항상 참으로 만들어주면 의도적으로 무한루프 반복문을 만들 수있다.

while(1)
{
	int num = 0;
	printf("%d\n", num);
    num ++
}

1은 참을 의미하는 대표적인 숫자이므로 반복문의 조건은 항상 참이 된다.

 

while문은 while문 안에 여러번 중첩하여 사용할 수 있다.

'Language > C, C++' 카테고리의 다른 글

[C] for  (0) 2020.11.29
[C] do~while  (0) 2020.11.28
[C] 자료형 변환  (0) 2020.11.27
[C] const  (0) 2020.11.25
[C] 문자 표현  (0) 2020.11.25

char형으로 표현된 데이터의 표현방식을 int형으로 바꾸는 것 처럼 데이터의 표현 방식을 변환하는것을 자료형 변환 이라고 한다.

자료형 변환은 자동으로 발생하는 자동 형 변환과 프로그래머가 형 변환을 명시해서 강제로 변환이 일어나게 하는 강제 형 변환이 있다.

double num1 = 245;	// int형 정수 245를 double형으로 자동 형 변환 / 245.0
int num2 = 3.14		// double형 실수 3.14를 int형 정수로 자동 형 변환 / 3

위 코드와 같이 실수형 데이터를 정수형 데이터로 변환하는 과정에서는 소수부의 손실이 발생한다.

int형 정수 129를 char형 정수로 형 변환하는 경우에는 char형의 바이트 크기에 맞춰 상위 바이트를 소멸시킨다. 또한 이러한 과정으로 부호가 바뀔 수도 있다.

#include <stdio.h>

int main(void){
    double num1 = 234;
    int num2 = 3.14;
    int num3 = 129;
    char ch = num3;

    printf("int 245 to double : %f\n", num1);
    printf("double 3.14 to int : %d \n", num2);
    printf("big int 129 to small int : %d \n", ch);
    return 0;
}
/* output : 
int 245 to double : 234.000000
double 3.14 to int : 3
big int 129 to small int : -127
*/

 

double num1 = 5.15 + 19; 와 같이 실수형 데이터와 정수형 데이터의 연산을 하는 경우 실수형 데이터가 정수형으로 형변환 하게 되면 소수부의 손실이 발생한다. C는 연산시 자료형이 일치하지 않아 자동 형 변환을 해야 하는 경우 형 변환은 데이터의 손실을 최소화 하는 방향으로 진행된다.

 

#include <stdio.h>

int main(void){
    int num1 = 3, num2 = 4;
    double divResult;
    divResult = num1 / num2;
    printf("result div : %f\n", divResult);
    return 0;
}
// output : result div : 0.000000

위 코드에서 3 / 4 의 결과는 0.75이지만 num1과 num2가 int형이기 때문에 나눗셈의 결과는 0이 된다. C에서는 강제적인 형 변환을 명령할 때 소괄호를 사용한다. 연산을 진행하는 코드를 divResult = (double)num1 / num2; 와 같은 식으로 수정하면 0.75의 결과를 얻을 수 있다.

'Language > C, C++' 카테고리의 다른 글

[C] do~while  (0) 2020.11.28
[C] while  (0) 2020.11.27
[C] const  (0) 2020.11.25
[C] 문자 표현  (0) 2020.11.25
[C] unsigned  (0) 2020.11.25

C에서 상수를 만들때는 const 키워드를 사용할 수 있다. const 상수를 만드는 방법은 변수 선언시 const 선언만 추가하면 된다.

int main(void){
    const int MAX = 100;
    cosnt double PI = 3.14;
}

상수는 선언과 동시에 초기화를 해야하고, 그 값을 이후에 변경시킬 수 없다. 만약 상수를 선언만 하고 초기화하지 않는다면 쓰레기 값으로 초기화 된다. 

상수를 선언할 때는 대문자로 하는것이 관례라고 한다.

 

'Language > C, C++' 카테고리의 다른 글

[C] while  (0) 2020.11.27
[C] 자료형 변환  (0) 2020.11.27
[C] 문자 표현  (0) 2020.11.25
[C] unsigned  (0) 2020.11.25
[C] 자료형  (0) 2020.11.25

C에서는 아스키 코드를 표준으로 선택하여 문자를 표현한다. 아스키 코드는 알파벳과 일부 특수문자를 포함하여 128개의 문자로 이루어져 있다. 

위 사진은 아스키 코드 값을 확인할 수 있는 아스키 코드 표 이다.

 

#include <stdio.h>

int main(void){
    char ch1 = 'A', ch2 = 65;
    int ch3 = 'Z', ch4 = 90;

    printf("%c %d \n", ch1, ch1);
    printf("%c %d \n", ch2, ch2);
    printf("%c %d \n", ch3, ch3);
    printf("%c %d \n", ch4, ch4);
    return 0;
}
/* output: 
A 65 
A 65 
Z 90
Z 90
*/

서식문자 %c는 문자 형태로 데이터를 출력하라는 의미의 서식문자이다.

위 코드의 결과처럼 정수는 출력 방법에 따라 문자와 숫자의 형태 모두 출력 가능하다.

 

아스키코드 값은 0~127의 범위를 갖기 때문에 char형 변수만으로도 충분히 저장 가능하다.

'Language > C, C++' 카테고리의 다른 글

[C] 자료형 변환  (0) 2020.11.27
[C] const  (0) 2020.11.25
[C] unsigned  (0) 2020.11.25
[C] 자료형  (0) 2020.11.25
[C] 비트연산자  (0) 2020.11.21

C에서는 정수 자료형의 이름에 한하여 unsigned  선언을 추가하면 0 이상의 값만 표현하는 자료형으로 사용할 수 있다.

표현할 수 있는 값의 범위는 양의 정수 방향으로 두 배 더 넓어지게 된다. 예를 들어 char형 변수는 기본적으로 표현할 수 있는 값의 범위가 -128 ~ + 127 이지만, 앞에 unsigned를 붙여 unsigned char이 되면 표현할 수 있는 값의 범위가 0 ~ +255가 된다.

자료형 앞에 unsigned를 붙이게 되면 데이터의 부호를 결정 짓는 기본 자료형의 맨 왼쪽 비트인 MSB도 값의 크기를 나타내는 비트로 사용하게 된다.

자료형 앞에는 signed 선언도 할 수 있는데 signed int는 int 와 같은 선언이기에 대부분 singned 선언은 생략한다.

'Language > C, C++' 카테고리의 다른 글

[C] const  (0) 2020.11.25
[C] 문자 표현  (0) 2020.11.25
[C] 자료형  (0) 2020.11.25
[C] 비트연산자  (0) 2020.11.21
[C] 진수 표현  (0) 2020.11.21

자료형은 데이터를 표현하는 방법이다. C에는 다음의 여러가지 자료형들을 기본적으로 제공하고 있다.

정수형 자료형 :

char / 1바이트

short / 2바이트

int / 4바이트

long / 4바이트

long long / 8바이트

 

실수형  자료형 :

float / 4바이트

double / 8바이트

long double / 8바이트 이상

 

자료형은 데이터의 표현 방식이 다르기 때문에, 메모리의 효율적인 사용을 위해 다양한 자료형이 필요하다.

 

sizeof()연산자를 사용하면 자료형의 크기를 확인할 수 있다.

#include <stdio.h>

int main(void){
  char ch = 9;
  int iNum = 1052;
  double dNum = 3.14;
  printf("size of var ch : %d\n", sizeof(ch));
  printf("size of var iNum : %d\n", sizeof(iNum));
  printf("size of var dNum : %d\n", sizeof(dNum));

  printf("size of char : %d\n", sizeof(char));
  printf("size of int : %d\n", sizeof(int));
  printf("size of long : %d\n", sizeof(long));
  printf("size of long long : %d\n", sizeof(long long));
  printf("size of float : %d\n", sizeof(float));
  printf("size of double : %d\n", sizeof(double));
  return 0;
}
/* output : 
size of var ch : 1
size of var iNum : 4
size of var dNum : 8
size of char : 1
size of int : 4
size of long : 4
size of long long : 8
size of float : 4
size of double : 8
*/

위 코드에서 처럼 sizeof 연산자를 이용하면 변수의 크기와 자료형의 크기를 알 수 있다.

 

 

'Language > C, C++' 카테고리의 다른 글

[C] 문자 표현  (0) 2020.11.25
[C] unsigned  (0) 2020.11.25
[C] 비트연산자  (0) 2020.11.21
[C] 진수 표현  (0) 2020.11.21
[C] 키워드  (0) 2020.11.21

비트 연산자는 비트 단위로 연산을 진행하는 것으로 주로 하드웨어 프로그래밍에 활용되고, 그 이외의 영역에서는 메모리 공간의 효율성을 높이고 연산의 수를 줄이는 데 사용된다.

연산자 연산자의 기능
& 비트 단위로 AND 연산을 한다.
num1 & num2;
| 비트 단위로 OR 연산을 한다.
num1 | num2;
^ 비트 단위로 XOR 연산을 한다.
num1 ^ num2;
~ 단항 연산자로서 피연산자의 모든 비트를 반전시킨다.
~num; // num은 변화 없고 반전 결과만 반환
<< 피연산자의 비트 열을 왼쪽으로 이동시킨다
num<<2; // num은 변화 없고 두 칸 왼 쪽 이동 결과만 반환
>> 피연산자의 비트 열을 오른쪽으로 이동시킨다.
num>>2; // num은 변화 없고 두 칸 오른쪽 이동 결과만 반환

 

&연산 : AND

&연산은 두 개의 비트가 모두 1일때 1을 반환하고, 아니면 0을 반환한다.

ex) 0 & 0 -> 0 / 1 & 0 -> 0 / 0 & 1 -> 0 / 1 & 1 ->0

#include <stdio.h>

int main(void){
  int num1 = 15;  // 00000000 00000000 00000000 00001111
  int num2 = 20;  // 00000000 00000000 00000000 00010100
  int num3 = num1 & num2; // 00000100 = 4

  printf("num1 AND num2 result : %d\n", num3);
  return 0;
}
// output : num1 AND num2 result : 4

 

|연산 : OR

| 연산은 두개의 비트 중 하나라도 1이면 1을 반환한다. 

ex) 0 | 0 -> 0 / 1 | 0 -> 1 / 0 | 1 -> 1 / 1 | 1 -> 1

#include <stdio.h>

int main(void){
  int num1 = 15;  // 00000000 00000000 00000000 00001111
  int num2 = 20;  // 00000000 00000000 00000000 00010100
  int num3 = num1 | num2; // 00011111 = 31

  printf("num1 OR num2 result : %d\n", num3);
  return 0;
}
// output : num1 OR num2 result : 31

 

^연산 : XOR

^ 연산은 두 개의 비트가 서로 다른 경우에 1을 반환한다.

ex) 0 ^ 0 -> 0 / 1 ^ 0 -> 1 / 0 ^ 1 -> 1 / 1 ^ 1 -> 0

#include <stdio.h>

int main(void){
  int num1 = 15;  // 00000000 00000000 00000000 00001111
  int num2 = 20;  // 00000000 00000000 00000000 00010100
  int num3 = num1 ^ num2; // 00011011 = 27

  printf("num1 XOR num2 result : %d\n", num3);
  return 0;
}
// output : num1 XOR num2 result : 27

 

~연산 : NOT

~연산은 비트를 0에서 1로, 1에서 0으로 반전시킨다. 보수 연산이라고도 불린다.

~0 -> 1 / ~1 -> 0

#include <stdio.h>

int main(void){
  int num1 = 15;  // 00000000 00000000 00000000 00001111
  int num2 = ~num1;

  printf("NOT num1 result : %d\n", num2);
  return 0;
}
// output : NOT num1 result : -16

NOT 연산은 비트의 부호를 결정하는 MSB도 반전되어 값이 음수로 반전되었다.

 

<<연산 : 비트 왼쪽 이동(Shift)

<< 연산은 두 개의 피연산자를 요구하고 왼쪽 피연산자의 비트열을 오른쪽 피연산자의 값만큼 왼쪽으로 이동한다는 의미를 갖는다.

#include <stdio.h>

int main(void){
  int num = 15; // 00000000 00000000 00000000 00001111

  int res1 = num << 1;
  // 00011110
  int res2 = num << 2;
  // 00111100
  int res3 = num << 3;
  // 01111000

  printf("1 left shift : %d\n", res1);
  printf("2 left shift : %d\n", res2);
  printf("3 left shift : %d\n", res3);
  return 0;
}
/*
output :
1 left shift : 30
2 left shift : 60
3 left shift : 120
*/

위 코드를 보면 비트의 열을 한 칸씩 왼쪽으로 이동시킬때 마다 정수의 값이 두배가 되고, 반대로 한 칸씩 오른쪽으로 이동시키면 1/2배가 된다는 것을 알 수 있다. 이를 잘 활용하면 프로그램의 성능 향상으로도 이어질 수 있다. 

 

>>연산 : 비트 오른쪽 이동(shift)

>> 연산은 오른쪽 피연산자의 크기만큼 왼쪽 피연산자의 비트열이 오른쪽으로 이동한 결과가 나타난다. 왼쪽 피연산자의 값이 양수라면 밀려나는 오른쪽 비트들은 소멸되고 이동으로 인해 생긴 왼쪽 빈자리는 0으로 채워진다. 그러나 왼쪽 피연산자 값이 만약 음수라면 CPU에 따라 음의 값을 유지하기 위해 1을 채우는 CPU도 있고, 음의 값 유지를 상관하지 않고 0을 채우는 CPU도 있다. 

#include <stdio.h>

int main(void){
  int num = -16;  // 11111111 11111111 11111111 11110000
  printf("2 right shift : %d\n", num>>2);
  printf("3 right shift : %d\n", num>>3);
  return 0;
}
/*
output:
2 right shift : -4
3 right shift : -2
*/

 

위의 경우는 CPU에서 음의 값 유지를 위해 1을 채운 경우이다.

'Language > C, C++' 카테고리의 다른 글

[C] unsigned  (0) 2020.11.25
[C] 자료형  (0) 2020.11.25
[C] 진수 표현  (0) 2020.11.21
[C] 키워드  (0) 2020.11.21
[C] scanf()  (0) 2020.11.21

C는 10진수 외에 8진수나 16진수의 데이터 표현도 가능하다.

int num1 = 10;	// 특별한 선언이 없으면 10진수
int num2 = 0xA;	// 0x로 시작하면 16진수
int num3 = 012;	// 0으로 시작하면 8진수

위 코드와 같이 0x로 시작하면 16진수, 0으로 시작하면 8진수로 인식한다. 위 코드에서 16진수 A나 8진수 12는 모두 10 진수로 10이다. 따라서 저장되는 값은 모두 10으로 동일하다. 초기화에 사용된 표현 방식만 다를 뿐이다.

'Language > C, C++' 카테고리의 다른 글

[C] 자료형  (0) 2020.11.25
[C] 비트연산자  (0) 2020.11.21
[C] 키워드  (0) 2020.11.21
[C] scanf()  (0) 2020.11.21
[C] 연산자  (0) 2020.11.19

C언어에서 int, return 등과 같이 기능적 의미가 정해져 C의 문법을 구성하는 단어들을 키워드 라고 한다. 키워드는 변수나 함수 이름등 프로그래머가 다른 용도로 사용할 수 없도록 제한되어있다.

'Language > C, C++' 카테고리의 다른 글

[C] 비트연산자  (0) 2020.11.21
[C] 진수 표현  (0) 2020.11.21
[C] scanf()  (0) 2020.11.21
[C] 연산자  (0) 2020.11.19
[C] 변수  (0) 2020.11.18

scanf() 함수는 키보드로부터 다양한 형태의 데이터를 입력받을 수 있는 함수이다. 

int main(void){
	int num;
    scanf("%d", &num);
}

키보드로부터 데이터를 입력 받으려면 데이터의 종류에 맞게 메모리 공간을 미리 할당해야 한다. 위의 코드에서는 scanf()함수 호출 전에 변수 num을 선언하여 메모리 공간을 할당하였다. scanf() 함수를 보면 10진수 정수 형테의 데이터를 입력받아서 num이라는 변수에 저장하라는 의미를 담고 있다.

다음 코드는 정수 두개를 입력받아서 그 두 정수의 합을 출력하는 프로그램의 예제 코드이다.

#include <stdio.h>

int main(void){
  int result, num1, num2;

  printf("num1 : ");
  scanf("%d", &num1);
  printf("num2 : ");
  scanf("%d", &num2);

  result = num1 + num2;
  printf("%d + %d = %d\n",num1, num2, result);
  return 0;
}

 

scanf() 함수는 10진수 정수뿐 아니라 16진수, 문자열등 다양한 형태의 데이터를 입력받을 수 있다.

 

또한 다음과 같은 방식으로 여러개의 데이터를 동시에 입력받을수도 있다.

int main(void)
{
	int num1,num2,num3;
	scanf("%d %d %d", &num1, &num2, &num3);
}

scanf()함수는 공백을 기준하여 데이터를 구분한다. 위 코드와 같이 여러개의 데이터를 한번에 입력 받을 때는 3개의 정수 사이에 공백에 해당하는 스페이스바를 입력하여야 한다. ex) 3 4 5 

'Language > C, C++' 카테고리의 다른 글

[C] 진수 표현  (0) 2020.11.21
[C] 키워드  (0) 2020.11.21
[C] 연산자  (0) 2020.11.19
[C] 변수  (0) 2020.11.18
[C] printf()  (0) 2020.11.18

+ Recent posts