햄깅이의 C언어

[햄깅이의 C언어] Chapter 5 / 연산자와 연산식

chohaeminn 2024. 7. 16. 15:26

본 포스팅은 Perfect C, C언어로 배우는 프로그래밍 기초 책을 기반으로 공부한 자료입니다.
다른 포스팅을 참고한 자료는 모두 출처를 남겨놓았습니다

5.1 연산자와 다양한 연산자 

 

연산식과 연산자 분류

 

수학에서 사용하는 (3+4*5)와 같은 연산 표현을 수식이라고 하듯이, 프로그래밍 언어에서도 덧셈과 뺄셈과 같은 다양한 연산자와 수 그리고 변수를 사용해 수식을 표현할 수 있다.

 

변수와 다양한 리터럴 상수, 그리고 함수의 호출 등으로 구성되는 표현 식을 연산식이라고 한다. 
연산식은 항상 하나의 결과값을 가진다.
연삭식은 연산자 (+,-...)와 피연산자(연산에 참여하는 변수나 상수)로 구성된다. 

 

 

 


다양한 연산자

 

다양한 재료에 따라 필요한 믹서기도 다양하다.

 

연산자는 연산에 참여하는 피연산자의갯수에 따라, 단일항, 이항, 삼항 ... 연산자로 나눌 수 있다. 

 

1) 단항연산자: 부호를 표시하는 +, - , *, / ...
2) 이항연산자: 사칙 연산의 +,-, * ...
3) 삼항연산자: 조건연산자 ?:
4) 전위연산자: ++a 처럼 연산자가 앞에 있으면 전위연산자이다.
5) 후위연산자: a++ 처럼 연산자가 뒤에 있으면 후위연산자이다. 


산술연산자와 부호연산자

산술연산자란?
+, -, *, /, %로 각각 더하기, 빼기, 곱하기, 나누기, 나머지 연산자이다. 

산술연산자는 정수형 or 실수형이 가능하다. 

 

나머지 연산자 %의 피연산자는 반드시, 정수여야한다.

다음은 곱하기와 나누기, 나머지 연산자 활용의 예제이다. 

 


부호연산자 +, -

 

항이 하나인 단항 연산자 +, - 는 피연산자의 부호를 나타내는 연산자이다.

부호연산자 +, - 는 피연산자 앞에 위치한다는 의미로 전위연산자로 분류한다.

 

 


대입연산자 = 

 

대입연산자는 =으로 연산자 오른쪽 연산식 결과값을 왼쪽 변수에 저장하는 연산자이다.

 

대입연산자의 왼쪽 부분에는 반드시 하나의 변수만이 올 수 있다.

대입연산자의 왼쪽 변수를 l-value라고 하며, 오른쪽 변수를 r-value라고 한다. 

 

다음은 대입연산자 활용의 예시이다. 


축약 대입연산자

 

산술연산자에 대입연산자를 이어붙인 연산자 +=, -=, *=, %=을 축약연산자라고 한다. 

 

 

다음은 5개의 축약 대입연산자와 그 사용의 예를 나타낸 그림니다. 

다음은 복합대입연산자 활용의 예시이다.


증감연산자 ++, - 

 

프로그램에서 이 사용하는 문장 중의 하나가 변수 값을 1 증가시키거나 1 감소시키는 n = n-1이나, n= n+1이다. 

 

증가연산자 ++와 감소연산자 --는 변수 값을 각각 1 증가시키고, 1 감소시키는 기능을 수행한다. 
n++처럼, 연산자 ++가 피연산자 n보다 뒤에 위치하는 후위이면 1 증가 되기 전 값이 연산 결과값이다.
++n과 같이 전위이면 1 증가된 값이 연산 결과 값이다.  

다음은 증감연산자 ++와 감소연산자 --의 예제이다. 

아래는 연산자 /와 %를 사용한 지폐 계산 방법의 예시이다.


5.2 관계와 논리, 조건, 비트연산자

 

두 피연산자의 크기 비교

 

관계연산자는 두 피연산자의  크기를 비교하기 위한 연산자이다.
관계연산자의 연산값은 비교 결과가 침이면 0, 거짓이면 1이다. 

 

다음 표와 같이 모두 6가지로서 두 개의 문자로 구성되는 관계연산자 기호 사이에는 공백문자가 없어야한다. 

소문자는 대문자보다 모두 크다. 

다음은 관계 연산 활용의 예시이다. 

 


논리연산자

 

C언어는 세 가지의 논리연산자 &&, ||, !을 제공한다.

논리연산자 &&, ||, !은 각각 and, or, not의 논리연산을 의미하며,
그 결과가 참이면 1, 거짓이면 0을 반환한다. 

