이 연산자는 if~else문을 일부 대체할 수 있고, 피 연산자가 3개이기 때문에 삼항 연산자 라고도 불린다. 조건 연산자는 다음과 같이 구성된다. 

(num1>num2) ? (num1) : (num2);

위 코드에서 조건이 참이면 num1 을 반환하고 거짓이면 num2를 반환한다. 대입연산자보다 조건연산자의 우선순위가 높기 때문에 다음과 같이 활용할 수 있다.

int num3 = (num1>num2) ? num1 : num2;

 

다음은 조건연산자를 활용하여 입력한 정수의 절댓값을 출력하는 예시이다.

#include <stdio.h>

int main(void)
{
    int num, abs;
    printf("input num : ");
    scanf("%d", &num);

    abs = num>0 ? num : num*(-1);
    printf("result : %d\n", abs);
    return 0;
}

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

[C] continue  (0) 2020.12.05
[C] break  (0) 2020.12.05
[C] 조건적 실행  (0) 2020.12.05
[C] for  (0) 2020.11.29
[C] do~while  (0) 2020.11.28

C에서 if 라는 키워드는 조건적 실행(조건에 따라서 실행을 하느냐 마느냐)를 가능하게 한다. if문은 조건이 만족하면 if문 아래의 문장이 실행되고, 조건이 만족하지 않으면 실행하지 않는다. if문의 영향을 받는 문장은 중괄호로 감싸고 한 줄이라면 들여쓰기로 구분할 수 있다.

다음 코드는 입력받은 숫자에 따라 0보다 큰지, 작은지, 0인지 판단하는 코드이다.

#include <stdio.h>

int main(void){
    int num;
    printf("input number : ");
    scanf("%d", &num);

    if(num<0)
        printf("number is smaller than 0. \n");
    
    if(num>0)
        printf("number is bigger than 0. \n");

    if(num == 0)
        printf("number is 0. \n");

    return 0;
}

 

else 라는 키워드는 독립적으로는 사용할 수 없고, if와 함께 사용해야 한다. if절의 조건이 참이면 if 블록이 실행되고, 거짓이면 else 블록이 실행되는 구조이다. 다음 코드는 입력한 값이 0이면 0이라고 출력하고 다른 값이면 0이 아니라고 출력하는 코드이다.

#include <stdio.h>

int main(void)
{
    int num;
    printf("input number : ");
    scanf("%d", &num);

    if(num==0)
    {
        printf("number is 0\n");
    }
    else
    {
        printf("number is not 0\n");
    }

    return 0;
}

 

위 코드의 경우에는 두 개의 블록중 하나를 선택하여 실행하는 코드였다. else if 라는 키워드를 사용하면 3개이상의 블록중 하나의 블록을 선택하여 실행하도록 할 수 있다. 처음에는 if 절로 끝나고 마지막은 else 절로 끝난다. if절과 else절 사이에는 else if 절을 몇개든지 추가할 수 있다. 조건의 만족 여부 검사는 위에서 아래로 진행되고 조건이 만족되어 해당 블록을 실행하고 나면 마지막 else까지 아래의 블록들은 전부 건너 뛴다.

#include <stdio.h>

int main(void)
{
    int num = 3;
    
    if(num < 0)
    {
        printf("num is smaller than 0\n");
    }
    else if (num > 0)
    {
        printf("num is bigger than 0\n");
    }
    else if(num==3)
    {
        printf("num is 3\n");
    }
    else
    {
        printf("num is 0\n");
    }

    return 0;
}

위 코드의 경우 조건에 만족하는 첫번째 else if절을 실행하고, 다음 코드들은 전부 실행하지 않는다. 두번째 else if 절도 조건을 만족하지만 이미 위 조건을 만족했기 때문에 실행하지 않는다.

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

[C] break  (0) 2020.12.05
[C] 조건 연산자(삼항 연산자)  (0) 2020.12.05
[C] for  (0) 2020.11.29
[C] do~while  (0) 2020.11.28
[C] while  (0) 2020.11.27

반복문의 반복횟수를 판단하려면 while문의 경우 반복을 위한 변수와 반복 조건, 반복 조건을 거짓으로 만들기 위한 연산 등 최소 3문장을 파악해야 한다. 이 세 가지 요소를 한 데 묶어 반복 횟수의 판단이 쉬운 반복문이 for 문이다. 

반복문의 필수 요소 3가지는 반복을 위한 변수의 선언 및 초기화에 사용되는 초기식, 반복의 조건을 검사하는 목적으로 사용되는 조건식, 반복의 조건을 거짓으로 반드는 증가 및 감소 연산인 증감식이 있다. 그리고 for문을 사용하면 다음과 같은 형식이 된다.

for(초기식; 조건식; 증감식)
{
	// 반복할 코드
}

 

#include <stdio.h>

int main(void)
{
    int total = 0;
    int num;

    printf("0 to num add, What is num? ");
    scanf("%d", &num);

    for(int i = 0; i <= num; i++)
        total += i;
    
    printf("0 to %d add : %d\n", num, total);
    return 0;
}
/* output : 
0 to num add, What is num? 10
0 to 10 add : 55
*/

위 예제 코드는 0부터 입력한 값까지의 총 합을 더한 결과를 출력하는 코드이다.  원래는 for(int i = 0; 과 같이 for문 안에 초기식 변수를 선언하면 컴파일이 안됐으나 요즘은 for문 안에 변수 선언을 지원하는 컴파일러들이 많다. 

 

아래 코드와 같이 for문 중간의 조건식이 비워지면 무조건 참으로 인식하여 무한 루프가 형성된다.

for( ; ; )
{
}

 

for문도 while문과 do~while문과 마찬가지로 중첩 사용이 가능하다.

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

[C] 조건 연산자(삼항 연산자)  (0) 2020.12.05
[C] 조건적 실행  (0) 2020.12.05
[C] do~while  (0) 2020.11.28
[C] while  (0) 2020.11.27
[C] 자료형 변환  (0) 2020.11.27

do~while문은 while문과 달리 반복 조건을 뒷부분에서 검사한다. 이 때문에 do~while문은 반복 영역을 최소한 한 번은 실행한다.

 

#include <stdio.h>

int main(void)
{
    int total = 0, num = 0;

    do
    {
        printf("input int(0 to quit) : ");
        scanf("%d", &num);
        total += num;
    } while (num != 0);
    printf("Total : %d\n", total);
    return 0;
}

위 코드는 반복해서 사용자 숫자입력을 받고, 입력받은 숫자가 0 이면 입력받은 숫자들의 합을 출력하는 코드이다. 위  코드와 같이 반복 영역을 최소한 한 번은 무조건 실행해야 하는 경우에는 do~while문을 사용하는 것이 적절하다. 

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

[C] 조건적 실행  (0) 2020.12.05
[C] for  (0) 2020.11.29
[C] while  (0) 2020.11.27
[C] 자료형 변환  (0) 2020.11.27
[C] const  (0) 2020.11.25

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

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에는 다음의 여러가지 자료형들을 기본적으로 제공하고 있다.

정수형 자료형 :

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

+ Recent posts