농담곰담곰이의곰담농

C 프로그래밍 : 현대적 접근 04 | 표현식

by 브이담곰

1 산술연산자

덧셈, 뺄셈, 곱셈, 나눗셈 등을 하는 연산자

 

i = +1; /* + 는 여기서 단항 연산자로 쓰임 */
j = -1; /* - 는 여기서 단항 연산자로 쓰임 */

덧셈과 곱셈류 연산자들은 두 개의 피연산자들을 필요로 하기 때문에 이항binary라고 불린다. 

단항unary 연산자는 한 개의 피연산자를 필요로 한다. → 아무것도 하지 않으며 어떤 상수가 양수임을 강조한다.

 

º  / 연산자는 피연산자가 둘 다 정수일때 , 소수점 부분을 삭제함으로써 결과값을 줄여 정수로 만든다.

º  % 연산자는 피연산자가 정수여야한다. 만약 피연산자가 정수가 아니라면 컴파일되지 않는다.

º  / 이나 %를 사용할 때 0을 우항 피연산자로 사용하는 경우 예상하지 못한 결과가 나올 수 있다.

 

연산자 순서 및 결합 법칙

 

2 할당 연산자

표현식의 값이 계산된 다음에는 그 값을 변수에 저장해서 나중에 사용해야한다.

C언어에서  = 은 단순할당 simple assignment해주는 연산자이다!

단순할당

할당 v = e는 표현식 e를 처리하고, 그 값을 복사해서 v에 저장한다는 의미이다.

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이다 */

 

왼쪽값 lvalue

할당연산자가 좌피연산자로 왼쪽값을 필요로 하기 때문에 왼쪽값이 아닌 표현식을 할당연산자의 좌피연산자로 사용할 수 없다.

12 = i;       /*** 틀림 ***/
i + j = 0;    /*** 틀림 ***/
-i  = j;      /*** 틀림 ***/

 

복합할당

한 변수를 그 변수를 이용하여 새로운 변수에 할당하기 위해 사용되는 할당은 C에서 자주 사용되는 할당이다.

i = i + 2;

 

C의 복합할당compund assignment 연산자는 위와 같은 코드를 += 연산자를 이용해 간단하게 코드를 줄여준다.

i += 2;    /* i = i + 2 와 같다 */

 

 

3 증감연산자
i = i + 1;
j = j - 1;

위와 같은 코드를 복합할당연산자를 활용하여 코드를 압축할 수 있다.

i += 1; //  +=  증감 연산자
j -= 1; //  -=  감소 연산자

// 후위 postfix 연산자
i ++;
j ++;

// 전위 prefix 연산자
++ i;
++ j;

 

연산자 순서를 확인해보면 ++와 --의 후위연산자는 단항연산자보다 더 순서가 빠르며 좌향결합적이다.

전위연산자는 단항 연산자와 같은 순서를 가지며 우향결합적이다.

 

 

4 표현식 평가

 

5 표현문

C에서는 모든 표현식을 구문으로 사용될 수 있다는 특이한 규칙이 있다. 무슨 형식이든, 무슨 값을 처리하든 모든 표현식에 세미콜론;을 추가함으로써 구문으로 만들어 줄 수 있다는것이다.

++i;

→ 이 구분이 실행되면 i는 증가되고, 선택된 값은 버려지고 다음 구문이 실행된다.

 

다른 예를 들자면!

코딩하다가 손가락 잘못 놀리면 "아무 의미 없는" 표현문expression statement이 만들어진다. 예를 들어
i = j;
라고 작성하지 않고 실수로
i + j;
라고 실수로 작성할 수도 있다. 이러한 실수는 생각보다 자주 발생한다. =와 +가 같은 키보드 키이기 때문에 발생하는 실수다. 몇몇 컴파일러는 무의미한 표현문을 감지할 수 있다. "무의미한 구문statement with no effect"이라고 적힌 에러를 발생시킨다.

 

Q&A
C가 굳이 ++과 --연산자를 제공하는 이유? 더 빠른가?

아니다. ++,--는 B 컴파일러가 i = i + 1보다  ++i에 대해 더 구체적인 번역이 가능해서다! 따라서 성능과는 아무런 관련이없다. 그냥 편해서 사용할 뿐!

 

++와 --를 후위로 사용할 때 정확하게 언제 증감이 적용되는가?

C 표준에 의하면 C언어에는 "순서지점 sequence point"라는 개념이 있다.

피연산자에 저장된 값을 바꾸는 건 이전 순서 지점이랑 그 다음 순서 지점 중간에 이뤄진다.

표현문이 끝날 때가 되면 반드시 그 구문에 있는 증감연산은 전부 실행이 되었어야 한다.

 

함수호출을 할 때 입력변수argument가 완벽하게 평가되지 않는 한 함수호출은 실행되지 않는다. 만약 입력변수가 ++나 -- 같은 연산자가 있는 표현식이라면 증감연산자가 실행이되기 전까지 함수 호출은 실행되지 않는다.

블로그의 정보

농담곰담곰이의곰담농

브이담곰

활동하기