본문 바로가기

리눅스 C언어

C 언어 - 3

Bit | Binary digit


 ※ 0과 1


0

0

0

0

 0 (양수) 1 (음수) 


 2^2 =4   0100

 2^3 =8   1000

 2^4 =16  0001 0000


메모리 공간


32bit / 64bit 


 Code Segment

 함수코드 

 Data Segment

 삼수, 전역변수 

 Heap

 동적 할당 

 Stack

 지역변수, 매개변수 




제어문

 반복문 : for / while / do~ while

 조건문 : if / if~else / 다중 if / switch => continue, break


 for (i=0; i<5; i++) = for (초기값, 종료, 증감)

 i++ 증가 / i-- 감소


※ 반복


 for

 반복횟수가 정해져 있을 때 사용. 일정 조건까지 값이 변하면서 반복


 for (초기값; 종료조건; 증감치)

 {

만족하는 동안;

 }


 for (i=1; i<=10; i++)

 {

sum =+ 1;

 }


 참이면 수행. 참이 아니면 수행X

 초기값과 종료조건을 매치하고, 참이면 수행.

 만족한 값이 증감치를 더해, 종료조건과 매치.

 만족할 시 수행.

 만족이 끝나면 종료.

  

 무한루프 : 프로그램이 끝나지 않고 계속 반복하는것.

  for(;;)

  while(1)

  

  continue;

   무시하고 진행

  

  break;

   해당 반복문, 조건문을 중단하고 다음문장으로



 while

 주로 긍정문에 사용. ~ 하는 동안.

 조건이 거짓이 될때까지 계속 while문 안의 동작을 반복.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// C언어코딩 :: while 문  
// 조건이 거짓이면 실행하지 않음.
#include <stdio.h>
#include <string.h> 
 
int main()
{
    int i =1, sum = 0;
    while (i <= 10)
    {
        sum += i;
        printf(" i = %5d \n", i++);
 
    }
    //printf(" sum = %7d \n", sum);
     
    return 0;
 }
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// C언어코딩 
#include <stdio.h>
int main(void)
{
    char k;
    int a;
    char name[20]; //배열 20글자까지 한글은 10글자 
    
    printf(" 문자 입력 : ");
    //k = getchar();
    scanf("%c"&k);
    
    printf(" 정수 입력 : ");
    scanf("%d"&a);
    
    printf(" 이름 입력 : ");
    //scanf("%s", name); %d, %f, %lf, %c
    while ( getchar() != '\n'); //엔터값 읽고 버렸다! 
    gets(name);
    
    printf(" %c, %d, %s \n", k, a, name); 
    
    printf(" %p, %p, %p \n"&k, &a, &name); 
    
    return 0;
}
cs


 while(getchar() != '\n');

 op = getchar();

  --> 문자가 들어오므로, 버퍼를 비워준다.



 do ~ while

 긍정문에 사용. ~ 하지 않는 동안.

 do 절 안의 내용을 while 조건이 거짓이 될때까지 반복


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// C언어코딩 :: do ~ while 문
// 조건이 거짓이라 해도 한번은 실행
 
#include <stdio.h>
#include <string.h> 
 
int main()
{
    int i =100, sum = 0;
    do {
        sum += i;
        printf(" i = %5d \n", i++);
        
    } while (i <= 10);
 
    //printf(" sum = %7d \n", sum);
     
    return 0;
 }
cs



 ※ 조건문


  if : 참일 경우.

  if ~ else : 참일 때와 거짓일 때를 구분.

   if 조건 안의 문장이 참이면, 아래 명령을 실행한다. 

   아니라면, else아래의 명령을 설정하는 경우 실행가능.

   조건이 거짓이고, else문, else if문이 설정되어 있지않다면, 무시하고 그냥 진행.


  다중 if : 조건이 모두 만족되어야 참이 된다. if문 안의 if문.

  

  switch case : 케이스 값은 정수와 문자만 가능. 실수와 문자열은 불가능. > 자바는 문자열 가능.

   분기문 switch(변수)

    case: 변수값

    명령문

    case: 변수값

    함수

    -> switch변수 값을 읽어 아래 변수값 조건에 맞는 문장 실행

    -> case값으로는 정수와 문자만 가능, String불가, 단, 자바에서는 가능.


  if(1) => 항상 참

  if(0) => 항상 거짓



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// C언어코딩 :: 조건문  
 
#include <stdio.h>
#include <string.h> 
 
