티스토리 뷰
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 자료형도 증감연산자(++, --)가 적용된다.
- Total
- Today
- Yesterday
- 백준
- 백준 2365
- 정보올림피아드
- 언리얼 프로젝트 재생성
- 코드포스
- 백준 27469
- Codeforces
- 언리얼 자동화
- 테트리스
- C++게임개발
- pygame
- UE5.3
- OpenVDB
- opengl
- Unreal Engine
- 숫자판 만들기
- BOJ 27469
- C++게임
- unreal enigne
- DP
- 브레젠험 알고리즘
- ICPC 후기
- BOJ 2365
- ndisplay
- 홍정모의 게임 만들기 연습 문제 패키지
- 초등부
- tetris
- 퀸 움직이기
- Python
- 언리얼 프로젝트 재생성 자동화
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |