TeamH4C_ProjectH4C/프로그래밍 언어

[TeamH4C_C언어] 언어의 계산

P4P3R_H 2021. 2. 21. 06:50

이번에는 연산에 대하여 정리하겠습니다.

일반적인 수학 연산과 비슷하며 몇몇의 내용만 프로그램적인 내용이 존재합니다.

 

사칙연산

덧셈과 뺄셈, 일반적인 연산의 경우 계산의 결과대로 출력됩니다. 계산에서 오차가 생길 수 있는데 더 큰 자료형으로 선언하거나 자료형에 맞도록 계산하면 됩니다.

프로그래밍에서는 변수의 값에서 하나의 값을 더하거나 뺄 수 있으며 여러 가지 계산을 활용할 수 있습니다. 변수 = 변수 + 값의 형태로 자기 자신의 값을 변화시키는 형식입니다. 식을 단축하여 [변수 += 값;]의 형태로 단축이 되며 다른 연산도 가능합니다.

여기서, 여러 연산이 있을 때, 연산의 순서는 다음과 같습니다.

증가 감소 연산을 간단히 표현할 수 있는데 증가, 감소 연산자를 통해 가능합니다.

++, --를 통해 정수 부분의 값을 1 더하고 빼는 연산을 수행하고 포인터 연산에서 자료형의 크기만큼 증가하고 감소시키기도 합니다. 변수 앞과 뒤에 붙어 변수에 값이 먼저 더해지는 것과 계산이 된 후 값이 더해지는 것으로 나뉩니다.

변수 앞에 있어 먼저 1이 더해지는 것을 전위(prefix) 연산자라 하며 뒤에 있어 식이 계산된 후 1이 더해지는 것을 후위(postfix) 연산자라고 합니다.

일반적인 연산과 다른 연산이 하나 더 존재하는데 모듈러 연산입니다. 모듈러 연산은 나머지 연산으로 %를 이용하여 연산하는 것입니다. % 연산은 나눴을 때의 나머지를 구할 때 사용되며 특정 수의 배수를 구할 때 자주 사용됩니다.

 

자료형의 연산

서로 다른 자료형끼리 연산이 될 수 있습니다. 이때 정해진 규칙에 따라 연산이 되는데 표현 범위가 넓은 범위로 자동 형 변환되며 계산됩니다.

여기서 표현 범위가 작은 곳에 계산 결과를 저장하여 출력하면 값들이 버려지면서 원하는 값이 출력되지 않을 가능성이 있습니다. 다음은 형의 확장에 대한 그림입니다.

 

조건문

특정 조건일 때 조건문을 실행하는 코드는 if함수를 사용하여 만들면 됩니다. 특정 조건일 때 계산이 되도록 하는 형식의 문제가 많습니다.

if (조건식)
{
    코드; /*조건식이 만족할 때 실행되는 코드*/
}

이처럼 if 조건식 뒤에는 세미콜론(;)이 붙지 않습니다. if조건식의 문장 문법이 여러 줄이기 때문입니다. 코드에는 세미콜론이 붙어도 if문에는 붙지 않는 것을 유의하며 올바른 위치에 붙여야 합니다.

중괄호도 조건 충족 코드가 하나일 때는 생략이 가능하지만 여러 개일 때는 코드를 묶는 형식으로 중괄호가 필요합니다.

조건문은 else를 이용하여 조건식이 만족하지 않을 때 분기(branch)하도록 만들 수 있으며 else는 if와 함께 사용되며 if문 끝에 위치해야 합니다. 또한 else if를 사용함으로 조건을 여러 개로 지정하여 비교하도록 할 수 있습니다. 여러 조건을 비교하여 출력할 때는 논리 연산자를 사용하여 비교하여도 됩니다. 논리 연산자는 기본적으로 and(&&), or(||)이 존재합니다.

여기서 조건문의 조건식이 참일 때 코드가 실행되는데 숫자 0이 아닌 수는 모두 참이므로 조건식에 0을 제외한 숫자가 오면 코드가 실행되게 됩니다. 또한, 조건식에 할당식을 넣어 실행할 수 있기에 비교의 같다(==)와 할당의 할당(=)을 혼동하지 않도록 하여 사용해야 합니다.

 

