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)
※ 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