내용 참고
YES C (정보공학연구소/생능출판사)
혼자 연구하는 C/C++ (SoEn.kr /와우북스)
연산자(Operator)
Ⅰ. 연산자(operator)의 구분
C언어에서 연산자란 컴파일러가 하나 이상의 메모리에 저장된 값에 대해서 특정한 행동을 수행하도록 알려주는 기호를 의미한다.
ⅰ. 대략적인 분류
■ 피연산자의 개수에 따른 분류 : 단항 연산자, 이항 연산자, 삼항 연산자.
■ 기능에 따른 분류 : 산술, 관계, 부호, 증감, 비트 논리, 값 논리, 대입, 삼항 조건 등등
ⅱ. 연산자의 특징
■ 연산을 하기 위해서는 기본적으로 피연산자들의 자료형이 같아야 한다.
■ 만약 서로 다른 자료형끼리 연산을 하려 할 경우 컴파일러는 기본적으로 경고를 표시한다.
■ 경고를 표시하긴 하지만 C언어는 서로 다른 자료형끼리의 연산을 금지하고 있지는 않다.
■ 그러므로 컴파일러는 좀 더 표현 범위가 큰 자료형으로 자동형 변환을 시킨 후 연산을 한다.(ex. 정수 자료형 -> 실수 자료형)
■ 이때, 표현방식의 차이나 자료형의 크기 차이로 인한 오차가 생길 수도 있으니 주의해야 한다.
Ⅱ. 기본 연산자(operator) 설명
다음은 C언어의 교재들에서 기본적으로 설명하는 연산자들이다.
생각보다 양이 많다. 자주 사용하는 것 위주로 천천히 공부하자.
ⅰ. 산술 연산자
■ 산술 연산자는 모두 피연산자의 수가 2개인 이항 연산자이다.
■ 산술 연산자는 모두 결합 순서가 왼쪽에서 오른쪽이다.
■ 피연산자들의 자료형이 같을 경우에는 결과도 그 자료형으로 반환된다.
■ 피연산자들의 자료형이 다른 경우에는 자동형 변환이 되므로 결과는 표현 범위가 더 큰 자료형으로 반환된다.
■ 단 나머지 연산자는 피연산자로 정수만을 받으므로 결과도 항상 정수로 반환된다.
■ 또한 나누기 연산자의 피연산자로 정수들을 사용하면 결과가 정수로 반환되며 나머지를 버린 몫만 반환된다.
■ 이때 정수 값끼리의 연산이지만 결과는 실수로 확인하고 싶다면 피연산자를 실수로 명시적 형 변환을 해야 한다.
■ 결괏값이 결괏값의 자료형의 범위를 벗어난 경우 오버플로우나 언더플로우가 일어날 수 있다.
■ 곱하기는 ×가 아닌 *로, 나누기는 ÷가 아닌 /로, 나머지 연산은 mod가 아닌 %로 표시한다.
ⅱ. 관계 연산자
■ 관계 연산자는 모두 피연산자의 수가 2개인 이항 연산자이다.
■ 관계 연산자는 좌변의 값과 우변의 값의 관계를 참(1)과 거짓(0)으로 반환하는 연산자이다.
■ 참고로 C언어에서는 0 이외의 모든 수가 참을 나타낸다. (실수나 음수도 참을 나타냄)
■ 관계 연산자를 연속해서 사용할 경우 왼쪽부터 결합되긴 하지만 주로 논리 연산자와 함께 사용한다.
■ 일반적으로 알고 있는 수학적인 관계를 표현하려면 논리 연산자와 함께 사용해야 한다.
■ 비교하려는 데이터의 데이터 타입을 일치시킬 필요가 있다.
■ 비교하려는 데이터의 데이터 타입이 서로 일치하지 않을 경우 컴파일러는 경고를 한 후 자동형 변환해서 비교한다.
■ == 연산자와 = 연산자는 혼동해서 실수하기 쉽기 때문에 i == 8의 형식이 아닌 8 == i라는 형식으로 쓰는 걸 추천한다.
■ 그래야지 대입 연산인지 비교 연산인지 구분하기 쉽기 때문이다.
ⅲ. 부호 연산자
■ 부호 연산자는 모두 피연산자의 수가 1개인 단항 연산자이다.
■ 부호 연산자는 오른쪽부터 결합되기 때문에 항상 피연산자의 왼쪽에 써줘야 한다.
■ +부호 연산자는 -부호 연산자와의 대칭성을 위해서 존재하지만 거의 생략된다.
■ -부호 연산자를 연속으로 쓴 -- 기호는 -1을 2번 곱하라는 뜻이 아니라 증감 연산자의 하나로 정의되어 있다.
■ 대신에 띄어쓰기나 괄호 등을 적용해서 한 변수에 여러 번 적용하는 것은 가능하다.
ⅳ. 증감 연산자
■ 증감 연산자는 모두 피연산자의 수가 1개인 단항 연산자이다.
■ 증감 연산자를 피연산자의 좌측에 쓰는 것을 전위 증감 연산자라고 한다.
■ 증감 연산자를 피연산자의 우측에 쓰는 것을 후위 증감 연산자라고 한다.
■ 증감 연산자는 대입이 동시에 이루어지는 연산이므로 좌변 값(즉 변수)에만 사용할 수 있다.
■ 증감 연산자는 띄어쓰기나 괄호 등을 이용해도 한 변수에 여러 번 적용할 수 없다.
■ 전위 증감과 후위 증감에 따라 값이 달라질 수 있으므로 조심해서 구분해야 한다.
ⅴ. 비트 논리 연산자
■ 비트 논리 연산자는 피연산자에 대한 비트(2진수) 단위 논리 연산을 수행하는 연산자를 의미한다.
■ 비트 논리 연산자의 피연산자로는 정수형 자료형만 올 수 있다.
■ 비트 논리 연산자의 결과는 2진수나 8진수, 16진수 등으로 표현하는 경우가 많다.
■ 각 논리 연산에 대한 설명은 사실상 이산수학의 영역이므로 생략한다.
■ 이를 이용하여 비트 단위로 데이터를 이용하는 방법들이 있다.
ⅵ. 값 논리 연산자
■ 값 논리 연산자는 피연산자의 진리값에 대한 논리 연산을 수행하는 연산자를 의미한다.
■ 값 논리 연산자는 주로 조건문에서 조건들을 연결할 때 사용한다.
■ && 연산자는 논리곱, || 연산자는 논리합이라고도 부른다.
■ 수학에서 자주 사용하는 10 > a > 5 같은 표현은 C언어에서는 (10 > a) && (a > 5)의 형태로 표현한다.
ⅶ. 대입 연산자 (= 할당 연산자)
■ 일반 대입 연산자(= 연산자)를 제외한 다른 연산자들은 복합 대입 연산자라고 부른다.
■ 대입 연산자의 좌변에는 좌변 값(=변수)만 올 수 있다.
■ 우변에는 값을 리턴하는 수식이라면 제한이 없다.
■ 하지만 복합 대입 연산자는 합쳐진 다른 연산과 같은 제약 조건을 갖는다.
■ 대입 연산자의 리턴 값은 대입된 이후의 좌변 값과 같다. (a = b = c 가 가능한 이유이다.)
■ 복합 대입 연산자는 연산 순위가 낮은 편(16단계 중 15단계)이므로 간단한 수식에서만 사용하는 것을 추천한다.
ⅷ. 삼항 조건 연산자
■ 피연산자를 3개 필요로 하는 유일한 연산자이기 때문에 간단하게 삼항 연산자라고도 불린다.
■ if-else문과 동일한 원리로 작동하며 간단한 if-else문은 삼항 연산자로 표현하는 게 더 깔끔하다.
■ 삼항 조건 연산자는 다른 변수에 값을 저장할 필요 없이 바로 수식 내에 쓸 수 있다는 장점이 있다.
■ 삼항 조건 연산자는 재정의 할 수 없다.