📌 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문 (2) | 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 |