변수 연산
- 연산은 항상 ‘결과를 리턴’한다.
연산자
- 연산자 : 하나 이상의 피연산자
- 대입 연산자 (=) : 우측 값을 좌측 변수에 저장
- 복합 대입 연산자 : 타 연산과 대입 연산 결합. 코드 간결화
- 종류 : +=, -=, *=, /=, %= 등..
- a += b; 와 a = a + b; 의 리턴 결과는 같다.
- 복합 대입 연산자 : 타 연산과 대입 연산 결합. 코드 간결화
- 연산자는 우선순위가 있다.
- 산술 연산자(+)가 대입연산자(=) 보다 더 빨리 연산된다.
- 피연산자가 2개 이상 있는 연산자를 ‘이항연산자’라고 부른다.
증감 연산자
int a = 5;
int b;
// 전위 증가: a를 먼저 1 증가(a=6), 그 값을 b에 대입 (b=6)
b = ++a;
printf("=== 전치 증가 연산 ===\\n");
printf("a = %d\\n", a); // 6
printf("b = %d\\n", b); // 6
// 후위 증가: a 현재 값(6)을 b에 먼저 대입(b=6), 후 a를 1 증가 (a=7)
b = a++;
printf("=== 후치 증가 연산 ===\\n");
printf("a = %d\\n", a); // 7
printf("b = %d\\n", b); // 6
- 변수 값 1 증가 또는 감소
- ‘단항 연산자’ 라고 부르기도 한다.
- 증가 (++): a++ (후위), ++a (전위).
- 감소 (--): a-- (후위), a (전위).
- 연산자가 붙은 위치에 따라 리턴하는 타이밍이 달라진다.
- 전위(Prefix): 값 증감 후 결과 사용.
- 후위(Postfix): 현재 값 사용 후 값 증감.
비교 연산자
int a = 30, b = 50;
// printf %d로 bool 값 출력 시 0 또는 1
bool p = a > b; // 30 > 50 -> false (0)
bool q = a < b; // 30 < 50 -> true (1)
bool r = a == b; // 30 == 50 -> false (0)
- 비교 연산자 : 두 값을 비교하여 참 또는 거짓을 반환한다.
- , <, ≥, ≤, ==, ≠
- 인데 값이 같다면? : false를 반환한다.
- 진릿값 (boolean value) : 참 또는 거짓을 의미한다.
- true, false
- 주로 ‘조건식’에 사용된다.
논리 연산자
int a = 3;
bool p = a >= 1 && a <= 10; // a가 1 이상이고 (true) 그리고 a가 10 이하이다 (true) -> true (1)
bool q = a == 3 || a == 7; // a가 3이거나 (true) 또는 a가 7이다 (false) -> true (1)
bool r = !q; // q가 true이므로 !q는 false (0)
- 연산 결과가 bool형으로 반환되지만 피 연산자 모두 bool 형으로 비교해야한다.
- &&, ||은 이항 연산자다.
- |은 단항 연산자다.
- && (논리곱): 두 피연산자 모두 참일 때 참.
- || (논리합): 두 피연산자 중 하나라도 참이면 참.
- ! (논리부정): 피연산자 논리값 반전.
조건부 연산자 ?:
- 조건 ? (참의 결과) : (거짓의 결과) 형식으로 작성한다.
- 조건부 연산자 : 3개의 피연산자를 사용하는 연산자다.
- 조건이 참이라면 참의 결과가 리턴되고, 거짓이라면 거짓의 결과가 리턴된다.
- 만약, 참과 거짓 항에 식이 존재한다면? 해당 식의 결과가 최종 연산 결과가 된다.
연산자 우선순위
- 여러 연산자 사용 시 연산 순서 결정 규칙이다.
- 일반적 순서 : 괄호 > 단항 연산 > 산술 > 비교 > 논리
- 괄호 () : 우선순위 명시적 지정. 최우선으로 수행한다.
- 기본 순서는 왼쪽에서 오른쪽으로 진행한다.
- 대입 연산자는 오른쪽 결과를 왼쪽으로 대입하여 오른쪽 → 왼쪽이다.
- 이항 연산자보다 단항 연산자가 우선순위가 높다.
입력받기
scanf
int a, b;
// 사용자에게 두 개의 정수 입력을 요청하고,
// 입력된 값을 변수 a와 b의 메모리 주소에 각각 저장함.
scanf("%d%d", &a, &b); // %d는 정수형 서식 지정자
printf("%d + %d = %d\\\\n", a, b, a + b); // 입력받은 두 수의 합 출력
- 표준 입력(일반적으로 키보드)으로부터 형식에 맞춰 데이터를 읽어 변수에 저장하는 함수
- 표준입력함수다. (printf : 표준 출력 함수)
- 콘솔창으로 입력을 받는다.
- %자료형 에서 자료형을 반드시 구분해줘야한다.
- 서식 지정자의 자료형이 안맞는 경우가 발생할 수 있다.
- return(enter)키를 눌렀을때 작동한다.
- 순서
- 입력버퍼 - return 키가 눌리기 전까지 대기
- 입력
- 공백 단위로 자른다.
- 띄어쓰기를 기준으로 하나의 인자를 구분한다.
- 인자에 채워질때까지 하나씩 넣는다.
- 입력버퍼
- 띄어쓰기를 기준으로 처리한다.
- 공백을 만날때까지 가져오는 것이다.
- %d%d → 123 ^ 123 ^ 123^ 123 → 123 ^ 123까지만 가져오고 다시 깜빡인다.
- & : 어드레스 연산자.
- 단항 연산자다.
- 메모리 공간의 ‘주소값’을 리턴한다.
- 즉, 포인터형 : 변수의 주소를 표현하는 변수다.
- 결론 : a의 주소값을 받겠다는것이다.
서식 지정자
서식 지정자 설명 대응 자료형 예시
| %d | 10진수 정수 | int |
| %ld | 10진수 long 정수 | long int |
| %lld | 10진수 long long 정수 | long long int |
| %u | 부호 없는 10진수 정수 | unsigned int |
| %o | 8진수 정수 | int |
| %x, %X | 16진수 정수 | int |
| %f | 단정밀도 실수 (float) | float |
| %lf | 배정밀도 실수 (double) | double |
| %Lf | 확장 배정밀도 실수 | long double |
| %c | 단일 문자 | char |
| %s | 문자열 | char 배열 (char\*) |
| %p | 포인터 주소값 | 포인터 변수 |
- 주의 : 문자열을 입력받을 배열의 크기가 넘어가는 경우 ‘오버플로우’가 발생한다.
- 문자열 : char형이 여러개가 연결되어있는 형태의 자료형이다.
문자열 입력
- char 변수명[바이트 수]
- 한글은 한글자당 ‘2바이트’가 필요하다.
- 이름이 3문자라면 6바이트 + 1바이트가 필요하다.
- 문자열 입력은 & 어드레스 연산자를 사용하면 안된다.
- 배열은 ‘이름 자체가 주소’다.
조건문과 반복문
- 프로그램에 흐름에 영향을 미치는것
- 조건문
- 함수
- 예외처리
- 멀티쓰레드 : 프로그램 흐름이 여러개 있다는 것이다.
- 조건식 : 결과가 참 거짓으로 끝나는 식이다.
- 식 이란? : 피연산자와 연산자가 섞인것이다.
- 연산자란?
- 반복문 : 특정 구간을 반복시키는 식이다.
if 조건문
if (조건식) {
// 조건식이 참일 때 실행될 코드
}
- if 문 : 주어진 조건식이 참(true)일 경우에만 특정 코드 블록을 실행
- 참일 경우 코드블럭을 실행하고, 거짓일경우 건너 뛴다.
- 코드가 한 줄일 경우 코드블럭을 안써도 된다.
- 다만 오류가 날 가능성이 많기에 쓰는게 좋다.
if (조건식) {
// 조건식이 참일 때 실행될 코드
} else {
// 조건식이 거짓일 때 실행될 코드
}
- if - else 문 : 조건식이 참일 때 실행할 코드와 거짓일 때 실행할 코드를 각각 지정한다.
if (조건식1) {
// 조건식1이 참일 때 실행
} else if (조건식2) {
// 조건식1이 거짓이고 조건식2가 참일 때 실행
} else {
// 모든 조건식이 거짓일 때 실행
}
- 다중 조건문 (if - else if - else) : 여러 조건 중 하나를 선택하여 해당 코드 블록 실행한다.
- 위쪽이 작은 범위를 검사해야 아래까지 안넘어간다.
- 실행하는 순서가 중요하다.
- 중첩 조건문 : if문 또는 else문 내부에 또 다른 if문을 사용하는 구조다.
- 복잡한 조건 분기 처리에 사용한다.
switch 조건문
switch (변수) {
case 값1:
// 변수 == 값1일 때 실행될 코드
break; // switch 문 탈출
case 값2:
// 변수 == 값2일 때 실행될 코드
break;
// ... 여러 case
default: // 선택 사항
// 어떤 case에도 해당하지 않을 때 실행될 코드
break;
}
- switch 문 : 변수의 값이 특정 case와 일치할 경우 해당 case의 코드부터 실행한다.
- 주로 정수형 또는 문자형 변수의 값에 따라 분기할 때 사용
- if-else if 문으로 대체 가능하나, 가독성이 더 좋을 수 있다.
- break문이 없다면 모든 case 의 코드가 전부 실행된다.
- 변수의 조건이 맞는다고 바로 실행되는것이 아니라 case1부터 하나씩 검사해서 실행되는것이다.
- break 문: 해당 case 실행 후 switch 문을 빠져나가도록 함. 생략 시 다음 case 코드가 연이어 실행 (Fall-through).
- default 절: 어떤 case 값과도 일치하지 않을 때 실행 (선택 사항)
문자열 비교 strcmp(문자열1, 문자열2)
- 각 문자열의 첫 번째 문자를 비교하여 서로 같거나 다르면 종료, Null 에 도달할 때까지 비교를 계속한다.
- <0 : 문자열1의 비교한 문자가 문자열2의 문자의 ‘아스키 코드’ 값이 낮다.
- 0 : 더 큰 값이다.
- 0 : 두 문자열의 내용이 동일하다.
- 리턴값은 int 형이다.