C언어에서 참과 거짓의 논리형은 따로 없으므로, 0, 0.0, \0은 모두 거짓을 의미하며,
0이 아닌 모든 정수와 실수, 그리고 널 문자 '\0'이 아닌 모둔 문자와 문자열은 모두 참을 의미한다. 

 

다음은 논리 연산자 && || ! 의 활용이다.


단축평가

 

논리연산자 &&와 ||는 피연산자 두 개 중에서

왼쪽 피연산자 만으로 논리연산 결과가 결정된다면 오른쪽 피연산자는 평가하지 않는다.
이러한 평가방식을 단축평가라고 하며, 연산의 효율을 높일 수 있다. 

다음은 &&연산자로 일정액 이상의 구매액에 대해 쿠폰 발행과 할인계산의 예이다. 

 


조건연산자, 연산자 ?:

 

 

조건연산자는 조건에 따라 주어진 피연산자가 결과값이 되는 삼항연산자이다. 

 

다음은 조건 연산자의 활용의 예제이다.


비트연산자

 

이미 알고 있듯이 컴퓨터 정보의 최소단위는 비트로, 모든 정수도 내부 비트 정보를 갖고 있다.

C언어는 비트 단위의 다양한 데이터 처리 방법을 제공하는데, 특히 정수의 비트 중심 연산자를 제공한다.

정수에 대한 비트 중심 연산자로 비트 논리 연산자와 이동연산자가 제공된다. 

 


비트 논리연산자

 

비트 논리 연산자는 피연산자 정수 값을 비트 단위로 논리 연산을 수행하는 연산자로, &, |, ^, ~ 4가지이다.

 

- 비트 논리 연산자에 이용되는 피연산자 자료형은 정수형은 해당하는 char, int, long, long long, 이면 가능하다.
- 비트 연산은각 피연산자 int 형으로 반환하여 연산하며 결과도 int 형이다. 

다음은 비트 연산자 & | ^ ~의 예시이다.


비트 이동연산자

 

어릴 적 학교에서 오른쪽 또는 왼쪽으로 줄줄이 자리 이동을 한 경험이 있을 것이다.

바로 비트이동연산자 >>, <<는 연산자의 방향인 왼쪽이나 오른쪽으로,
비트단위로 줄줄이 이동시키는 연산자이다. 

위 그림과 같이 <<와 >>은 각각 오른쪽과 왼쪽에 빈 자리가 생기며, 

LSB로 불리는 오른쪽 빈 자리는 모두 0으로 채워지며,

MSB라고 불리는 왼쪽 빈자리는 원래의 부호에 따라 0또는 1이채워진다. 

 

아래는 비트 이동 연산자의 예시이다.

 

아래는 비트 xor 연산자 ^를 사용한 암호화와 복호화 예제이다.


5.3 형변환 연산자와 연산자 우선순위

 

내림변환과 올림변환

 

자료형 char와 int는 각각 문자와 정수를 표현하고, 각각 1 바이트와 4바이트로 크키도 다르다.

이러한 char 형과 int 형 사이에서 필요에 따라 자료의 표현방식을 바꾸는 것을 자료형 변환이라고 한다. 
<자료 크기의 범주 변환에 따른 구분>
- 올림변환: 작은 범주의 자료형에서 보다 큰 범주인 형으로의 형변환 방식
- 내림변환: 큰 범주의 자료형에서 보다 작은 범주으로의 형 변환방식

<자료형 변환 구분 방식>
-명시적(강제) 형변환: 소스에서 직접 형변환 연산자를 사용하는 방식
-묵시적(자동) 형변환: 컴파일러에서 알아서 자동으로 수행하는 방식

표현식에서 피연산자의 자동 올림변환

 

산술 연산에서 피연산자의 자료형이 서로 다른 경우, 피연산자들은 동일한 자료형으로 자동 변환된어 연산이 수행된다.

즉 7 + 5.2에서 피연산자는 자동으로 모두 double로 자동변환되어 연산식 7.0+5.2가 수행된다.

 

이와 같이 작은 범주의 int 형에서 보다 큰 범주인 double 형으로의 형변환을 올림변환 이라고 한다. 

 

올림변환은 형 넓히기로도 불리며, 정보의 손실이 없으므로 컴파일러에 의해 자동으로 수행될 수 있다.

이와 같이 컴파일러가 자동으로 수행하는 형 변환을 묵시적 형변환 이라고 부른다. 

 


내림변환

 

올림변환과 반대로 대입연산 int a = 3.4에서는 내림변환이 필요하다.

