본문 바로가기

C언어/복습

[C언어]DAY2_변수, 상수, 자료형, 출력지정자

상수란 ?

 : 변하지 않는 값 constant


  1. 리터럴 상수. 값 자체

  2. 심볼릭 상수. 겉에서 보면 변수처럼 보이지만 변경불가.

                      형식 : 모두 대문자로 하는 것 **관습**.

                                 #define PI 3.14
                                 #define RATE 1090

 

변수란 ?

 : 값을 저장하기 위하여 할당된 메모리 공간.

 

 

  * byte : 메모리의 단위
  * 1bye = 8bit
  * 2의 8승에 저장할 수 있는 값의 갯수는? 256
  * bit = 1 or 0
  * 8giga 메모리

 

 

#include

main(){

 

변수 선언 : 변수이름과 자료형
변수 선언 방법 : 한줄에 한개, 여러개
초기화를 동시에 할 수 있다.

 초기화란 ? 변수의 초기값을 넣어주는 일.

 

  1. 선언과 동시에 초기화
char letter = 'a';


char : 데이터타입. 문자타입
letter : 변수명
'a' : 값(리터럴상수)

 

  2. 선언, 초기화 따로
char letter2;

  *선언을 먼저 하고 변경을 함. (선언을 맨위에 함께 해야함.)

 

int number1 = -200;

int : 데이터타입. 정수타입

 

float number2 = 12.3f;
float : 실수타입 (소수점 있는 수)

12.3 : 실수 리터럴은 double type이라고 생각함. 정보가 손실된다고 생각해서 경고가 뜸.
12.3f : float type의 리터럴

 

double number3 = 12.4;
double : 실수타입 (소수점 있는 수)

같은 실수타입이지만 float과 double 의 차이 : float보다 double이 더 정밀함.

 

심볼릭 상수
const라는 키워드를 변수타입 앞에 붙이면 상수가 됨(변경불가)
const float pi = 3.14f;

 

 대입연산자 =은 같다가 아님. 오른쪽 값(rvalue)이 왼쪽 변수(lvalue)에 저장된다는 의미.

letter2 = 'b';


number1 = 100;  변수는 변경가능
  pi = 3.14159; ERROR! 상수는 변경불가
   -> 3.14 = 3.14159;

  변수를 선언하기 전에는 사용불가.
  num = 10; ERROR!

 

 

변수 이름 짓기


 규칙
     1. 영문, 숫자, _(underscore)로 구성. 대소문자 구분
     2. 안되는 경우 : 
          1) int 1_num; ERROR! 숫자로 시작하면 안됨.

          2) int num-3; ERROR! -는 안됨.
          3) int const; ERROR! const는 keyword(reserved word) 예약어. C 문법에서 사용하므로.

 

 

//char
printf("letter의 값은 %c입니다.\n", letter);
printf("letter의 값은 %d입니다.\n", letter);
printf("letter의 byte수는 %dbyte입니다.\n\n", sizeof(letter));

 

printf("letter의 byte수는 %fbyte입니다.\n\n", sizeof(letter));

/* 데이터 타입과 형식지정자 안맞는 경우 올바를 값이 나오지 않는다.
메모리에 저장된 형태는 int형태인데 해석을 float로 한다.
int를 저장하는 방식과 float를 저장하는 방식이 다르다.*/

 

 


//int
printf("int의 값은 %d입니다.\n",number1);
printf("int의 byte값은 %dbyte입니다.\n\n",sizeof(number1));
//float
printf("float의 값은 %.1lf입니다.\n", number2);
printf("float의 byte값은 %dbyte입니다.\n\n", sizeof(number2));
//double
printf("double의 값은 %.1lf입니다.\n", number3);
printf("double의 byte값은 %dbyte입니다.\n\n", sizeof(number3));

}

 

* sizeof는 그 타입의 바이트를 알려줌.

 


#include

main(){

char letter = 'a';

char letter2;

int number1 = -200;
float number2 = 12.3f;
double number3 = 12.4;
const float pi = 3.14f;

letter2 = 'b';


number1 = 100;


printf("letter의 값은 %c입니다.\n", letter);
printf("letter의 값은 %d입니다.\n", letter);
printf("letter의 byte수는 %dbyte입니다.\n\n", sizeof(letter));

printf("int의 값은 %d입니다.\n",number1);
printf("int의 byte값은 %dbyte입니다.\n\n",sizeof(number1));

printf("float의 값은 %.1lf입니다.\n", number2);
printf("float의 byte값은 %dbyte입니다.\n\n", sizeof(number2));

printf("double의 값은 %.1lf입니다.\n", number3);
printf("double의 byte값은 %dbyte입니다.\n\n", sizeof(number3));

}


