Operators와 Operands로 이루어진걸 Expression이라고 한다.(Operator나 Operand 하나만 있어도 그 자체로 Expression이다.)
Exression은 value를 나타낸다.
/
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가 결과로 나온다.)
v = e
v += e
, v -= e
, v *= e
, v /= e
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에선 딱히 빨라지거나 프로그램이 작아지거나 하진 않음. 그저 간편함과 편리함 때문에 이어져옴.
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로 바꿈.)