본문 바로가기

개발공부(C, C++)

따배씨(따라 배우는 C언어_홍정모) Chapter5

CHAPTER 5 연산자, 표현식, 문장

5.1 반복 루프와의 첫 만남

옛날에는 goto 문을 써서 반복문을 구현하기도 했지만 요즘은 안 쓴다.

5.2 대입 연산자와 몇 가지 용어들

  • Data object (object)
  • L-value (object locator value) : 메모리를 가지고 있는 특정 데이터 객체(개체)
  • R-value (value of an expression) : 수정 가능한 L-value에 대입될 수는 있지만 자기 자신은 L-value가 될 수 없는 것. 프로그램이 계산하는 임시값으로 계산이 끝나면 사라지는 값들 포함.

어떤 statement 에서 일시적인 값(value)으로만 쓰이면 R-value, 메모리 주소를 가지고 object 의 역할을 하는 것을 L-value 라고 한다. 즉 변수라고 해서 항상 L-value 인 것은 아니며 i = i+1; 처럼 값으로만 쓰인 오른쪽의 i 는 본래 L-value지만 R-value 역할을 한다.

5.3 더하기, 빼기, 부호 연산자들

income = salary = bonus = 100; // 이런 Triple assignment 도 가능하다. 3개 변수에 모두 100 이 대입된다.

5.5 나누기 연산자

int / int 는 소수점이 발생할 경우 버림(절삭truncate) 한다. 음수 결과값도 마찬가지다. 다만 옛날 컴파일러에서는 컴파일러간 결과값이 다른 경우도 있었다.

5.6 연산자 우선순위와 표현식 트리

+ - * / 같은 사칙연산을 위한 연산자부터 = 대입 연산자 등 여러가지 연산자들은 컴퓨터 내부에서 우선순위에 따른 표현식 트리가 그려져서 순서대로 연산된다. 각 연산자는 결합법칙의 방향성을 가지고 있다. 예를 들어 일반적인 +, - 이항 연산자의 결합법칙은 왼쪽에 오른쪽이지만(계산 순서가 왼쪽에서 오른쪽이니까.), = 같은 대입연산자는 오른쪽에서 왼쪽의 방향성을 가진다. (오른쪽 걸 왼쪽에 대입하니까.) 단항연산자 +,- 와 이항연산자 +, - 를 구분해야 함에 주의하자. 단항연산자의 결합법칙은 오른쪽에서 왼쪽이다.(어떤 값을 양/음수화 하는 것이니까.)

::: warning 주의할점!
괄호(parenthesis) 를 연산자로 분류하는 경우가 있는데, 이 때 괄호는 우리가 흔히 수학에서 쓰는 계산 순위를 높이기 위한 괄호가 아니라 함수를 호출하거나 자료형 변환을 위해 사용하는 괄호로서의 연산자다. 계산 순위를 높이는 괄호는 primary expression 이라는 별개의 이름을 가진다.
:::

5.7 나머지 연산자 (modulus)

음수가 포함된 나머지 연산자는, 첫번째 피연산자의 부호를 따른다.

  • 11 % -5 --> 1
  • -11 % 5 --> -1
  • -11 % -5 --> -1

5.8 증가, 감소 연산자

연산자가 앞에 붙냐 뒤에 붙냐에 따라

  1. 후위 증감 연산자(postfix)
  2. 전위 증감 연산자(prefix)
    로 나뉜다.

후위 연산자는 어떤 연산에 쓰일 때, 먼저 그 연산을 수행하고, 그 연산이 끝난 다음에 +1 을 하겠다는 걸 '예약' 하는 것처럼 작동한다. 크기를 비교하는 비교 연산자나, 값을 대입하는 대입연산자 등에 써보면 전위 연산자와 달리 +1 되기 전 값이 비교에 쓰이거나 대입된다는 것을 확인할 수 있다.

증감 연산자는 일반적인 사칙연산보다 우선순위가 높다. 즉 전위 연산자는 곱셈이나 나눗셈보다도 먼저 계산된다. 후위 연산자는 우선순위는 높지만 후위 연산자기 때문에 곱셈/나눗셈 계산 이후에 연산된다. 근데 또 웃긴게 전위 증감연산자와 후위 증감연산자가 같이 쓰이면 전위 증감 연산자가 후위 연산증감자보다 우선순위가 낮다... 즉 후위 증감 연산자가 먼저 실행된다.

증감 연산자는 L-value 에만 사용 가능하다.

5.9 표현식과 문장

번역

  • 표현식(Expressions) 은 수학에서는 '수식' 이라고 번역되지만, 프로그래밍에서는 '수식' 을 뜻한다고 보기에는 애매하기에 표현식이라고 번역된다.

  • 문장(Statements) 도 수학에서는 어떤 진리에 가까운 사실을 단언하는 때 주로 쓰이지만 프로그래밍에서는 그냥 문장이라고 번역된다.

특징

어떤 값을 연산하는 과정을 표현식(expressions)이라고 한다. 수치적 값뿐 아니라 true/false 값을 포함한다.

주로 뒤에 세미콜론(;) 이 붙어있는 걸 문장(statements) 라고 한다. 변수의 선언(declaration statement), 대입(assignment statement), 반복문(while statement)(structured statement), 함수호출(function statement), return statement 등이 있다.

사실상 expression 과 statement 는 떼놓고 말하는 게 힘들다. 세미콜론이 붙어있으면 expression statement 가 되는 것이다.. (제대로 이해했는지 모르겠다.)

5.11 자료형 변환

자료형의 크기가 작은 것에서 큰 것으로 변환했을 때는 아무런 문제가 생기지 않는다. 하지만 큰 것을 작은 것으로 변환하는 걸 'demotion in assignment' 라고 부르며, 데이터가 절삭되는 등의 문제가 생긴다.

연산을 할 때 자료형 간의 랭킹이 존재한다. 즉 우선순위가 높은 쪽으로 변환된다. 예를 들어 실수는 정수보다 랭킹이 높기 때문에 두 가지 자료형끼리 연산할 시 정수가 실수로 변환되어 계산된다.

casting operator 를 이용해 직접적으로 형 변환을 해줄 수도 있다. (int)1.6; // 절삭되어 1 이 됨.

5.12 함수의 인수와 매개변수

Arguments

  • Actual argument 라고도 부름
  • Actual parameter 라고도 부름
  • value 이다.

parameters

  • Formal Argument 라고도 부름
  • Formal Parameter 라고도 부름
  • variable 이다.