#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int kor, eng, mat, sci, total;
double avg;
char name[10];
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃이름, 총점, 평균을 구하는 프로그램입니다.┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n이름을 입력하고 Enter를 누르세요=>");
scanf("%9s", name);
while (getchar() != '\n'); // 이 줄을 추가해야 함:개행 문자를 만날 때까지 버퍼에서 문자를 읽어 제거
printf("\n국어 점수를 입력하고 Enter를 누르세요=>");
scanf("%d", &kor);
printf("\n영어 점수를 입력하고 Enter를 누르세요=>");
scanf("%d", &eng);
printf("\n수학 점수를 입력하고 Enter를 누르세요=>");
scanf("%d", &mat);
printf("\n과학 점수를 입력하고 Enter를 누르세요=>");
scanf("%d", &sci);
total = kor + eng + mat + sci;
avg = total/4.0;
printf("\n%s의 총점은 %d이고, 평균은 %.2f입니다.\n", name, total, avg);
printf("\n현재 시각: %s\n", __TIMESTAMP__);
}
연산자(operator)
변수 또는 상수에 대하여 무엇인가를 행하도록 하는 단어나 기호
피연산자(operand)
연산자가 연산을 하는 대상
| 연산자 | 예 |
| 단항(unary) | ++a, x--, +3, -2 |
| 2항(binary) | a+b, x*y, 2/3 |
| 3항(ternary) | max=(a>b)?a:b |
토큰
- C 프로그램을 구성하는 기본 단위
- 예약어(reserved word, keyword) : int, if 등 44개
- 연산자(operator) : +, / 등 40여 개
- 구두점(punctuator) : [], () 등 50여개(40여 개는 연산자로 사용)
- 식별자(identifier) : 변수, 함수, 배열, 구조체 등의 이름
- 리터럴(literal) : 10, 3.5, ‘a’, “hi”
구두점
- 토큰을 구분하기 위해 사용하는 기호로 50여 개가 있는데 40여 개는 연산자로 사용
- [], (), {}, *, 콤마(,), ;, =, :,..., “”
연산자의 우선순위
괄호 (중첩시 내부괄호 우선), 사칙연산, 대입 연산자, 콤마연산자
결합성(associativity)
우선순위가 같은 연산자의 결합 방향

