일
KNK Chap.4 (4.2~4.3) 본문
4-2 할당 연산자
표현식의 값이 계산된 후에는 그 값을 변수에 저장하는데,
단순할당simple assignment을 해주는 = 연산자가 이때 사용됨.
이미 변수에 저장된 값을 바꾸려면 복합할당연산자를 사용하면 됨.
단순할당
할당 v = e 는 표현식 e를 처리하고 그 값을 복사해 v에 저장한다는 뜻임.
e는 상수, 변수, 복잡한 표현식이 될 수 있음. 예시 ↓
i = 5; /* i의 값은 5이다 */
j = i; /* j의 값은 5이다 */
k = 10 * i + j; /* k의 값은 55이다 */
만약 v와 e가 같은 형이 아니라면, 할당이 되는 순간 e의 값은 v의 형에 알맞게 변환됨. 예시 ↓
int i;
float f;
i = 72.99f; /* i의 값은 72이다 */
f = 136; /* f의 값은 136.0이다 */
형변환은 나중에 더 구체적으로 다룸.
대부분 프로그래밍 언어에서 할당은 구문statement임. 근데 C언어에서는 연산임.
연산이 결과를 내는 것처럼 할당도 결과를 냄. 즉, 할당 v = e의 값은 할당 이후의 v 값임.
예를 들어 i = 72.99f의 값은 72.99가 아닌 72임.
[부작용] C언어 연산자 중에는 피연산자의 값을 변화시키는 것들이 있음.
이러한 연산자에 부작용side effect가 있다고 이야기함.
예를 들어 단순할당연산자는 왼쪽에 있는 피연산자의 값을 변화시킴.
표현식 i = 0은 0이라는 결과값을 생성하고, 부작용으로 0을 i에 저장함.
왼쪽값
할당연산자는 왼쪽 값value이 좌측 피연산자로서 무조건 존재해야 함.
왼쪽 값이란 컴퓨터 메모리에 저장되는 객체임. 예를 들어 변수.
변수 이외의 왼쪽 값은 추후에 배움.
할당연산자는 좌피연산자로 왼쪽값이 필요하기 때문에, 왼쪽값이 아닌 표현식을 사용 불가.
12 = i; /*** WRONG ***/
i + j = 0; /*** WRONG ***/
-i = j; /*** WRONG ***/
컴파일러는 이런 에러가 발견하면 에러 메시지를 출력함.
복합 할당
예를 들어 i의 값에 2를 더하고 싶다고 치자.
i = i + 2;
복합 할당compound assignment 연산자를 이용하면 이렇게 쓸 수 있음.
i += 2;
+= 연산자는 우피연산자의 값을 왼쪽에 있는 변수에 더해줌.
복합할당연산자는 총 9개임.
Ex) += -= *= /= %=
이 이외의 복합할당연산자는 추후 단원에서 배움.
v += e 와 v = v + e 는 엄연히 다른 구문임. 연산순서가 애초에 다름.
또한 v 자체에 부작용이 있어 v += e와 v = v+ e가 서로 다른 경우도 있음.
[!!!] 복합할당연산자를 사용할 때 연산자를 구성하는 두 연산자를 혼동하지 말기.
두 문자를 바꾸면 컴파일러에는 상관 없지만 의도한 의미를 잃음.
예를 들어 i += j 라고 적을 것을 i =+ j 라고 적으면, i = (+j)와 같은 의미라 i에 j 값을 할당하게 됨.
복합할당연산자는 = 연산자와 동일 순서이고, 우향결합적임. 예시 ↓
i += j += k;
=
i += (j += k);
4-3 증감 연산자
증가increment연산자 ++와 감소decrement연산자 --를 쓰면 코드가 좀 더 간단해짐.
그러나 사용하기는 까다로운 연산자들임.
--이 --i처럼 전위prefix연산자로 쓰이거나 j--처럼 후위postfix연산자로 쓰여서 그럼.
그리고 부작용이 존재해서 피연산자의 값을 바꿈. 예시 ↓
"우선 증가" 표현식 i를 해석하면 i + 1 을 i로 넘기는데, 부작용에 의해 i의 값이 증가됨.
i = 1;
printf("i의 값은 %d\n", ++i); /* "i의 값은 2"를 출력함 */
printf("i의 값은 %d\n", i); /* "i의 값은 2"를 출력함 */
"이후 증가" 표현식인 i++은 결과값 i를 내보내지만 이후에 i가 증가됨.
i = 1;
printf("i의 값은 %d\n", i++); /* "i의 값은 1"을 출력한다. */
printf("i의 값은 %d\n", i); /* "i의 값은 2"를 출력한다. */
첫번째 printf()는 i가 증가되기 이전 본래값을 출력함.
두번째 printf()는 새로운 값을 출력함.
즉, i는 "당장 증가해"라는 뜻이고, i++는 "원래 값 쓰고 나중에 증가해"라는 뜻임.
나중에 증가: 보통 다음 구문 실행되기 이전에 증가됨
-- 연산자도 비슷한 속성을 가짐.
i = 1;
printf("i의 값은 %d\n", --i); /* "i의 값은 0"을 출력한다. */
printf("i의 값은 %d\n", i); /* "i의 값은 0"을 출력한다. */
i = 1;
printf("i의 값은 %d\n", i--); /* "i의 값은 1"을 출력한다. */
printf("i의 값은 %d\n", i): /* "i의 값은 0"을 출력한다. */
연산자 순서로는 ++와 --의 후위연산자는 단항연산자보다 순서가 빠르고 좌향결합적임.
++와 --의 전위연산자는 단항연산자와 같은 순서이고 우향결합적임.
'C' 카테고리의 다른 글
KNK Chap.4 (Q&A) (0) | 2022.12.14 |
---|---|
KNK Chap.4 (4.4~4.5) (0) | 2022.12.14 |
KNK Chap.4 (4.1) (0) | 2022.12.14 |
KNK Chap.3 (Q&A) (0) | 2022.12.14 |
KNK Chap.3 (3.2) (1) | 2022.12.14 |