C
C기초 플러스 chap.3 데이터와 C
Barbarian developer
2024. 8. 7. 13:32
키워드
int, short, long, unsigned, char, float, double, _Bool, _complex, _Imaginary
연산자
sizeof
함수
scanf(), printf()
**리스트 3.1**
/*platinum.c --플래티넘 가치로 계산한 몸무게 */
#include <stdio.h>
int main(void)
{
double weight; /* 몸무게 */
double value; /* 플래티넘 가치로 가치로 계산한 값*/
printf("당신의 몸무게를 플래티넘 가치로 계한하면 얼마나 나갈까요?\n");
printf("어디 한번 계산해 봅시다.\n");
printf("몸무게를 파운드 단위로 입력하시오: ");
/*사용자로부터 입력을 받는다. */
scanf("%lf", &weight);
/*플래티넘 가격이 온스당 $1700라고 가정한다. */
/*14.5833은 상형 파운드 단위를 금형 온스 단위로 변환한다. */
value = 1700.0 *weight * 14.5833;
printf("당신의 몸무게를 플래티넘 가치로 계산하면 $%.2lf입니다./n", value);
printf("당신의 몸값은 그 정도 가치가 나갑니다. 플래티넘 가격이 떨어지면, \n");
printf("가치를 유지하기 위해 식사량을 늘려야합니다.\n");
return 0;
}
//실수는 double을 주로 사용한다. 실수의 지정자는 %lf.
//scanf에 지정자 %lf를 입력하고,
//&는 scanf()함수에게 입력받은 실수 값을 weight라는 이름의 변수에 저장하라는 말.
//scanf는 나한테 받은 데이터를 컴터한타 준다.(파이썬의 input)
//printf는 컴퓨터한테 받은 데이터를 나한테 준다.(파이썬의 print)
scanf 함수
scanf("%s", name);
scanf("%lf", &weight);
- 문자열의 입출력을 다루기 위해 %s 지정자를 사용함.
- weight와는 달리 name은, scanf() 함수에서 접두사 '&'를 사용하지 않음.
- scanf에서 '&'는 지정자에 변수를 대입해줌.
- scanf는 문자열과 &사이를 질투하고 있음. 그래서 서로 만나면 삐져서 출력을 안시킴.
- 한마디 요약. 파이선 input이랑 같은데, 문자열과 '&' 사이를 반대하는 대표적인 예임.
**리스트 3.2**
/*print.c --printf()의 몇 가지 특성을 설명한다.*/
#include <stdio.h>
int main(void)
{
int ten = 10;
int two = 2;
printf("바르게 지정했을 때: ");
printf("%d에서 %d를 빼면 %d\n", ten, 2, ten - two);
printf("틀리게 지정했을 때: ");
printf("%d에서 %d를 빼면 %d\n", ten); //뒤의 두 전달인자를 빼먹었다. 그래서 여기서 오류뜸. 전달인자는 3갠데, 변수는 한개임.
}
//대부분의 함수들은 전달인자의 개수가 정해져있음.
//printf()는 한번에 여러개의 전달인자를 사용 할 수 있음.
//전달인자는 그 안에 들어가는 데이터 정도로만 이해
//printf()함수에서 제공하는 포맷 지정자의 개수와, 출력할 값이 개수가 일치하는지 항상 확인.
printf 함수의 몇 가지 특성
- 대부분의 함수들은 전달인자의 개수가 정해져있음.
- print()는 여러개의 전달 인자를 사용할 수 있음.
- 전달인자는 그 안에 들어가는 데이터 정도로만 이해?? 먼느낌인지는 알지?
- printf()함수에서 제공하는 포맷 지정자의 갯수와, 출력할 값이 갯수가 일치하는지 확인해야함. 다르면 컴터 삐짐
- 위의 예시는 포맷 지정자의 갯수와 출력할 값이 일치하는 경우와 일치하지 않은 경우의 예시임.
**리스트 3.5**
/* charcode.c --문자에 대응하는 코드값을 표시한다. */
#include <stdio.h>
int main(void)
{
char ch;
printf("키보드를 영문 모드로 놓고, 문자 하나를 입력하시오.\n");
scanf("%c", &ch); //사용자가 문자를 입력한다.");
printf("문자 %c에 대응하는 코드값은 %d이다. \n", ch, ch);
return 0;
}
아스키코드
- 아스키 코드는 컴퓨터가 읽는 문자의 코드임. 0~127까지 코드에 문자를 저장해서 이용함.
- 아스키코드의 지정자는 %c임. 변수를 저장할 때 사용하는 자료형은 char임!
- 컴터는 바보임 그래서 A가 문자인지도 모름. 그래서 우린 그걸 컴터가 아는 언어로 때려박은거임!
- 예를 들어, 우리가 c를 입력하면 c를 컴퓨터로 67을 출력함.
- 67은 그래도 컴터가 알고 있는 거임!! 그래서 67=c라고 교육한거임.
- 그래서 우리의 언어로 c라고 입력하면 컴터는 아 그거 67임! 이라고 받아들이는거임!!
- 그래서 얘를 어따쓰냐고? 문자 하나 출력할때 빼곤 딱히 안씀! 문자가 어케 출력되는지 이해만 하면 댈거 같음!!
- 아래는 아스키 코드임. 컴터 얘 겁나 피곤하게 사는듯.
**리스트3.6**
// altnames.c --정수형을 나타내는 이식 가능한 이름들
#include<stdio.h>
#include<inttypes.h> //이식 가능한 이름들을 지원한다.
int main(void)
{
int32_t me32; //me32는 32비트 부호 있는 정수형 변수이다.
me32 = 45933945;
printf("먼저, int32_t를 int형이라고 가정한다:");
printf("me32 = %d\n", me32);
printf("이제, 어떠한 가정도 하지 말자.\n");
printf("그 대신에, inttypes.h에 있는 \"macro\"를 사용한다.:");
printf("me32 = %" PRId32 "\n",me32);
return 0;
}
//먼말인지 하나도 모르겠음. 패스
이식가능한 stdint.h와 inttypes.h
- PRId32는 inttypes.h에 저장된 어떠한 변수 비슷한거임. Printf d(정수)의 준말임.
- 메모리 값을 고정한다는 거고, PRId32는 32비트로 메모리를 고정한다는 거임.
- 다른 환경에서 다른 비트를 썼어도 요걸 쓰면 32비트로 사용 가능하단거임.
- 한마디로, 방크기를 정해주고 거기서만 놀라는것.
**리스트3.8**
// typesize.c --데이터형들의 크기를 출력한다.
#include <stdio.h>
int main(void)
{
//c99는 크기를 위해 %zd 포캣 지정자를 제공한다.
printf("int형의 크기: %zd바이트\n", sizeof(int));
printf("char형의 크기: %zd바이트\n", sizeof(char));
printf("long형의 크기: %zd바이트\n", sizeof(long));
printf("long long형의 크기: %zd바이트\n", sizeof(long long));
printf("double형의 크기: %zd바이트\n", sizeof(double));
printf("long형의 크기: %zd바이트\n", sizeof(long double));
return 0;
}
//sizeof()함수는 입력한 데이터형의 크기를 알려준다.
//혹시 다른 컴파일러 환경에서 %zd를 인식하지 못한다면, %u, %lu를 대신 사용하면 된다.
데이터 형들의 크기 sizeof
- 바이트 단위를 알려주는 내장 연산자임.
- 위와같이 %zd라는 지정자를 이용하여 sizeof()에 데이터형을 입력하면 그 바이트의 크기를 출력해준다.
- 근데 표준을 사용하지 않는 반동분자가 간혹 튀어나오는데 그럴땐 빠르게 %u, %lu로 참교육을 시전한다!
이상, 챕터 3에서 가장 먼저 알아야할 내용들만 빠르게 훑어봤다! 나도 했다 너네도 한다!! 베엘라!!