티스토리 뷰

C언어/K.N.King C PROGRAMMING

Chapter 4

소심야채 2020. 8. 24. 21:11

Arithmetic Operators

 

 

이항 연산자(binary operator): 덧셈 및 곱셈 연산자는 두 개의 피연산자가 필요하기 때문에 이항연산자라고 한다.

단항 연산자(unary operator):  단항 연산자는 한개의 피연산자가 필요하다.

 

■ 음수 피연산자와 함께 / 및 % 연산자를 사용할 때 결과를 설명하는 것은 까다롭다. C89표준에 따르면 피연산자가 음수이면 -9/7의 결과는 -1 또는 5가 될수 있다. 반면에 C99에서는 나눗셈의 결과가 항상 0으로 잘리고 (따라서 -9/7의 값은 -1) i % j의 값은 i와 동일한 부호를 갖는다 (-9 % 7는 -2)

 

연산자 우선순위 및 결합성

 두 개 이상의 연산자가 동일한 표현식에 나타날 때, 우선순위가 높은 연산자부터 낮은 우선순위 연산자까지 하위 표현식 주위에 괄호를 반복해서 넣어 컴파일러가 표현식을 해석하는 방법을 결정할 수 있다.

 

 

i + j * k     는       i + (j * k)       와 같다.

-i * -j        는      (-i) * (-j)         와 같다.

+i + j / k   는      (+i) + (j / k)    와 같다.

 

 

연산자 그룹이 왼쪽에서 오른쪽으로 형성될 때 왼쪽 결합성이라 불린다. 이항 산술 연산자(*, /, %, +, -)는 모두 왼쪽 결합성을 띤다.

i - j - k    는      (i - j) - k       와 같다.

i * j / k    는      (i * j) / k       와 같다.

 

 

연산자 그룹이 오른쪽에서 왼쪽으로 형성될 때 오른쪽 결합성이라 불린다. 단항 산술 연산자(+, -)는 모두 오른쪽 결합성을 띤다.

- + i    는      -(+i)       와 같다.

 

 

 

 

Simple Assignment

 

v = e 대입의 결과는  표현식 e을 평가하고 그 값을 v에 복사하는 것이다. e는 상수, 변수 또는 더 복잡한 표현식이 될 수 있다.

 

 v 와 e의 자료형이 같지가 않다면 할당이 수행 될 때 e의 값이 v의 자료형으로 반환된다.

 

=연산자는 오른쪽 결합성이다 .

int i;

float f;

 

f = i = 33.3f;

 

위 표현식의 우선순위를 괄호로 묶으면 f = (i = 33.f); 임으로 정수타입 i에 실수 33.3f 가 들어가면 소수점은 짤림으로

i = 33이 할당되며 실수타입 f에는 33이 들어가 f = 33.0이 할당된다.

 

 

 

Lvalues

 

■ 대부분의 C 연산자는 피연산자가 변수, 상수 또는 다른 연산자를 포함하는 표현식이되도록 허용한다. 그러나 할당 연산자(=)에는 왼쪽 피연산자로 lvalue가 필요하다. lvalue는 상수나 계산결과가 아닌 컴퓨터 메모리에 저장된 개체를 나타낸다.

 

 

Compound Assignment

 

v += e   // e를 v에 더한 결과를 v에 저장한다.

v -= e    // e를 v에 뺀 결과를 v에 저장한다.

v *= e    // e를 v에 곱한 결과를 v에 저장한다

v /= e    // e를 v에 나눈 몫을 v에 저장한다.

v %= e   // e를 v에 나눈 나머지를 v에 저장한다.

 

복합 연산자 또한 대입연산자와 같은 속성(오른쪽 결합성)을 띄고 있다.

i += j += k  의 의미는 i += (j += k) 이다.

 

 

 

Increment and Decrement Operators

 

■ ++ 또는 -- 증감연산자가 접두사인지 접미사인지에 따라 해석이 달라진다.

 

■ ++i(전위 증가)의 표현식을 평가하면 i+1이 생성되고 부가작용으로 i가 증가한다.

 

■ i++(후위 증가)의 표현식을 평가하면 결과 i가 생성되지만 i는 나중에 증가한다.

 

■ 정리하자면 ++i 의 의미는 "i를 즉시 증가하겠다", 반면에 i++의 의미는 "당장은 i를 사용하고 나중에 i를 증가하겠다" 얼마 후에 증가하는지는 C표준에 명시되어있지 않다. 그러나 최소한 다음 문장이 실행되기전에는 증가되는 걸로 추측된다.

 

 

 

 

Expression Evaluation

Precedence Name Symbol(s) Associativity
1 increment (postfix)
decrement (postfix)
++
--
left
2 increment (prefix)
decrement (prefix)
unary plus
unary minus
++
--
+
-
right
3 multiplicative * / % left
4 additive + - left
5 assignment + *= /= %= += -= right

■ 후위 증가 -> 전위 증가 -> 곱셈, 단항(+,-) -> 덧셈 -> 대입(복합 대입)

 

 

 

Order of Subexpression Evaluation

 

a = 5;

c = (b = a + 2) - (a = 1) 의 결과를 생각해보자.

 

1) 표현식 중 첫번째 항이 먼저 연산된다면 c는 6이 할당 될것이다.

2) 표현식 중 두번쨰 항이 먼저 연산된다면 c는 2가 할당 될것이다.

■ 위 표현식 테스트 결과 6이 나왔다. 괄호 연산자가 왼쪽 결합성이라 첫번째 항을 먼저 연산한것 같다.

 

 

undefined behavior

 

■ c = (b = a + 2) - (a = 1) 와 j = i * i++ 와 같은 문장은 컴파일러에 따라 다른 결과 값을 도출할 수 있다. 따라서 정의 되어있지 않은 행동은 피해야한다.

 

 

 

Expression Statements

 

■ C에서는 어떤 expression도 statement로 사용할 수 있다는 특이한 규칙을 가지고 있다.

 

 

 

Q&A

 

■ v += e 는 v = v+e 와 동등하지 않다. ex) v = a[i++], e = 2 로 치환하면 a[i++] = a[i++] + e 로 정의되지 않은 행동이 발생한다.

 

■ float 자료형도 증감연산자(++, --)가 적용된다.

'C언어 > K.N.King C PROGRAMMING' 카테고리의 다른 글

Chapter 6  (0) 2020.08.26
Chapter 5  (0) 2020.08.25
Chapter 3  (0) 2020.08.20
Chapter 2  (0) 2020.08.19
Chapter 1  (0) 2020.08.18
댓글