본문 바로가기

프로그래밍/C & C++

[C] 4. 표현식(Expression)

1. 표현식(Expression)

컴퓨터가 프로그램을 실행하는 것은 사실, 수많은 식들의 조합이다. 우리가 흔히 수학에서 사용되는 그 식이라고 생각하면 맞다. 그러한 식들을 조합해서 다양한 프로그램을 만드는 것이다. 프로그램 언어를 이용해서 프로그래밍을 할 때, 우리가 계산을 위해서 사용하는 식들을 표현식(expression)이라 부르고, 이러한 표현식들은 피연선자(operand)들과 연산자(operator)들로 이루어진다. 당연한 얘기겠지만, 이러한 '계산'을 수행하는 표현식들은 항상 결과값을 가진다.

피연산자(Operand) : 표현식에서의 상수 또는 변수(ex. 1+2에서 1 과 2)

연산자(Operator) : =, +, =, *, / 등이 있다.


1) Primary Expression

operator 없이 operand로만 이루어진 가장 간단한 표현식이다. 변수를 나타내는 식별자(Identifier) 혹은 상수(Constant)를 이용해서 나타낼수 있다.

식별자(Identifier) : x, Result, INT_MAX 등

상수(Constant) : 123, 100.25, 'A' 등

2) Prefix Expression

operator가 operand보다 앞에 나오는 경우. ++x는 x=x+1과 동일한 의미이고, 마찬가지로 --x 또한 x=x-1과 동일하다.

Ex. ++x, --x

3) Postfix Expression

operator가 operand보다 뒤에 나오는 경우. x++는 x=x+1과 동일한 의미이고, 마찬가지로 x-- 또한 x=x-1과 동일하다.

Ex. x++, x--

cf) Prefix vs. Postfix : Prefix와 Postfix의 차이는 무엇일까?

4) Unary Expression(단항 연산자)

operator-operand 방식의 표현식.

캐스트 연산자(Cast Operator)도 대표적인 단항 연산자로서, C언어에서 데이터의 형 변환을 위해서 사용한다.

sizeof 연산자는 여러가지 형이나 식의 크기를 알 수 있다. 그 결과값으로 Byte 수를 알려준다. 예로 sizeof(int)의 결과값은 4가 될 것이다.

Ex. +x, -x, (double)num

5) Binary Expression(이항 연산자)

operand-operator-operand 방식의 표현식으로, 아마 가장 익숙한 방식의 '식'일 것이다.

C언어에서는 곱셈을 *로 사용하며, %라는 opreator는 modulo로 나머지를 구하는 데 사용한다.

대입 연산(Assignment Operation)은 '=' 기호를 사용하여, 우측의 값을 좌측의 저장 장소에 저장하라는 의미로 사용된다. 특히 대입 연산에서 좌측의 operand는 저장 공간의 주소가 오게되어 expression이 아닌 single variable이어야 한다. 오른쪽에 오는 operand는 일반적인 expression이 가능하다.

Ex. 1 + 2, x * y, a=(b%c)


Binary Operator

의미

Ex. 

결과 (x를 출력)

일반 연산자

=

대입

x=10

10

+

덧셈

x=10+5

15 

-

뺄셈

x=10-5

*

곱셈

x=10*5

50 

/

나눗셈

x=10/5

%

나머지

x=10%5

관계 연산자

==

동치

x=(10==5)

false 

!=

부동치 

x=(10!=5)

true 

&&

And 

x=(true&&false)

false

||

Or 

x=(true||false) 

true 

>

크다 

x=(10>5) 

true 

<

작다 

x=(10<5) 

false 

>=

크거나 같다 

x=(10>=10)

true 

<=

작거나 같다 

x=(10<=10) 

true 

비트 연산자

&

Bitwise And 

x=7&2

2 // 7은 2진수로 111이고 2는 2진수로 010이므로 두 값을 and 연산 -> 010

|

Bitwise Or

x=7|2

7 // 7은 2진수로 111이고 2는 2진수로 010이므로 두 값을 or 연산 -> 111

^

Bitwise Xor

x=7^2 

5 // 7은 2진수로 111이고 2는 2진수로 010이므로 두 값을 xor 연산 -> 101

