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가 완벽하게 평가되지 않는 한 함수호출은 실행되지 않는다. 만약 입력변수가 ++나 -- 같은 연산자가 있는 표현식이라면 증감연산자가 실행이되기 전까지 함수 호출은 실행되지 않는다.
'programming > C' 카테고리의 다른 글
C 프로그래밍 : 현대적 접근 06 | 루프 (0) | 2024.07.27 |
---|---|
C 프로그래밍 : 현대적 접근 05 | 선택문 (0) | 2024.07.26 |
C 프로그래밍 : 현대적 접근 03 | 서식 입출력 (0) | 2024.07.26 |
C 프로그래밍 : 현대적 접근 02 | C 기초 (0) | 2024.07.26 |
C 프로그래밍 : 현대적 접근 01 | C 입문 (0) | 2024.07.25 |
블로그의 정보
농담곰담곰이의곰담농
브이담곰