Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
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
Tags
more
Archives
Today
Total
관리 메뉴

KNK Chap.4 (4.1) 본문

C

KNK Chap.4 (4.1)

Daryl 2022. 12. 14. 16:33

Chapter 04 표현식

 

C언어는 구문보다 표현식(어떤 값을 계산하는 식)을 엄청 중시함.

가장 간단한 표현식은 변수(프로그램이 실행될 때 계산되는 값)와 상수(변하지 않는 값)임.

표현식이 복잡해지면 피연산자에 연산자를 포함시킴. 이때 피연산자는 자기 자신이 곧 표현식임.

표현식 a + ( b * c ) 가 있다 치자. + 연산자는 피연산자 a와 ( b * c )에 적용되는데

이 두 피연산자는 자기 자신이 곧 표현식이기도 함. C에는 매우 많은 연산자가 있음.

그 중 프로그래밍 언어가 갖는 기초적 연산자 ↓

산술 연산자 - 덧셈, 뺄셈, 곱셈, 나눗셈

관계 연산자 - "i는 0보다 크다" 같은 비교 등에 이용

논리 연산자 - "i는 0보다 크고 j는 0보다 작다" 같은 조건을 만드는데 이용

 

C는 이 세가지 외에도 수많은 연산자가 있어 이 책의 20단원까지 순서대로 다뤄야 할 정도임.

연산자를 익히는건 힘들지만 C를 잘 쓰려면 필수적임.

 

4-1 산술 연산자

산술 연산자 arithmetic operator는 덧셈, 뺄셈, 곱셉, 나눗셈 등을 하는 연산자임.

덧셈류와 곱셈류 연산자들은 두 개의 피연산자를 필요로 하기 때문에 이항binary라고 부름.

단항unary 연산자는 한 개의 피연산자만 필요함. 예시 ↓

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

주의할 것은 / 연산자와 % 연산자임.

 

○ 만약 피연산자가 둘다 정수라면, / 연산자는 소수점 부분을 삭제해 결과값을 정수로 만듦.

예를 들어 1 / 2 의 값은 0.5 가 아니라 0 임.

○ % 연산자는 피연산자가 정수가 아닐 경우 컴파일 되지 않음.

○ / 이나 % 을 사용할 때 0을 우항 피연산자로 사용하면 결과 예상 못함.

○ / 이나 %이 음수 피연산자와 함께 사용되면 결과를 표현하기 어려움.

C89 표준에 따르면 두 개의 피연산자 중 하나라도 음수면 나눗셈 결과값은 반올림/반내림 됨.

C99에선 나눗셈의 결과는 언제나 0과 가장 가까운 값을 가짐. 

 

[구현정의행동] 구현정의implementation-defined는 앞으로 많이 나오게 될 단어임.

C 표준은 의도적으로 언어의 일부분을 불확실하게 남기고, 구현implementation, 즉

소프트웨어가 어떤 특정 플랫폼에서 컴파일하고, 링크하고, 실행해야 할 프로그램을 통해

그 불확실한 부분을 채움. 그러니까 프로그램의 실행 결과는 구현에 따라 달라짐.

C89에서 음수 피연산자를 사용할 때 /이나 %의 결과가 구현 정의 행동의 예시임.

왜 이런 행동을 하느냐? C언어의 목표 중 하나가 효율성이기 때문임.

효율성은 하드웨어에 따라 방법을 맞춰주는 의미이기도 함. 

그렇지만 되도록이면 구현정의행동은 피하는게 좋고, 못 피한다면 메뉴얼이라도 보는게 좋음.

 

연산자 순서 및 결합 법칙

한 표현식이 한 개 이상의 연산자를 갖고 있으면 괄호를 쓰면 됨.

괄호를 안 쓴다면, 산술 연산자의 상대적 순서를 이용하게 됨.

순서 높음: + - (단항) * / % 순서 낮음: + - (이항)

물론 순서만으로 충분하진 않음. 동일 순서의 연산자 여러개가 존재할 수 있음.

그럴 경우 연산자의 결합을 사용하게 됨. 이항산술연산자는 전부 좌항결합적(왼쪽부터결합)임.

즉, i - j - k = (i - j) - k 이고 i * j / k = (i * j) / k 임.

반대로, 단항산술연산자는 우향결합적(오른쪽부터결합)임. 즉 - + i = -(+i) 임.

 

C언어에서 이 결합 법칙은 매우 중요함. 필요할 경우 순서 및 결합 법칙 도표를 참고.

 

[프로그래밍] 세계상품코드(UPC) 검사 기호 계산하기.

UPC는 바코드라고도 부른다. 제품과 제조업자에 대한 정보를 담고 있고, 12자리의 숫자임.

마지막 숫자는 "확인자릿수"로, 앞의 11개 숫자가 제대로 적혀 있는지 확인하는 숫자임.

 

확인자릿수를 계산하는 방법:

1. 홀수번째 숫자를 더함

2. 짝수번째 숫자를 더함 (마지막 12번째 제외)

3. 첫번째 합을 3만큼 곱하고 두번째 합과 더함

4. 전체 합에서 1을 뺌

5. 결과값을 10으로 나눴을 때의 나머지를 구함

6. 9에서 이 나머지를 뺌

 

예를 들어 어떤 식품의 바코드 숫자는 0 13800 15173 5 인데 이걸로 확인해보자.

1. 0+3+0+1+1+3 = 8

2. 1+8+0+5+7 = 21

3. 8*3+21 = 45

4. 45-1 = 44

5. 44%10 = 4

6. 9-4 = 5

 

그럼 UPC의 확인자릿수를 계산해주는 프로그램을 만들어 볼 것임.

사용자가 11자리의 숫자를 입력하면 이에 해당하는 확인자릿수를 출력하는 프로그램임.

혼동을 피하기 위해 아래와 같이 따로따로 세 가지 값을 입력받을 것임.

 

첫번째 한자리수 숫자를 입력해주세요:

첫번째 다섯자리 숫자를 입력해주세요:

두번째 다섯자리 숫자를 입력해주세요:

 

이때 다섯자리 숫자는 말 그대로의 의미보다는 다섯개의 서로 다른 숫자 모임으로 인식하게 함.

오래된 컴파일러에게는 저장하기에 너무 큰 수일수도 있기 때문임.

한 자리만 읽기 위해선 scanf()와 %1d 변환규격을 사용할 것임.

 

 

여기서 표현식 9 - ((total - 1) % 10)을 9 - (total - 1) % 10으로 적을 수 있음에도 괄호 추가함.

괄호는 가독성을 높여주기 때문.

'C' 카테고리의 다른 글

KNK Chap.4 (4.4~4.5)  (0) 2022.12.14
KNK Chap.4 (4.2~4.3)  (0) 2022.12.14
KNK Chap.3 (Q&A)  (0) 2022.12.14
KNK Chap.3 (3.2)  (1) 2022.12.14
KNK Chap.3 (3.1)  (1) 2022.12.07
Comments