Q&A (pow, fmod, 연산자)

2024. 9. 3. 15:49·📚 STUDY/🔥 C

📌 C언어는 지수연산자가 없던데, 그러면 제곱 연산을 할 수 있죠? 

- 정수를 작은 양의 정수만큼 제곱하는 건 그만큼 곱해주면 됨. (i 세제곱은 i * i * i)

- 정수가 아닌 숫자만큼 제곱할 거면, pow 함수가 필요함.

  *pow() 함수는 y의 거듭제곱에 대한 x의 값을 계산

#include <math.h>
double pow(double x, double y);

 

 

📌 % 연산자를 고정소수 피연산자에도 적용하고 싶은데 컴파일이 안되네요. 어떻게 해야하죠?

- % 연산자는 정수 피연산자를 필요로 함. fmod를 써보는 건 어떨까?

   *fmod() 함수는 x/y의 부동 소수점 나머지를 연산함. 결과의 절대값은 항상 y의 절대값보다 작고, 결과는 x와 같은 부호를 가짐.

#include <math.h>
double fmod(double x, double y);

 

 

📌 /와 % 연산자를 음수연산자랑 같이 사용하는 규칙이 왜 그리 복잡한가요?

- 그렇게 복잡하지 않음.

- C89, C99 둘 다 목표는  (a / b) * b + a % b의 값이 언제나 a와 같도록 하는 것임. 두 표준 모두 a / b가 정상 representable이면 위의 상황은 언제나 성립함.

- 문제는 a / b랑 a % b가 만약 둘 중 하나라도 음수면 위의 항등식을 만족시키는데 두 가지 방법이 있다는 것. C99가 나왔을 즘엔 대부분의 CPU가 위와 같은 상황일 땐 값을 0과 가까운 값으로 선택하게 설계되어 있어, C99에는 오로지 1가지의 결과만 나옴.

 

 

📌 C가 왼쪽값이 있다면, 오른쪽값도 있나요?

- 왼쪽값 : 할당의 왼쪽에서 나타날 수 있는 표현식

- 오른쪽값 : 오른쪽에서 나타날 수 있는 표현식

  * 변수, 상수, 좀 더 복잡한 표현식이 될 수 있음. 이 책에서는 오른쪽값 대신 표현식이라는 용어를 사용함.

 

 

📌 v가 부작용이 있으면 v += e가 v = v + e와 동일하지 않다고 했는데, 이게 무슨 뜻인가요?

- v += e를 평가할 땐, v가 딱 1번만 평가됨.

- v = v + e에서는, v를 2번 평가해야 함.

 

예시)

// 1번
a[i++] += 2;

// 2번
a[i++] = a[i++] + 2;
  • 1번은 +=, 2번은 =를 사용한 것. 2번 코드에서 i의 값은 구문에서 변형되면서 동시에 구문에서 사용되는 중. 
  • i의 값이 2번 증가될 것이라고 예상할 수 있지만, 확실히 무슨 일이 일어날 지는 모름.

 

📌 C가 굳이 ++와 -- 연산자를 제공하는 이유가 뭐죠? 다른 증감연산보다 더 빠른가요? 아니면 그냥 편의인가요?

- C의 증감연산자는 켄 톰슨의 B언어로부터 이식된 것임. 이러한 연산자를 만든 이유는 B 컴파일러가 i = i + 1보다 ++i에 대해 좀 더 구체적인 번역이 가능해서임.

- 요즘 컴파일러에서 ++, --를 쓴다고 컴파일된 프로그램이 더 빨라지거나, 용량을 적게 만들어주지는 않음. 사용하기 편해서 아직까지 사용되는 것임.

 

 

📌 ++랑 --는 float 변수에도 적용되나요?

- YES. 정수 뿐만 아니라 고정소수에도 적용됨.

- 하지만, 실생활에서 float 변수를 증감하는 것은 자주 사용하지 않을 뿐임.

 

 

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

- 답하기 어려운 질문임.

- C 표준에 의하면, C 언어에는 '순서 지점(sequence point)'이라는 개념이 존재함.

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

- C에는 수많은 순서지점이 존재함.

  (ex, 표현문의 끝 지점 : 표현문이 끝날 때가 되면, 반드시 그 구문에 있는 증감연산은 전부 실행되었어야 한다, 이게 실행되지 않으면 그 다음 구문이 실행되지 않음.)

 

 

📌 표현문의 값이 버려진다는 게 정확히 무슨 뜻인가요?

- i가 5를 갖고 있고, i+1은 6이라는 값을 생성해낼 것임. 이걸 구문으로 만들면 아래처럼 됨.

i + 1;
  • 이 구문이 실행되면 6이 계산되지만, 이 값을 어디에 저장하지도 않고, 사용하지도 않으니 버려지게 될 것임.

 

📌 그럼 i = 1;와 같은 구문은요? 얘네들도 값이 버려지는건가요?

- C에서 =도 연산자라는 것을 까먹으면 안 됨. 다른 연산자들이 그러듯, 값을 생성해냄.

i = 1;
  • i에 1을 저장해 전체 구문의 값은 1이 되고, 이 값은 버려지게 됨.
  • 표현식의 값을 버리는 건 크게 문제되는 부분이 아님. 애초에 이 구문 자체가 i의 값을 수정하려고 작성한 것이지, 저 값을 어디에 써먹으려고 작성한 건 아니기 때문임.

 

 

 

💡 본 내용은 K.N.King의 C Programming: A Modern Approach 책을 참고하였습니다.

저작자표시 (새창열림)

'📚 STUDY > 🔥 C' 카테고리의 다른 글

[5-2] if문  (3) 2024.09.05
[5-1] 논리표현식  (0) 2024.09.04
[4-5] 표현문  (0) 2024.09.03
[4-4] 표현식 평가  (0) 2024.09.03
[4-3] 증감연산자  (0) 2024.09.03
'📚 STUDY/🔥 C' 카테고리의 다른 글
  • [5-2] if문
  • [5-1] 논리표현식
  • [4-5] 표현문
  • [4-4] 표현식 평가
엄지잉
엄지잉
공부하는거 올림
  • 엄지잉
    엄지잉의 이것저것
    엄지잉
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • 🏫 학교 (2)
        • 👩‍🏫 교직 (1)
        • 🏢 USG (1)
      • 🌱 탐구 (17)
        • 📷 SLAM (7)
        • 💡 연구 (8)
        • 🌐 BOJ (2)
      • 📚 STUDY (47)
        • 🔥 C (32)
        • 📈 알고리즘 (9)
        • 👀 컴퓨터비전 (5)
        • 🔆 UNITY (1)
      • 🏆 자격증 (23)
        • ⚡ 정처기 (17)
        • 🔠 TOEIC (6)
      • 🎈 활동 (4)
        • 🎁 CJ 리모트 인턴십 (2)
        • 😶 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    프언 활용
    2022년
    SW 개발
    정보처리기사
    정보시스템 구축관리
    Body Tracking
    C++
    RC
    정처기
    Unity
    컴퓨터비전
    SW 설계
    2021년
    실기
    c기초
    C
    알고리즘
    DB 구축
    Slam
    Azure Kinect
    Remote Internship
    토익
    mocopi
    opencv
    azurekinect
    필기
    모션캡처
    BOJ
    C언어
    식별자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
엄지잉
Q&A (pow, fmod, 연산자)
상단으로

티스토리툴바