>>

Bitwise Shift right 

x=8>>1

<<

Bitwise Shift left 

x=8<<1 

16 


6) Ternary Expression(삼항 연산자)

operand-operator-operand-operator-operand 으로 이루어진 표현식이다. operator로 ? : 를 사용하는데, 조건 연산자라고 하며 if - else 구문을 한줄로 함축해놓았다고 생각하면 편하다.

? : operator의 사용은 다음과 같다.

condition ? value_if_true : value_if_false

Condition이 True인지 false인지 판단해 각각의 상황에 알맞은 수행문을 수행한다.

Ex. result=(a>b)?a:b; // a가 b보다 큰 경우 result는 a, 그렇지 않은 경우 b


2. 연산자 우선순위(Precedence, Associativity)

Precedence : 다른 연산자들 사이에서의 우선 순위

Associativity : 같은 순위의 연산자들 사이의 우선 순위, 왼쪽에서 오른쪽 혹은 오른쪽에서 왼쪽이 된다.

C언어에서의 연산자 우선순위를 정리하면 다음과 같다.


3. 형 변환(Type Conversion)

형 변환(Type Conversion)은 말 그대로, 어떤 자료(Data)의 형(Type)을 변형하는 것이다. C언어에서 표현식을 이용해서 연산을 수행하기 위해서는 Operator의 자료형이 서로 맞아야 한다. 이를 위해서 자료형이 다른 경우에는 컴파일러가 스스로 형 변환을 수행하거나(Implict type Conversion), 혹은 프로그램을 제작하는 프로그래머가 강제로 데이터의 형을 변환한다.(Explicit Type Conversion)

- Implicit Type Conversion(Coercion)

일반적으로 Coercion이라고 하며, 컴파일러의 판단에 의해 자동으로 데이터형이 변경되는 경우이다. 특히 표현식에서 Type이 다른 데이터를 섞어 사용하는 경우에 Coercion이 일어난다. 일반적으로 Conversion Rank는 Floating Point가 가장 높고, 그 다음 Integer, Character, 그리고 Boolean 데이터이다. 같은 형태의 데이터에서는 bit 수가 큰 것이 Conversion Rank가 높다. 즉 double(8bytes)의 conversion rank가 float(4bytes)보다 높을 것이다.

Floating Point(Real Number)>Integer>Character>Boolean

- Explicit Type Conversion(Casting)

프로그래머에 의해서 강제로 데이터형을 변환하는 경우이다. 흔히 Casting한다고 말을 하며, (type) expression 형태로 사용할 수 있다.

당연하겠지만, 표현 범위가 다른 데이터의 경우 변환 과정에서 손실이 일어날 수 있다. 가장 쉽게 생각해서 bit 수가 큰 데이터에서 bit 수가 작은 데이터로 변환하는 경우에는 당연히 데이터 손실이 일어난다고 생각할 수 있다.(ex. double->float) 이외에도 같은 bit 수의 데이터 형에서도 손실이 발생할 수 있는데, unsigned int->int와 같은 변환이 그렇다. int의 양수 범위에서는 손실이 발생하지 않겠지만, 그보다 큰 수를 unsigned int 데이터에 저장한 뒤, int로 변환하게 되면, 그 변수를 출력해 결과를 확인하는 경우 의도하지 않은 결과값을 볼 수 있다. 

unsinged int x=4000000000;

int y;

y=x;

print("%d",y)

Result : -11452478

그리고, 부동 소수점으로 나타내는 데이터와 정수형 데이터는 bit 표현법이 다르다. 따라서, 정밀한 연산을 요하는 경우, 부동 소수점 연산을 한 뒤 정수형으로 형 변환하기 보다, 정수형으로 계속 연산을 해야 한다.

반응형

'프로그래밍 > C & C++' 카테고리의 다른 글

GDCM 설치와 Visual Studio 2017에서 사용하기  (0) 2019.06.19
[C] 3. 표준 입출력과 주석  (0) 2017.01.01
[C] cf. 형식문자(Format Character)  (0) 2016.12.28
[C] cf. ASCII CODE  (0) 2016.12.28
[C] 2. C 언어의 자료형  (0) 2016.12.25