int main()
{
    if!2 ) //값이 있으면 참, '!', '67, 3.5, "aaa", 0은 거짓
    {  
        puts("1. one ");
        puts("2. two ");
    }
    else //
    {
        puts("3. three ");
        puts("4. four "); 
    }
    puts("5. five ");
    
    printf(" %d, %d \n"2!2);
    return 0;
 }
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// C언어코딩 :: 조건문  사칙연산  
 
#include <stdio.h>
#include <string.h> 
 
int main()
{
    int n1, n2, res;
    char op;
    
    while ( 1 )
    {
        printf(" 첫번째 수 : ");
        scanf("%d"&n1);
        
        if (n1 == 0)
            break;
            
        printf("[+, -, *, /] : ");
        while (getchar() != '\n');
        op = getchar();
        
        printf(" 두번째 수 : ");
        scanf("%d"&n2);
        
        if (op == '+')
            res = n1 + n2;
        else if (op == '-')
            res = n1 - n2;
        else if (op == '*')
            res = n1 * n2;
        else if (op == '/')
            res = n1 / n2;
        else 
            puts("없는 연산 "); 
        
        printf(" %d %c %d = %d \n", n1, op, n2, res);
    }
    
    return 0;
 }
cs





C 언어 연산자 우선순위

 https://dojang.io/mod/page/view.php?id=188


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// C언어코딩 :: 연산자 우선순위   
 
#include <stdio.h>
#include <string.h> 
 
int main()
{
    int a = 5;
    printf(" a = %d \n"++a); // 6 
    printf(" a = %d \n"--a); // 5 
    printf(" a = %d \n", a--); // 5 
    printf(" a = %d \n", a++); // 4 
    printf(" a = %d, %d, %d, %d \n"!a, !0!'b'!"bb");
    
    printf(" a = %d \n", a); // 5
    
    return 0
}
cs


 a++ : 후위 연산자(선언된 부분을 지난후 값 증가)

 ++a : 전위 연산자(선언된 부분을 지나기전 값 증가)



※ 할당


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// C언어코딩 :: 연산자 우선순위  : 할당  
 
#include <stdio.h>
#include <string.h> 
 