// 문제 :
// 문제 : 변수 3개 number_1에 10, number_2에 20, number_3에 50을 각각 선언하고 초기화하라.
// 이를 아래와 같이 한줄에 출력하시오.
// number_1=10, number_2=30, number_3=50.

 

#include <stdio.h>

void main() {

	int number_1 = 10;
	int number_2 = 20;
	int number_3 = 50;

	printf("number_1 = %d, number_2 = %d, number_3 = %d\n", number_1, number_2, number_3);

}

// 문제 : 문자와 아스키코드 테스트
// 문자 'A'와 문자 'a'의 아스키코드 값은 같은가? 출력하여 확인해 보세요.
// 아스키코그 값이 90인 문자는 무엇일까? 출력하여 확인하여 보세요.

 

#include <stdio.h>

int main(){

	char data1 = 'A';
	char data2 = 'a';

	char data3 = 'Z';

	printf("%c %c\n", data1, data2);
	printf("%d %d\n\n", data1, data2);
	printf("%d\n\n", data3);

	printf("%c\n\n", 90);
	printf("%c\n\n", 128);

}

// 문제 : 상수 사용
// 원주율은 3.14 이다.
// 이를 #define과 const를 사용하여 각각 다른 이름으로 상수로 정의하고 이를 출력하라.

 

#define PI 3.14

#include <stdio.h>

main(){

const double pi = 3.14;

printf("pi = %.2lf\n", pi);
printf("PI = %.2lf\n\n", PI);

}

 



http://pythontutor.com/
코드를 시각화 해주는 곳
* 주석을 빼고 해야함.

 

* 프로젝트이름.sln 누르면 전체 프로젝트(소스,...)가 뜬다.
* 줄번호가 없는 경우 : 도구 > 옵션 > 텍스트 편집기 > C/C++ > 줄번호 체크

 


=궁금증=

 

1. lf와 f의 차이.

     %f : float 4byte
     %lf : long float 8byte

 

printf 와 scanf 의 함수 원형을 보면
int printf ( const char * format, ... );
int scanf ( const char * format, ... );
이렇게 생겼습니다. 마지막에 인자의 형태가 ... 으로 생겼는데 이를 가변인자라고 합니다.
몇 개의 인자를 더 받을지 모를 때 이런 식으로 써주고 const char * format 에 적어 놓은 대로
넘겨 받은 인자를 해석해서 사용하게 됩니다.

이렇게 가변인자의 경우 값을 넘기면 항상 원래의 자료형 그대로 넘어가는 게 아니라 일정한 규칙에 따라 넘겨집니다. char, short 의 경우 int 로 형변환되어 넘기고, float 은 double 로 형변환해서 넘깁니다.
그래서 printf 에서 출력할 때 char, short, int 를 %d 로 출력할 수 있는 것이고,
float 과 double 을 출력할 땐 %f, %lf 아무 거나 써도 됩니다. %lf 도 %f 로 처리됩니다.

그런데 포인터의 경우엔 이러한 자료형의 변형이 일어나지 않습니다.
printf 는 정수나 실수를 출력할 때 저장된 값만 그대로 유지하고 출력하면 되므로 형변환을 해줘도 되는데
주소의 경우엔 메모리의 일정 크기의 공간를 해당 자료형의 저장 방식에 맞게 저장해야 합니다.

float 은 4 바이트 공간에 부호 1비트, 지수부 8 비트, 가수부 23 비트로 이루어져 있고
double 은 8 바이트 공간에 부호 1 비트, 지수부 11 비트, 가수부 52 비트로 이루어져 있습니다.
저장하는 공간의 길이도 다르고 비트별 의미하는 바도 다릅니다. 그래서 각각의 메모리 저장 방식에 맞게
기록하기 위해서 scanf 에서는 float 과 double 을 구분해서 %f 와 %lf 를 사용합니다.

참고로 1바이트의 정수, 2 바이트의 정수를 저장하려면
char ch; // 1 바이트 정수
short sh; // 2 바이트 정수
scanf("%hhd %hd", &ch, &sh);
printf("%d %d\n", ch, sh);
이런 식으로 사용해 줍니다. int 를 저장할 때 %d 를 씁니다.
half half decimal 은 1/2 * 1/2 * 4 = 1 이고
half decimal 은 1/2 * 4 = 2 가 되어 각각 1 바이트 정수, 2 바이트 정수를 의미합니다.

정리하자면, scanf 는 자료형의 크기와 형식에 맞춰서 각각 신경써줘야 하고
printf 는 가변인자에서 자료형의 승급이 일어나므로 어느 정도 하나의 표현으로 퉁치는 경향이 있습니다.


출처
https://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=332774717&qb=JWxmIOyZgCAlZg==&enc=utf8&section=kin&rank=2&search_sort=0&spq=0