Chapter 4. Expressions

지환·2021년 10월 31일
0
post-custom-banner

Operators와 Operands로 이루어진걸 Expression이라고 한다.(Operator나 Operand 하나만 있어도 그 자체로 Expression이다.)
Exression은 value를 나타낸다.


4.1 Arithmetic Operatiors

/ operator와 % operator에 대해...
1. / operator의 operands가 둘 다 integers라면 정수형태로 축약된 결과가 나온다. (ex. 1/2 == 0 (!=0.5))
2. % operator는 interger operands만 필요하다. integer가 아니면 compile되지 않음.
3. /%에서 0을 오른쪽 피연산자로 사용하면 undefined behavior
4. /% 연산에서 음수 피연산자를 사용하면, C89에서는 implementation에 따라 두가지 결과가 나올 수 있다. 하지만 C99에서는 음수 피연산자를 사용한 / 연산의 결과가 0을 향하도록 정의한다. 그리고 % 연산의 결과는 왼쪽피연산자와 같은 부호를 가지도록 정의한다. (ex. -9/7은 C89에서는 -1이나 -2가 나올 수 있었지만, C99에선 -1이 나온다. 그리고 -9%7은 C89에선 -2나 5가 나왔지만, C99에선 -9와 같은 부호인 -2가 결과로 나온다.)

Implementation-Defined Behavior

  • C standard는 의도적으로 C언어의 몇몇 부분을 Implementation에 의해 정해지도록 놔뒀다.
    이는 C언어 철학 중 하나인, 각 hardware의 행동에 따른 efficiency를 향상시키기 위한 것이다.
    하지만 Implementation-Defined Behavior에 의존한 프로그램을 작성하는 것은 피하는 것이 좋다.(Portability를 해치기 때문인듯)

Operator Precedence & Associativity

  1. 여러 개의 Operators가 쓰였다면 "Precedence"를 고려해 우선순위를 따진다.
  2. Operators간의 Precedence가 같다면, "Associativity"를 고려해 우선순위를 따진다.

4.2 Assignment Operators

Simple Assignment

  • v = e
    v와 e의 type이 맞지 않으면, e가 v의 type으로 convert된다.
    C에서는 =도 +처럼 그냥 Operator에 불과하다.
    = operator는 right associative를 가지고 있다.
    = operator처럼 operand의 값을 바꾸는 경우 side effect가 있다고 한다.
    = operator는 left operand로 Lvalue가 필요하다. Lvalue란 컴퓨터 메모리에 저장된 object를 말한다, 계산에 의한 결과나 숫자가 아니라.
    = operator가 declaration과 같이 쓰일 때는 assignment operator가 아니다.(p.289)

Compound Assignment

  • v += e , v -= e , v *= e , v /= e
    주의할 점 :
    v+=e는 v=v+e와 항상 같지 않다. (v가 side effect를 가질 경우 같지 않음)
    v*=e는 v=v*e와 항상 같지 않다. (e가 *보다 낮은 precedence를 가진 operator로 이루어질 경우 같지 않음)

4.3 Increment and Decrement Operators

prefix operators : increment(or decrement) operand immediately
postfix operators : use the old value of operand for now, but imcrement(or decrement) operand later
-> How later?????
C 표준에선 정확한 증감 위치를 알려주지 않음. 다음 "sequence point" 전 언젠가라고만 말함.(sequence point는 종류가 많은데, function call, logical and, end of an expression statement 등이 있다.) 따라서 대부분 다음 statement가 실행되기 전에 증가된다고 생각하고 주의하며 다루는게 좋다.

i++; 를 쓰는게 그냥 i=i+1; 하는거보다 빠른가? 왜 이런게 만들어진거지?
: B언어에서부터 내려온거임. B에선 어느정도 효과가 있었지만 현대 C compiler에선 딱히 빨라지거나 프로그램이 작아지거나 하진 않음. 그저 간편함과 편리함 때문에 이어져옴.


4.4 Expression Evaluation

Order of Subexpression Evaluation

  • precedence랑 associativity 이용해서 전부 괄호 쳐버리면 대부분의 expressions은 해결 되지만, subexpressions의 계산 순서가 중요한 경우 해결되지 않는다. C에서는 subexpressions의 계산 순서는 정의하지 않기 때문이다. (ex. (a*b) + (c*d)에서 두 괄호 중 뭐가 먼저 계산될지는 모른다.) 대부분 expressions에서 저런 계산 순서는 중요하지 않지만, 만약 특정 subexpressions이 side effect를 가진다면 이는 undefined behavior이 된다.

Undefined Behavior

  • Implementation-defined behavior과는 다른 것으로, 아예 정의되지 않은 행동을 말한다. 이는 의미없는 결과를 가져오거나 프로그램이 문제를 일으키도록 하기 때문에 꼭 피해야한다.

4.5 Expression Statements

any Expression can be used as a statement
Expression --- add semicolon(;) ---> statement
Expressions statement는 연산 값이 버려지기 때문에, side effect를 가지지 않으면 딱히 쓸모가 없음.
Exression은 value를 나타낸다. (side effect를 가지지 않으면 그냥 쓸모없이 discard 되는거임) (ex. i=1; 에서 이 expression의 value 1은 버려지고, i의 값을 1로 바꿈.)

post-custom-banner

0개의 댓글