int main()
{
    int a = 5, b = 55.89;
    a = (int)4.78//강제 형변환
    
    printf(" a = %d , b = %d \n"&a, &b);
    
    printf(" a = %d , %d, %d, %d \n"!a, !0!'b'!"bb"); 
    
    if ( 3==2 && 3>2// 3과 2는 같다. 논리 AND. 3은 2보다 크다. 
        puts("참"); 
    if ( 3==2 || 3>2 || 1==0// 3과 2는 같다. 논리 OR. 3은 2보다 크다. 1과 0은 같다. 
        puts("참"); 
        
    return 0
}
cs





파일 다루기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// C언어코딩 :: 파일처리  
 
#include <stdio.h>
#include <string.h> 
 
int main()
{
    int bus[10];
    int i, j, tmp, n;
    n = sizeof(bus)/sizeof(int);
     
    FILE* fp = fopen("c:\\dd\\bus.txt""r");
    if (fp == NULL)
        puts(" !!파일 열기 실패 !! ");
    
    for (i=0; i<n; i++)
        fscanf(fp, "%d", bus+i);
        
    puts(" 원본 출력 ");
    for (i=0; i<n; i++)
        printf(" %5d ", bus[i]);
    
    fclose(fp);
    return 0;
 }
cs


 File* fp = fopen("경로\\경로", "읽기형식");

  - 해당 파일을 경로에서 읽는다.

 ("r": 읽기만 가능(read), "w": 새로쓰기(write), "a": 추가(append))


 맨끝은 항상 fclose(fp)로 닫아준다.


 fputs("내용", fp) fp: 파일에해당하는 포인터

  - 파일에 fputs안의 출력 내용을 저장한다.

  - 파일에 fscanf, fgets로 입력한 내용이 저장 가능하다.


 %d : decimal(-21억~21억까지)

 %u : 0~42억9000만까지 출력


 해당 범위를 넘어선 경우(overflow)가 발생




배열 인덱스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// C언어코딩 :: 배열 
 
#include <stdio.h>
#include <string.h> 
 
int main()
{
    int a =100;
    int b[5]; 
    int i, j, tmp, n;
    n = sizeof(b)/sizeof(int);
    
    printf(" a= %d byte \n"sizeof(a));
    printf(" b= %d byte \n"sizeof(b)); // 배열은 번지수, 주소 
    printf(" b= %d byte, int = %d \n"sizeof(b), sizeof(int)); //배열의 갯수 구하기 
    
    printf(" &a= %u, b= %u \n"&a, b); //%u => unsigned
    
    return 0;
 } 
cs



※ 해당 변수의 size를 보는함수

sizeof(변수)


배열은 그 자체가 주소 = 배열명을 출력하면 주소가 출력된다.

printf( a%2 ? " a = %d 참 홀수 \n" : " a = %d 참 짝수 \n", a);

(if) (t1) (t2)


※ 배열 갯수 구하기
sizeof(배열변수)/sizeof(해당 자료형)

ex) sizeof(array)/sizeof(int)


※ int b[5]; // int = 4 byte


[    ]

[    ]

[    ]

[    ]

[    ]

 

b [0]

b [1]

b [2]

b [3]

b [4]

index / element

100

104

104

112 

116 

... 


 int a = 20;  =  a [ 20 ]

 a : 주소의 번지수




비트 연산자

 

 C99 - c언어가 99년도에 제정(이때를 기준으로 문법체계 확정)

 ++x : 전위 연산자

 x++ : 후위 연산자


 (~)비트 연산자 :  0과 1을 뒤집는것

 ! : 논리 NOT


 sizeof(변수): 해당 변수의 size를 integer로 출력


 ※ 비교연산

 

 <

 

 >

 

 =

 

 !=

 같지 않은

 ==

 같음

 


※ 논리 연산

 

 0

 false

 1

 true

 |

 true 

 ||

 or 

 &

 false 

 &&

 AND 

 !

 NOT 

 ^ 비교해서 같으면 0, 다르면 1 



 ※ 삼항 연산자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// C언어코딩 :: 연산자 우선순위  :  삼항 연산자 1
 
#include <stdio.h>
#include <string.h> 
 
int main()
{
    int a = 5, b = 55.89;
    a = (int)4.78//강제 형변환
    
    printf(" a = %d , b = %d \n"&a, &b);
    
    printf(" a = %d , %d, %d, %d \n"!a, !0!'b'!"bb"); 
    
    if ( a % 2 ) //나머지  
        printf(" a = %d 참 홀수 \n", a);
    else
        printf(" a = %d 참 짝수 \n", a); 
    
    printf( a%2 ? " a = %d 참 홀수 \n" : " a = %d 참 짝수 \n", a); //삼항연산자  
    
    a = a + 10;
    a += 30//덧셈 후 할당 
        
    return 0
}
cs

 

 ? : 


 if(a>1) break;

 else continue;


 -> a>1 ? break : continue;



 0011 3 3|4 = 7

 0100 4 3||4 = 1

 0111 7 3&4 = 0

 0000 0 3^4 = 7

 1111 15 15^1 = 14 (베타적 논리 합)

 0001 1

 1110 14

 


※ 자동 형 변환

int a = 22 b = 66.22;


※ 강제 형변환

a= (int)4.78;


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// C언어코딩 :: 형변환   
 
#include <stdio.h>
#include <string.h> 
 
int main()
{
    int a = 5, b = 55.89;
    a = (int)4.78//강제 형변환
    
    printf(" a = %d , b = %d \n"sizeof("대한민국"), sizeof(3.5));
    
    printf(" a = %d , %d, %d, %d \n"!a, !0!'b'!"bb"); 
    
    return 0
}
cs



※ AND와 OR


if(a = a && a = a) 모두 참이면, 참 출력, 둘중하나라도 거짓이면, 거짓 출력

if(a = a || a = a) 모두 참이면, 참 출력, 둘중 하나라도 참이면, 참출력, 둘다 거짓이면, 거짓 출력


3 || 4 =1 (true =1, false =0)

3 && 4 =0 (true =1, false =0)


(Carret)

3^4 = 0011 ^ 0100 = 1110 = 7


XOR(exclusive OR)

3~4 = 0011 ~ 0100 = 0111 = 14



※ shift

-> 2진수에서 자릿수를 오른쪽(<<)/왼쪽(>>) 수만큼 민다.

(좌측 : 곱셈, 우측: 나눗셈)

3 << 2

0110 <<2

result : 001100 = 12


부호 -> 0(양수) 1(음수)



http://www.binaryconvert.com/에서 확인 가능



2|22   - 0

--------

2|11   - 0

--------

2|5    - 1

--------

2|2    - 1

--------

2|1    - 1

--------

2|0    - 1

--------

=111100



















'리눅스 C언어' 카테고리의 다른 글

C 언어 - 4  (0) 2019.01.06
코딩 연습 1  (0) 2019.01.06
C 언어 - 2  (0) 2019.01.06
C 언어 - 1  (0) 2019.01.06