산술 연산자
+ (덧셈), - (뺄셈), * (곱셈), / (나눗셈), % (나머지)
대입 연산자
"변수=수식"과 같이 수식의 값을 변수에 대입하는 연산자
- a = 10;
- a = b;
- a = b + c;
- a라는 변수에 b변수의 값과 c변수의 값을 더한 값을 대입
- x = y = 10
- y=10 먼저하고 x=y
혼합 대입 연산자
산술 연산자와 대입 연산자를 혼합
변수=변수+수식; -> 변수+=수식;
-=, *=, /=, %=, <<=, >>=, &=, ^=, |=
- a=a+5; a+=5; // a의 값을 5 증가
- x=x-3; x-=3; // x의 값을 3 감소
- num=num*2; num*=2; // num의 값을 2배
- total=total/2; total/=2; // total 값을 나누기 2
- a=a+1; a+=1; a++; ++a; // a의 값을 1 증가
- a=a-1; a-=1; a--; --a; // a의 값을 1 감소
관계 연산자
루프(loop)나 조건문(if) 등에서 크기나 조건 등을 비교할 때 사용하는 연산자
결과가 참이면 1, 거짓이면 0
정수형과 실수형 뿐만 아니라 문자형 데이터도 대소 관계를 비교 가능
<, <=, >, >= : 크기 비교
== : 같은지 비교
!= : 다른지 비교
논리 연산자
&& (AND), || (OR), ! (NOT)
&&와 ||는 두 개의 피연산자가 필요
!연산자는 한 개의 피연산자 필요
| a b | a && b | a || b | !a |
| F F | F | F | T |
| F T | F | T | T |
| T F | F | T | F |
| T T | T | T | F |
관계 연산자+논리 연산자
score값이 90이상~95 미만이면 A출력
- if(90<=score<95) : x
- if(score>=90 && score<95) : O
비트 연산자(bitwise operator)
수를 2진수로 바꾼 후 비트별로 연산
프로그램의 용량을 줄이고 속도를 높임
사용 예시
- 특정 비트 값을 빠르게 읽거나 수정
- 파일 압축 및 암호화
- IP 주소를 변환하거나 검사하는 작업
- 하드웨어 레지스터 값을 읽거나 쓸 때
| 연산자 | 의미 |
| a&b | a와 b를 2진수로 표현한 후, 비트 단위로 AND 특정 비트를 0으로 변경하는 mask off |
| a|b | a와 b를 2진수로 표현한 후, 비트 단위로 OR 특정 비트를 1로 변경하는 용도로 많이 사용 |
| a^b | a와 b를 2진수로 표현한 후, 비트 단위로 XOR 두 비트가 다른 경우에만 1이 됨(caret) |
| ~a | a의 1의 보수 0을 1로, 1은 0으로 바꿈(tilde) |
| a b | a & b | a | b | a ^ b | ~a |
| 0 0 | 0 | 0 | 0 | 1 |
| 0 1 | 0 | 1 | 1 | 1 |
| 1 0 | 0 | 1 | 1 | 0 |
| 1 1 | 1 | 1 | 0 | 0 |
비트 연산자 예
#include <stdio.h>
int main(void)
{
int a=0x1; //2진수 0000 0000 0000 0000 0000 0000 0000 0001,16진수 0000 0001
int b=0x3; //2진수 0000 0000 0000 0000 0000 0000 0000 0011, 16진수 0000 0003
printf("%x\n",a&b); //0000 0000 0000 0000 0000 0000 0000 0001
printf("%x\n",a|b); //0000 0000 0000 0000 0000 0000 0000 0011
printf("%x\n",a^b); //0000 0000 0000 0000 0000 0000 0000 0010
printf("%x\n",a^b^b); //0000 0000 0000 0000 0000 0000 0000 0001
printf("%x\n",~a); //1111 1111 1111 1111 1111 1111 1111 1110
printf("%x\n",~b); //1111 1111 1111 1111 1111 1111 1111 1100
return 0;
}
10 : 0000 0010 ^ 0000 0011이므로 0000 0001이 되어 %x(16진수)로 출력하면 1이 나옴. 어떤 수(1)를 키값(3)으로 XOR하여 암호화(2)하고 다시 키값으로 XOR를 다시 한번 하면 원래 수(1)로 복호화할 수 있음
비트 연산자 지원 언어 (뤼튼)
- C/C++: C와 C++ 언어는 비트 연산자를 포함하고 있으며, 이들은 시스템 수준의 프로그래밍과 하드웨어 직접 제어에 널리 사용됩니다. 비트 AND(&), OR(|), XOR(^), NOT(~), 비트 시프트(<<, >>) 등의 연산자를 지원합니다.
- Java: Java 역시 비트 연산자를 지원합니다. 자바는 객체 지향 프로그래밍 언어이지만, 시스템의 낮은 수준에서 데이터를 처리할 필요가 있을 때 비트 연산자를 사용할 수 있습니다.
- Python: Python에서도 비트 연산자를 사용할 수 있습니다. 비록 Python이 높은 수준의 언어이지만, 특정 애플리케이션에서 비트 레벨에서의 데이터 처리가 필요할 때 유용하게 사용됩니다.
- C#: C#에서도 비트 연산자를 사용할 수 있으며, .NET 프레임워크와 함께 Windows 환경에서 시스템 프로그래밍을 할 때 유용합니다.
- JavaScript: 웹 개발에서 주로 사용되는 JavaScript도 비트 연산자를 지원합니다. 웹 애플리케이션에서 비트 레벨의 연산이 필요할 때 사용할 수 있습니다.
- Rust: 시스템 프로그래밍에 초점을 맞춘 Rust 언어도 비트 연산자를 지원합니다. Rust는 메모리 안전성을 보장하면서도 성능을 최적화할 수 있게 해주는 언어입니다.
- Go: Go 언어는 간결함, 효율성 및 병렬 처리 능력을 강조하며, 비트 연산자를 포함하여 다양한 연산자를 지원합니다.
비트 시프트(bitwise shift) 연산자
우측의 숫자만큼 좌측 혹은 우측으로 비트를 시프트
양의 정수의 경우 좌측(<<시프트 연산자)으로 한 비트씩 시프트시킬 때 마다 원래 값의 두 배
우측(>>시프트 연산자)으로 한 비트씩 시프트시킬 때 마다 원래 값의 1/2배
시프트시킬 때 빠져나가는 비트가 1이면 overflow나 underflow가 발생하여 2 n배의 곱이나 나누기가 되지 않음
| 시프트 연산자 | 의미 |
| a<<b | a를 2진수로 표현한 후, b 비트만큼 왼쪽으로 이동 정보의 손실이 없으면 2^b이 곱해짐 |
| a>>b | a를 2진수로 표현한 후, b 비트만큼 오른쪽으로 이동 정보의 손실이 없으면 2^b이 나누어짐 |
시프트 연산자 예
#include <stdio.h>
int main(void)
{
printf("%d ",90<<1); //180
printf("%d ",90*2); //180
printf("%d ",90<<2); //360
printf("%d ",90<<3); //720
printf("%d\n",90<<4); //1440
printf("%d ",90>>1); //45
printf("%d ",90/2); //45
printf("%d ",90>>2); //22
printf("%d\n",90>>3); //11
return 0;
}
5 : 4행과 결과가 같음. 즉 2의 배수 곱셈은 시프트 연산자로도 구현할 수 있음. 일반적으로 컴퓨터는 곱셈 연산보다 시프트 연산을 훨씬 간단하게 수행하므로 2의 배수의 곱셈은 시프트 연산을 이용하면 실행속도 측면에서 상당히 유리
12 : 90>>2는 90/4이므로 22가 출력됨. 최하위 비트 1이 빠져나가 0.5는 사라짐
삼항 조건 연산자 ( ? : )
항이 3개여서 3항 연산자라고도 하며 if~else문을 한 줄로 간결하게 표현할 수 있음
수식1 ? 수식2 : 수식3
수식1의 조건이 참이면 수식2를 실행하고, 거짓이면 수식3을 실행
i가 j보다 크면 i가 max에 대입되고 작으면 j가 max에 대입
- (i>j) ? i : j; //i>j이면 i, 아니면 j
- max=(i>j) ? i : j;
- if(i>j) max=i;
else max=j;
삼항 조건 연산자 예
#include <stdio.h>
int main(void)
{
int i=2, j=4,min;
printf("%d\n",(i<j) ? i : j);
min = (i<j) ? i : j;
printf("%d\n",min);
if(i<j) min = i;
else min = j;
printf("%d\n",min);
return 0;
}
삼항 조건 연산자 지원 언어 (뤼튼)
- C/C++: C와 C++ 언어에서는 삼항 연산자가 조건 ? 표현식1 : 표현식2의 형태로 사용됩니다.
- Java: Java에서도 조건 ? 표현식1 : 표현식2 형태의 삼항 연산자를 지원합니다.
- JavaScript: JavaScript에서 삼항 연산자는 조건부 로직을 간결하게 표현하는 데 자주 사용됩니다.
- C#: C#에서 삼항 연산자는 조건 ? 표현식1 : 표현식2 형태로 사용되며, 조건에 따라 값을 선택하는 데 유용합니다.
- PHP: PHP에서 삼항 연산자는 조건 ? 표현식1 : 표현식2 형태로 사용되며, 조건부 할당에 유용합니다.
- Swift: Swift에서는 삼항 조건 연산자를 사용하여 간결한 조건문을 작성할 수 있습니다.
- Perl: Perl에서도 조건 ? 표현식1 : 표현식2 형태의 삼항 연산자를 지원합니다.
- Ruby: Ruby에서 삼항 연산자는 조건 ? 표현식1 : 표현식2 형태로 사용됩니다.
- Python: Python은 다른 언어와 다르게 조건 if 표현식1 else 표현식2 형태의 조건 표현식을 사용하여 비슷한 기능을 제공합니다.
증가, 감소 연산자
산술 연산자로 피연산자가 하나인 단항 연산자
- 피연산자 앞에 쓰는 경우는 전치(전위, prefix)
- ++a : a를 1 증가시킨 후 수식 평가
- --a : a를 1 감소시킨 후 수식 평가
- 피연산자 뒤에 쓰는 경우는 후치(후위, postfix)
- a++ : 수식을 평가한 후 a를 1 증가
- a-- : 수식을 평가한 후 a를 1 감소

변수 a의 값을 1 증가 시키는 방법
- a++;
- ++a;
- a = a + 1;
- a += 1;
중간고사