즉 변수 a는 int형이며, 저장하려는 자료는 double이므로 바로 대입연산을 수행할 수 없다.

 

이와 같이 저장되는 변수의 자료형이 저장 값과 자료형이 다르면 변수의 자료형으로 변환되어 저장된다.

 

즉 3.4는 int형인 3으로 저장된다.

 

그러나 컴파일러가 스스로 시행하는 묵시적 내림변환의 경우 정보의 손실이 일어날 수 있으므로 경고를 발생시킨다.


형변환 연산자

 

명시적 형변환자 (type)

 

형변환 연산자 (type) 피연산자는 뒤에 나오는 피연산자의 값을 괄호에서 지정한 자료형으로 변환하는 연산자이다.  이와 같이 형변환 연산자를 사용한 방식을 명시적 형변화이라고 한다. 

 

일반적으로 내림변환에서는 형변환 연산자를 사용하여 내림변환을 직접 수행해야한다.

형변환 연산자는 내림변환을이나 올림변환 모두 이용이 가능하다. 

단항 연산자인 형변환 연산자는 모든 이항연산자보다 먼저 계산한다.  

아래는 형변환 연산자와 산술연산자의 사용의 예시이다.


sizeof 연산자와 콤마 연산자

 

sizeof 연산자

 

sizeof 연산자는 연산값 또는 자료형의 저장장소의 크기를 구하는 연산자이다.

연산자 sizeof의 결과값은 바이트 단위의 정수이다.

 

연산자 sizeof는 피연산자가 int와 같은 자료형인 경우 반드시 괄호를 사용해야한다. 

연산자 sizeof의 반환 값은 메모리 공간의 크기로 자료형 size_t이며, printff()에서 형식제어문자 %zu로 출력한다.

자료형 size_t는 64비트 시스템에서 unsigned long long과 같으며,

형식제어문자 %zu에서 z는 size를 u는 unsigned를 의미한다. 

 


콤마 연산자 ,

 

콤마연산자, 는 왼쪽과 오른쪽 연산식을 각각 순차적으로 계산하며
결과값은 가장 오른쪽에서 수행한 연산의 결과이다. 

간단히 연산자 2,4 의 결과값은 4이다.

 

콤마연산자가 연속으로 나열된 식에서는 마지막에 수행된 가장 오른쪽 연산식의결과가 전체 식의 결과값이 된다.  

 

 

콤마 연산자는 연산의 우선순위가 가장 늦에 대입연산자보다 나중에 계산된다.

 

그러므로 연산식 x= 3+4, 2*3은 대입연산자를 먼저 수행하는 (x=3+4), 2*3을 수행하여 콤마연산의 결과값은 6이며 x에는7이 저장된다.

 

그러나 괄호를 사용한 연산식 x= (3+4, 2*3)에서는 콤마연산자의 결과인 6이 변수 x 에 저장된다.

 

 

아래는 연산자 sizeof와 콤마 연산자의 활용의 예제이다.


복잡한 표현식의 계산

 

연산자 우선순위와 결합성

 

일반적으로 여러 연산자가 사용된 수식의 계산에는 다음과 같은 규칙이 적용되어 계산된다.

 

- 첫 번째 규칙은 괄호가 있으면 먼저 계산하며,
- 두 번째 규칙으로 연산의 우선순위이며.
- 세번째 규칙으로 동일한 우선순위인 경우, 연산을 결합하는 방법인 결합성이다. 

 

 

C언어에서 사용되는 연산자의 우선순위와 동일한 우선 순위에서의 결합성을 알아보면 다음 표로 요약된다.

다음은 연산자 우선순위에 의한 계산의 예이다.


결합성

 

연산자의 결합성은 대부분 좌에서 우 (-->)로 수행하나, 우선순위가 2위인 단항연산자,
우선순위 14위인 조건연산자 그리고 15위인 대입연산자는 우에서 좌로 (<--)로 수행한다.

 

 

그러므로 산술연산식 10*3/2는 ((10*3)/2)로 계산해 결과는 15이다.

그러나 축약연산자로 구성된 n+=m/=3은 우에서 좌로(<--)로 먼저 결합해 식 (n+=(m/=3))을 수행한다.

 

다음은 연산자의 결합성에 따른 계산순서 확인 예제이다. 

다음은 섭씨온도를 화씨 온도로 변환해 출력하는 예제이다.

실수 값이 나오려면 꼭 ! (9/5)가 아닌 (9.0/5.0)(실수로)로 해야한다. 

 

이렇게 5단원도 끝이 났다!!!

14단원까지 어떻게 다 하지..

흑흑...

최선을 다해서 해보겠다..

 

그러면 앙뇽!!!