비교 & 삼항 연산

비교 연산은 조건문, 반복문에 사용됩니다. 비교 연산자는 간단히 다음과 같습니다.

C언어에서 비교 연산자가 참이면 1, 거짓이면 0을 출력합니다. 비교 연산자로 실수의 계산 결과를 같다(==) 연산으로 비교하는 것은 오류가 있을 수 있습니다.

삼항 연산도 사용을 하는데 삼항 연산은 if와 else의 축약형으로 볼 수 있습니다. 조건부 연산자라 부르며 물음표(?) 앞의 조건식이 참이면 콜론(:) 앞의 값을 반환하고 거짓이면 뒤의 값을 반환하는 연산입니다.

삼항 연산은 [(조건) ? (조건이 참일 때 수행) : (조건이 거짓일 때 수행);]으로 함수 안에서도 실행이 가능합니다.

 

논리 연산

논리 연산은 조건식이나 값을 논리적으로 판단합니다. 조건문에서 논리 연산을 잠깐 다뤘는데 C언어에서는 논리 값 거짓은 0이고, 참인 값은 대표적으로 1을 사용합니다.

and 연산은 두 값이 참일 때 참이 나오는 연산이며, or연산은 두 값 중 하나의 값만 참이어도 참이 나오는 연산입니다. 마지막으로 not연산은 변수나 값 앞에 !를 붙여 참과 거짓의 결과를 뒤집는 연산입니다.

논리 연산을 불(bool) 자료형으로 사용할 수 있는데 <stdbool.h> 헤더 파일을 사용하면 됩니다. 불 자료형은 true와 false를 입력하여도 1과 0으로 표현해주는 기능을 가지고 있습니다. 논리 자료형이라 하며 bool 자료형을 통해 true와 false를 저장할 수 있습니다.

불 자료형의 크기는 1byte로 논리 연산과 조건문, 반복문에 사용될 수 있습니다.

 

비트 연산

비트 연산은 비트 단위로 연산하는 연산자로 bit인 2진수로 연산됩니다. 다음은 비트 연산의 종류입니다.

비트 연산에서는 and(&)와 or(|), xor(^)이 대표적이며 and는 값이 모두 1일 때만 1이 되는 것이고, or은 둘 중 하나라도 1이면 1이 되며, xor은 둘 중 하나만 1이어야 1이 되는 것입니다. 아래에 간단한 표로 표현할 수 있습니다.

그 외에도 비트 not(~), 시프트(<<,>>)연산이 있습니다. not연산은 0은 1로 1은 0으로 바꾸는 연산이고, 시프트 연산은 비트의 각 자리를 이동시키는 연산입니다. 왼쪽 화살표는 왼쪽으로 정한 숫자만큼 이동하는 것이고, 오른쪽은 반대입니다.

시프트 연산은 [(값) << (이동 숫자);]의 형식이며 2의 거듭제곱을 한 것에 값을 곱한 것과 같으며 오른쪽 시프트는 2의 거듭제곱을 나눈 만큼의 값이 됩니다.

비트 연산은 부호의 유무에 따라 결과가 다르게 나옵니다. 부호가 없는 비트를 오른쪽으로 시프트 시키면 밀려지는 값은 0으로 채워지지만 부호가 있는 값은 부호 비트인 최상위 비트로 값이 채워집니다. 최상위 비트가 1이면 음수(-)를 뜻하는 것이고, 0이어야 양수(+)를 뜻하는 것입니다.

왼쪽 시프트의 경우에는 부호 비트에 덮어써지는 값이 부호로 오게 되는 형식으로 부호가 바뀝니다. 그렇기에 부호가 있는 자료형에서 비트를 계산했을 때는 최상위 비트를 보고 부호를 결정하게 되는 것입니다.

비트 연산자를 이용하여 특정 비트의 유무를 확인할 수도 있는데 mask를 이용하여 특정 비트의 값을 넣어 비교하여 1과 0을 비교할 수 있는 것입니다.

 

마지막으로 계산식의 정리로 계산식은 의도를 명확하게 하여 계산하기 위해 괄호(())로 묶어 우선순위가 높은 연산이라도 표시합니다.