본문 바로가기
배운 것들 메모/따라 배우는 C언어

4.10 강 들으면서 추가적으로 조사한 것 -2

by 야속한 낭만 2024. 8. 25.

※이번 메모는 강의와 관련하여 들으면서 제 호기심들을 해결한 것들입니다.

 

1. 형식 지정자 .precision 반올림에 대해서

 

어쩌다가 발견한 것인데, 출력이 3.1234567이 되야하는 데 계속해서 3.123457이 되는 형상을 목격하게 되었다.

 

예시 1)

 

형식 지정자에서 정밀도는 부동 소수점에서 소수점 이하 몇 자리까지 표현할 것인지를 결정한다.

예를들어 .6%f라고 지정했을 때, 우리가 원하는 기대값은 3.123456일 것이다.

그러나 지정된 숫자 값이 출력될 값보다 길 경우, 남은 자릿수를 반올림한다.

반올림이 된 모습

 

2. char와 int 형식의 %c 사용 비교

 

 

"int 형식으로 받는다"는 말은 'c' 지정자가 int 형식의 값을 받는다는 것을 의미한다. 그런데 char 형식의 값을 받을 수 있는 이유는 char 타입이 사실상 1바이트 크기의 정수로 취급되기 때문. 원문링크

 

여기 예시를 들어 설명하면

1. int로 받을 때

 

int num = 65; // 'A'의 아스키 코드임
printf("%c", num); // 'A'가 출력됨

 

num에 ASCII 값이  'A'와 대응하는 65가 저장된다.

그리고 %c  형식지정자를 사용하여 65의 인 ASCII 값이 문자 'A'로 출력된다.

 

2. char로 받을 때

char c = 'A';
printf("%c", c);

 

이 코드는 char 형식의 변수 c에 'A'라는 문자를 저장함.

이때 %c의 형식 지정자를 사용하여 c 변수에 저장된 'A' 문자가 출력된다.

 

결론적으로 둘 다 'A' 문자를 출력하지만, 하나는 int로 받고, 다른 하나는 char로 받는다.

이러한 이유는 char가 1바이트 크기의 정수로 취급되기 때문이다.

 

 다시 말하자면 A가 아닌. int형 65 정수가 메모리에 저장되고. 그 메모리를 해석하는 과정에서 %c는 ‘A’로 해석되어, 출력된다.

 

이거는 C언어에서 bool의 원리랑 비슷하다. bool의 1말고도 int 형 정수를 통해서도 참과 거짓을 나타낼 수 있는 것처럼.

 

3. %hdd란?

예시 2)

#include <stdio.h>
int main()
{
char i;
scanf("%hdd", &i);
printf("%hdd", i);

 

가끔 이런식으로 써있는 형식 지정자가 있다.

 

C plusplus 에 있는 표를 참고하자면

%hdd 참고 표

 

형식지정자 scanf에서 lf 가 double인 것처럼

hhd는 signed char 로 인식된다. 즉, 부호가 있는 8비트라고 생각하면 된다.

 

 

4. 어째서 intmax_t 는 플랫폼 간의 이식성을 높여준다고 할까?

 

이거에 대한 이야기가 찾기가 어려워서 chat gpt의 발언을 그대로 가져왔다.

 

 

64비트 시스템에서는 intmax_t가 long long 또는 long로 정의될 수 있지만, 32비트 시스템에서는 long long으로 정의될 가능성이 높습니다. 이렇게 되면, 프로그램은 플랫폼에 관계없이 항상 가장 큰 정수 타입을 사용할 수 있습니다.

 

 

즉, 정리하자면 플랫폼에 따라 지원하는 최대의 정수 크기가 다르기 때문에 longlong으로 구현된 코드를 가지고 있는 프로그램을 long을 최대로 하는 플랫폼에서는 longlong을 인식 못할 수 있다.

 

따라서 intmax_t는 해당 시스템에서 사용할 수 있는 가장 큰 정수 타입을 의미하기 때문에. 특정 플랫폼의 종속적인 타입을 사용하지 않고도 항상 일관되게 가장 큰 정수 타입을 사용할 수 있다는 것.

 

5. scanf에서의 쉼표 의미는 뭘까?

예시 3)

int a, b;
scanf("%d, %d", &a, &b);
printf("%d, %d\n", a, b);

 

자세히 보면 scanf 안에서 %d, %d 사이에 콤마가 있다는 것을 알 수 있다.

이 의미는 사용자 입력구분 하는데 쓰인다고 한다.

콤마가 없을 때에는 space 을 통해 구분하였지만 이제는 콤마를 통해 구분할 수 있다.

예를 들어 13, 25을 입력했다고 치면 13은 a에 들어가고 25는 b에 들어간다.

콤마 외에 다른 기호 알파벳도 사용할 수 있다.

 

6. scanf 와printf 의 return 값 차이

 

scanf

  1. 입력에서 읽은 데이터의 개수 반환함.
  2. return 값이 읽은 항목의 개수와 같으면 성공.
  3. EOF 는 입력 오류

printf

  1. 출력한 문자 수를 반환함
  2. retunr 값이 출력한 문자 수면 성공
  3. 음수는 출력 오류

 

출처:  홍정모의 따라배우는 C언어

강의 외의 추가된 것들은 책 그리고 인터넷 조사해서 얻었음