본문 바로가기

Study/C

2.2 sizeof, 화면입출력, 상수, 리터럴


sizeof 연산자

sizeof : 타입 또는 변수의 크기를 바이트단위로 알려준다.

같은 타입이라도 각 CPU종류와 컴파일러에 따라 크기가 다르기 때문에 필요하다. (같은 int라도 어떤 컴퓨터에서는 4byte, 어떤 컴퓨터에서는 2byte가 가능)

  
sizeof 변수: 변수의 크기를 byte단위의 정수로 반환.
sizeof (타입): 타입의 크기를 byte단위의 정수로 반환.

ex)
int i = 100;
printf("%d", sizeof i);
printf("%d", sizeof(int));



상수와 리터럴


  • 상수(constant): "한번만 값을 저장할 수 있는 공간."

선언과 동시에 초기화 해야 한다. 한 번 값을 저장하면 변경할 수 없다.

상수는 보통 대문자만으로 이름을 정한다.

  
const int MAX; //에러.
const int MIN = 0; //OK.
MIN = 100; //에러.



  • 리터럴(literal) : 수학에서 쓰는 상수. 프로그래밍에서 상수와 겹치기 때문에 이름을 바꾼 것. 그냥 숫자.

리터럴에 접미사를 붙여서 변수의 타입을 구분해준다. 그냥 단독으로는 붙이나 안 붙이나 결과가 똑같지만, 계산식에서는 다른 결과를 야기할 수 있다. link: 연산자

ex) 100 == 100LL이지만, (10000000 * 100) ≠ (10000000 * 100LL)이다.

타입접미사
int없음
longL
unsignedU
floatF
double없음
long doubleL

접두사도 숫자를 표현하는데 이용된다.

표기예시 뜻
08진수int octNum = 0377377(8), 255(10)
0x16진수int hexNum = 0xFFFF(16), 255(10)
e지수double avo = 6.02e236.02 * 1023

* char은 빈칸을 저장할 수 없지만, char[] 는 빈 문자열을 저장할 수 있다.

ex)

  
char nothing = ''; //ERROR
char blank = ' '; //OK. 띄어쓰기를 넣어주었다.
char[] emptyStr = ""; //OK. 빈 문자열 저장



  • 확장열(escape sequence): 인쇄할 수 없는 문자들을 표현한다. '\'를 붙여서 표현한다. printf("\n")에 들어가던 걔네 맞다. ',",\ 얘네를 표시할 때도 앞에 \를 붙여준다.

    ex)

      
    char tab = '\t'; //tab
    char tab = 9; //tab의 아스키코드가 9
    char quote = '\''; //따옴표 \'
    char

<코딩꿀팁! 상수를 이용해서 코드 깔끔하게 정리하기>


상수가 필요한 이유?

→ 숫자(리터럴)에 의미있는 이름을 붙여서 코드의 가독성+유지보수성을 높여준다.

ex) 도형의 면적 구하기

  
int triangle = 20*10/2;
int rectangle = 20*10;

값을 수정하려면 20, 10을 일일히 다 수정해주어 한다 + 20, 10이 무엇인지 알아보기 힘들다

따라서, WIDHT와 HEIGHT라는 상수를 이용하면 가독성도 좋아지고, 코드를 수정하기도 좋아진다.

  
const int WIDTH = 20;
const int HEIGHT = 10;

int triangle = (WIDTH*HEIGHT) /2 ;
int rectangle = WIDTH*HEIGHT;

비슷한 방법으로 #define을 이용할 수도 있다.


  • #define : 전처리기 지시자 중 하나. 컴파일 되기 직전에 코드부에서 특정 문자를 치환한다.

전처리기 지시자라서 끝에 ';'을 붙이지 않는다.

  
#define WIDTH 20 //코드의 WIDTH라는 단어를 20으로 치환하여 컴파일해라.
int rectangle = WIDTH * 10; //20 * 10;
printf("WIDTH== %d",WIDTH); //WIDTH== 20이 출력됨.

이 코드에서 WIDTH라고 쓰인 부분은 컴파일 직전에 20으로 치환되어 컴파일된다. 단, 문자열로 정의된 부분("WIDTH == %d")은 치환되지 않고 WIDTH라는 글자 그대로 나온다. 만약에 문자열에서도 바꿔 보이게 하고 싶다면 ""밖으로 빼내면 된다. 이렇게

  
#define NAME SUNMON
printf("I am " NAME". HELLO!");




타입의 일치

변수를 옮겨 저장할 때, 타입을 일치시켜주는것이 좋지만 그럴 수 없는 경우엔 그냥 저장해도 된다.

단, 옮겨 담는 그릇의 크기에 따라 데이터가 잘릴 수도 있다는 건 감안하자.

  
int a = 10;
double b = 15.27374;
int c = 4;

a = b; // OK. 단, a에는 15만 저장된다.
b = c; // OK. b에는 4.0000이 저장된다.

//0x1234567890 : 5byte (12/ 34/ 56/ 78/ 90 각 1byte씩)
short s = 0x1234567890; //short의 크기: 2byte
int i = 0x1234567890; //int크기: 4byte

실제로 저장되는 :
s = 0x7890;
i = 0x34567890;

* 높은 자리 부분이 잘린다.





화면 입력과 출력 - printf(), scanf()

  • printf() : 화면에 데이터 출력하는 함수

  • scanf() : 화면으로부터 데이터를 입력받는 함수

printf()

지시자 표

* 지시자에 따라 같은 글자라도 다르게 출력된다.

ex)

  
char ch = 65;
printf("%d", ch); // 65 출력
printf("%c", ch); // A 출력
\* 부호 없는 정수를 출력할 반드시 %u를 이용할것! (%d하면 이상하게 나올 있다.)

printf를 할 때 글자수도 제한해줄 수 있다.

ex)

  float f = 1.2345678f;
printf("%5f", f); //소수 포함 5자리만 출력
printf("%.3f", f); //소수점 아래 3자리까지만 출력
printf("%5.3f", f); //전체 5자리 중 소수점 아래 3자리까지만 출력(반올림)
printf("%05f", f); //전체 5자리 중 소수점 아래 3자리까지. 나머지 남은 빈자리는 0으로 채움
printf("%e", f); //지수형태로 출력
printf("%g", f); //소수부를 간략하게 출력.

//float은 %f, double은 %lf


scanf()

사용법:

  int input;
scanf("%d", &input); //변수명 앞에 &를 붙여준다.

* double을 입력받을 때는 반드시 지시자를 '%lf'로 사용해주어야 한다.

* %d는 엔터만 치면 무시한다. 정수만 입력받기 때문에.

하지만 %c는 Enter나 space도 하나의 문자로 인식해서 받아들인다.

→ 그래서 char배열을 반복문으로 입력받을 때 오류가 발생할 수 있다! [링크]


'Study > C' 카테고리의 다른 글

2.3 진법 , 기본형  (0) 2018.07.19
2,1 변수와 자료형  (0) 2018.07.16
2. Hello, World!  (0) 2016.12.20
1. 기초부터  (1) 2016.12.20
0. Unix와 Linux  (0) 2016.12.20