주석 처리
/* */ : 범위 주석 처리
// : 한 줄 주석 처리
#include <stdio.h>
standard input output (표준 입출력) 의 내용을 프로그램 안에 복사한다는 의미
* 전처리 : #define _CRT_SECURE_NO_WARNINGS
출력문
printf(" ")
제어 문자
- \n : 다음 줄로 이동
- \b : 커서가 한 칸 왼쪽으로 이동 (앞에 있는 문자를 건너띔)
- \r : 캐리지 리턴 , 맨 앞으로 커서가 이동
- \a : 알럿 경보, 벨소리
정수 실수 출력
- 정수 : printf("%d",10);
- 실수 : printf("%lf",3.14); ,소수점 자릿수 지정 : .자릿수%lf
- 반환 문자 여러개: printf("%d와 %d 와 %lf",10, 20+10, 3.14);
- 실수 지수 표현 : 실수 * 10 (지수) -> 실수 E 지수
문자 문자열 출력
- 문자 : printf("%c",'a');
- 문자열 : printf("%s", "string");
자료형
정수 : int 변수 표현: %d
실수 : float 변수 표현: %f
double 변수 표현: %lf
문자 : char 변수 표현 : %c
문자열 : char 변수 [크기] 표현 : %s
입력 받기
보통: scanf_s("%d", &저장 할 변수)
문자열: scanf_s("%s", 저장 할 변수 ,sizeof(저장할 변수)) -> 사이즈 크기만큼 문자열을 입력 받겠다!
- 변수++ , ++변수의 차이
++a = 먼저 덧셈 수행 후 반환
a++ = 먼저 반환 후 덧셈 실행
반복문
1. for문 (초기 값; 조건 값;증가/감 값){ }
2. while (조건) { 무한 반복문이 되지 않게 로직 }
3. do{ 수행 할 문장 } while(조건);
조건문
and=&&, or= ||
1. if 문 (조건){ } else if(조건1){ } else{ }
2. switch (변수)
case 값1: 변수가 값1인 경우 수행 break
case 값2 : 변수가 값 2인 경우 수행 break
defalut : 아무것도 해당되지 않을 때
ex) 값1~ 값3 동일한 출력 : case 값1 :case 값 2: case 값 3: 출력 break
분기문
break - 반복문 탈출
continue -밑에 구간을 통과하고 반복문 절로 돌아간다.
정수 자료형
특징
- char <= short <= int <= long <= long long
- 특별한 경우가 아니면 정수형은 int를 사용한다.
- 자료형의 크기가 궁금하면 sizeof(자료형)
실수 자료형
특징
- float 형은 유효숫자가 7자리, double 형은 15자리 내의 값을 사용하는 것을 권장
- 정수형을 기본으로 사용하고 실수형은 필요한 경우에만 사용
- 실수형은 우효숫자가 많은 double형을 기본으로 사용
문자열 저장
문자열은 char 형을 배열 형태로 만들어 저장
char 배열명 [문자열 길이 +1] = 문자열 ;
* 문자열 길이 +1 인 이유 : 문자열의 끝에 \n을 자동으로 추가하기 때문
- 함수
- strcpy(배열 변수, 문자/문자열); - 배열 변수에 새로운 문자열을 저장
외장 함수
- 입력 함수 #pragma warning (disable: 4996)
- 랜덤 함수 #include <stdlib.h> + (시간 함수) #include <time.h>
1. 난수 초기화 - srand(time(NULL)); 난수 초기화를 해줘야 매번 다른 값이 반환 됨
2. 경우의 수 반환 - rand () % (경우의 수) , rand () % (경우의 수) +(시작 수)
ex) 기본적으로 rand () % 10 -> 0~9
rand () % 10 +1 -> 1~10
- 시간 함수 #include <time.h>
- 동적 할당 함수 #include <malloc.h>
논리 연산자
- && : a and b
- || : a or b
- ! : not(a)
연산 수행 과정
sum=a+b 과정
메모리에 있는 값 a.b -> CPU의 저장공간인 레지스터로 복사 (로드)
ALU에서 연산 수행, 결과 값을 메모리에 있는 sum에 복사(스토어)
형 변환 연산자
일시적으로 형태를 바꿀 때 사용
ex) int a= 10; printf("%lf",(double)a)
자동 형 변환
컴파일러는 피연산자의 형태가 서로 다르면 형태를 일치시켜주는 작업을 수행함.
- 기본 규칙
- 크기가 작은 값에서 큰 값으로 바뀐다. ex) int a + double b = double (a+b)
- 대입 연산자의 경우는 메모리에 값을 저장하는 형태이기 때문에 무조건 좌항 변수형에 맞게 저장됨.
- 콤마 연산자는 대입연산자보다 우선순위가 낮다.
비트 연산자
데이터를 비트 단위로 연산
- 기본 규칙
- 비트 연산자는 데이터를 비트로 정확히 표현할 수있는 정수만 사용 가능
- 연산자 종류
- 논리곱 연산자 & : a&b
- 배타적 논리합 연산자 ^ : a^b (서로 다를 때만 참)
- 논리합 연산자 | : a|b
- 부정 연산자 ~ : ~a
- 비트 이동 연산자 >>,<< : a<<1, a>>1
연산자의 종류와 우선 순위
- 1차 연산자 : () [] . ->
- 단항 연산자: - ++ -- ! * <-
- 산술 연산자
- * / %
- + -
- 비트 이동 연산자 : >> <<
- 관계 연산자 : < <= >= >
- 동등 연산자 : == !=
- 비트 논리 연산자
- &
- ^
- |
- 논리 연산자
- &&
- ||
- 조건 연산자 : ? :
- 대입 연산자 : = += /= %/ */ |= ..
- 콤마 연산자 : ,
if문 기본 형식
if (조건식){
실행문...
}
형식
- if ~ else
- if ~ else if ~ else
switch
switch(조건식){
case 상수식 1:
실행문 1;
break;
....
defalut: // case모두 비교 후 일치하는 상수가 없을 때 실행, 어디 위치에 있어도 상관은 없다.
실행문 2;
break;
}
규칙
- 조건식은 정수식만 사용
- 기본적으로 case는 break를 포함
while 문
조건식을 먼저 검사 후 조건식이 참인 동안 실행문 반복
while(조건식){
실행문;
}
do ~ while문
반복할 문장을 무조건 1번이상 수행 후 조건을 검사
do{
실행문;
}while(조건식);
for 문
for(초기값;조건식;증감식){
실행문;
}
함수
반환형 함수명(매개변수1, 매개변수2....){
....
}
- 매개변수가 없는 함수 : 값을 받을 필요가 없을 때
- 반환 값이 없는 함수 : void를 반환형으로 사용, return 생략 가능
배열
메모리에 연속적으로 저장해놓고 쪼개서 사용하는 방법
1. 자료형 배열명 [저장개수];
2. 자료형 배열명[저장개수]={ ......};
- 배열을 초기화 할 때는 중괄호 사용
- 배열 요소의 개수 : sizeof(배열명) / sizeof(배열 요소)
char 배열
1. 자료형 배열명 [저장개수]= { 'a', 'b', 'c' };
2. 자료형 배열명 [저장개수]="abc";
- 저장할 문자열의 길이보다 하나 이상 크게 배열을 선언해야 함 (\n을 저장하기 위해)
- char 배열의 크기는 최대한 넉넉하게 선언해야 함
문자열 대입
문자열의 길이가 다를 수 있으므로 char형 배열에 새로운 문자를 저장하는 strcpy 함수를 사용한다.
strcpy(저장될 배열명, "저장할 문자" or 저장 할 배열명);
문자열 전용 입출력 함수
scanf (): 중간에 빈칸이 있는 경우 빈칸 전까지만 입력을 수행
gets, puts (): 는 빈칸을 포함하여 한 줄 전체를 문자열로 입력
- 빈칸을 포함하여 문자열을 입력하는 gets ()
gets(char 배열명)
- 빈칸이나 탭 문자를 사용할 수 있으며 enter를 누르기 전까지 전체를 하나의 문자열로 배열에 저장
- 메모리 영역을 침범할 가능성이 있기에 배열의 크기를 신경 써 줘야한다.
- 문자열을 출력한 이후 자동으로 줄을 바꿔주는 puts()
문자열을 대입하는 함수 strcpy
#include <string.h>
문자열을 모두 바꿈
strcpy(복사 받을 곳, 복사할 내용)
- 첫 번째 인수는 char 배열이나 배열명을 저장한 포인터만 사용 가능
- 두 번째 인수는 문자열의 시작위치를 알수 있다면 모두 가능
원하는 개수의 문자만을 복사하는 strncpy
#include <string.h>
원하는 문자열만 대입
strncpy(복사 받을 곳, 복사할 내용,복사할 문자 수)
문자열을 붙이는 strcat, strncat
문자열의 길이를 반환하는 strlen
구조체
구조체를 사용하는 이유는 자료를 체계적으로 관리하기 위해서 !
Person 이라는 구조체를 만들었을 때 -> A, B, C라는 사람을 쉽게 생성하고 관리할 수 있다.
- 구조체는 struct 으로 정의한다. (data stucture의 약어)
- 구조체는 관련 정보를 하나의 의미로 묶을 때 사용한다.
- 선언 : struct 구조체 이름 변수이름;
- 구조체 변수를 선언하면서 초기화 : struct 구조체 이름 변수이름={ .변수=값, ..};
- 정의 : struct 구조체이름 { ..... };
- 구조체를 정의하면서 변수 선언 : struct 구조체이름 (...) 변수;
- 접근 : 구조체 변수.구조체 멤버
- 구조체 멤버에 접근할 때는 . 을 사용한다. ex) person1.age=19;
- 문자열 멤버는 할당 연산자로 저장할 수 없다. -> strcpy()함수 사용 ex) person.1="홍길동" (X)
stuct 키워드를 생략해주는 typedef
typedef는 자료형의 별칭을 만드는 기능을 담당한다.
선언 : typedef 자료형 별칭
- 정의 : typedef struct 구조체 이름 { .... } 구조체 이름;
- 익명 구조체 : typedef struct { .... } 구조체 이름;
- 선언 : 구조체이름 변수이름;
구조체 포인터
구조체는 멤버 변수가 여러개 있어 크기가 큰 편 이므로 일일히 변수를 선언하는 것보다는
포인터에 메모리를 할당하는편이 효율적이다.
- 구조체 포인터는 malloc 함수를 사용하여 동적메모리를 할당
- 선언: stuct 구조체이름 * 포인터이름= malloc(sizeof(struct 구조체이름));
- 접근: 구조체 변수 -> 구조체 멤버
- 구조체 포인터 멤버에 접근할 때는 -> 을 사용한다.
'C > 기본 문법 내용 정리' 카테고리의 다른 글
3장. 연산자 (0) | 2022.01.26 |
---|---|
2장. 변수와 데이터 입력 (0) | 2022.01.25 |
1장. 상수와 데이터 출력 (0) | 2022.01.25 |
c언어 정리 포인터 (0) | 2021.07.07 |
C언어 배열과 문자열 (0) | 2021.07.05 |