데이터처리 C++/C++ PRIMER PLUS 2011. 10. 20. 18:38

■간단한 변수
int braincount;
braincount=5;
이 명령문은 하나의 정수를 저장할것이며, braincount라는 이름이 그 정수의 값, 즉 5를 나타낸다고 프로그램에게 알려준다.
이명령문만 보고는 그값이 메모리의 어디에 저장되는지는 알수 없다 그러나 프로그램은 그위치를 추적할수 있다.
사용자도 &연산자를 사용하면 braincount의 메모리 주소를 알아낼수 있다.

■변수 이름
C++에서 변수 이름을 지을때에는 다음과 같은 간단한 규칙에 따라야한다.
ⓐ변수 이름에는 영문자, 숫자, 밑줄(_) 문자만을 사용할수 있다.
ⓑ숫자를 변수 이름의 첫문자로 사용할수 없다.
ⓒ변수 이름에서 대문자와 소문자는 구별된다.
ⓓC++ 키워드는 변수 이름으로 사용할 수 없다.
ⓔ두개의 밑줄친 문자로 시작하는 이름이나, 밑줄 문자와 대문자로 시작하는 이름은, 그것을 사용하는 컴파일러와 리소스가
   사용하기로 예약되어있다. 하나의 밑줄 문자로 시작하는 이름은, 그것을 사용하는 컴파일러와 리소스가 전역 식별자로 사용하기로
   예약되어있다.
ⓕ변수 이름의 길이는 제한이 없으며, 변수이름에 쓰인 모든 문자들이 유효하다.

- 두개 이상의 단어를 결합하여 변수이름을 지을때는, my_onions와 같이 밑줄로 단어를 구분하거나, myEyeTooth와 같이 첫단어를 제외하고 각단어들의 첫문자를 대문자로 쓰는것이 관례이다.

■ 정수형
C++은 여러가지 정수형을 제공한다.
이것은 프로그램이 요구하는 특정상황에 가장 알맞은 정수형을 골라서 사용할수 있도록 하기 위해서이다.
C++의 여러 정수형들은 서로 다른 크기의 메모리를 사용하여 정수를 저장한다.
메모리 블록이 클수록 나타낼수 있는 정수값의 범위가 크다. signed데이터 형은 양수값과 음수값을 모두 나타낼수 있으나, unsigned데이터형은 양수값만 나타낼수있다. 정수를 저장하는 데 사용되는 메모리 크기를 폭(width)라 한다. 메모리 크기가 클수록 폭이 넓다. C++의 기본 정수형을 크기 순서로 나열하면 char,short,int,long순이다. 이 기본형들에 대해 signed형과 unsigned형이 각각 따로
존재한다.

■short,int,long 정수형
컴퓨터의 메모리는 비트(bit) 단위로 이루어진다.
C++에서 short,int,long은 정수를 저장하는데 사용하는 비트수가 다르다.
C++는 이 데이터형들의 최소 크기만을 정하여 보다 융통성있는 표준을 제공한다.
 ●short형은 최소한 16비트 폭을 가진다.
 ●int형은 최소한 short만큼 크다.
 ●long형은 최소한 32비트 폭을가지며, 최소한 int만큼은 크다.

C++들이 short형을 16bit로 , long형을 32bit로 사용하는 최소 보증 표준을 따르고있다. 그러나 int형에 대해서는 폭이 16,24,32가 될수있다.
일반적으로  IBM용 구식 C++에서는 int형이 16비트이다. windows 98,XP,NT,OSX등에서는 C++의 int형이 32bit이다.

다른 데이터형들의 변수도 int형 변수처럼 선언할수 있다.
short score;              //short형의 정수형 변수를 만든다.
int temperature;        //int형의 정수형 변수를 만든다.
long position;          //long형의 정수형 변수를 만든다.

int,short,long 세가지 데이터형은 부호가 있는 데이터형으로서, 나타낼수 있는 양의 정수값과 음의 정수값 범위가 거의 같다.

C++ 시스템의 정수크기가 얼마인지 알고 싶으면, 데이터 크기를 알아내는 C++도구를 사용할수 있다.
첫번째 방법은 sizeof연산자를 사용하는 것이다. sizeof연산자는 변수나 데이터형의 크기를 바이트 단위로 리턴한다.
'바이트'의 의미는 컴파일러에 따라 다르므로 2바이트 int형이 어떤 C++에서는 16비트인반면, 어떤컴퓨터에서는 32비트가 될수도있다.

두번째 방법은 여러가지 정수 형들의 범위에 대한 정보가 있는 climite헤더파일을 열어보는것이다.

 


▣climits에 정의 되어있는 기호 상수들
 기호상수  의미
 CHAR_BIT  char형의 비트수
 CHAR_MAX char형의 최대값 
 CHAR_MIN char형의 최소값 
 SCHAR_MAX signed char형의 최대값
 SCHAR_MIN signed char형의 최소값
 UCHAR_MAX unsigned char의 최대값
 SHRT_MAX short 형의 최대값
 SHRT_MIN short형의 최소값
 USHRT_MAX  unsigned short형의 최대값.
 INT_MAX  int의 최대값
 INT_MIN  int의 최소값
 UINT_MAX  unsigned int 의 최대값
 LONG_MAX  longt의 최대값
 LONG_MIN  long의 최소값
 ULONG_MAX  unsinged long형의 최대값

■unsigned형
- unsigned형을 사용하면 그변수에 저장할수 있는 최대값을 늘릴수 있다. 예를들어 short형이 -32768에서 +32767까지의 범위를
  갖는다면, unsigned short는 0부터 65535까지의 범위를 갖는다. 물론 unsigned형은 인구수,낱알수, 웃는 얼굴 표정수와 같이 결코
음수가 될수 없는 양을 나타낼 때만 사용해야한다.

 


■정수형 상수
 정수형 상수는 212,1776과 같이 프로그램에 직접 써넣는 정수를 말한다.
 정수형상수에는 세가지 방법이있다. 일상생활에서는 사용하는 10진수, 구식 Unix가 사용하던 8진수, 하드웨어 전문가가 좋아하는
16진수.
C++에서는 상수의 처음하나의 숫자 또는 처음 두개의 문자가 진수를 의미한다.
처음 숫자가 1~9이면 그수는 10진수이다. 처음 숫자가 0이고 두번째 숫자가 1에서7이면 그수는 8진수이다.
따라서 042는 8진 정수형 상수이며, 10진수로는 34이다. 그리고 처음 두개의 문자가 0x또는 0X이면 16진수를 나타낸다.
0x42는 16진 정수형 상수이며 10진수로 66이다. 그런데 16진 정수형 상수를 나타내는데쓰이는 A~F까지의 문자는 10진수로 각각 10에서 15까지 해당하는 16진수 숫자이다. 그러므로 0xF는 10진수로 15이고 0xA5는 10진수로 10x16+5,즉 165이다.


 


■C++가 상수의 데이터형을 결정하는 방법
cout<<"Year ="<<1492<<endl;
-프로그램은 149를 int로 저장할까 long형으로 저장할까 아니면 다른형으로 저장할까?
  C++에서는 특별한 이유가 없다면 정수형상수를 모두 int형으로 저장한다.
  그러나 특정 데이터형을 의미하는 접미어를 상수에 붙였을때와 , 값이 너무커서 int형으로 저장할수 없을때에는 그렇지않다.

 접미어에 대해 알아보자.
 접미어는 상수 끝에 붙는 문자로서 그 상수의데이터형을 나타낸다. l이나Ldms long형을 의미하고 u나U는 unsigned int형을 의미.
 ul은 unsigned long형을 의미,(ul의 l은 숫자1과 혼동하기 쉬으므로 대문자L로 사용한다.)

 16비트 int형과 32비트 long형을 사용하는 시스템에서, 22022는 16비트 int형으로 저장되고 , 22022L은 32비트 long형으로 저장된다.
 그리고 22022LU와 22022UL은 unsigned long형으로 저장된다.

 C++는 16진수 정수나 8진 정수에 적용하는 규칙과는 약간 다른 규칙을 10진수 정수에 적용하고있다.
 접미어가 없는 10진 정수는 int,long,unsigned long형중에 크기가 가장작은것으로 나타낸다.
 예를들면, 16비트 int형과 32비트 long형을 사용하는 시스템에서, 20000은 int형으로, 40000은 long형으로  300000000은 unsigned 
 long형으로 나타낸다. 또한 접미어가 없는 16진 정수나 8진 정수는 int,unsigned int , long, unsigned long형 중에 크기가 가장작은
 것으로 나타낸다. 그이유는 성질상 부호가 없는 메모리 주소를 일반적으로 16진수로 나타내기 때문이다.
 그래서 16비트 주소를 나타내는데는 long형보다 unsigned int형이 적당하다.


■char형: 문자와 작은 정수
 char형은 이름에서 알수 있듯이, 문자와 숫자를 저장하기 위한것이다.
 char형은 실제로 또 하나의 정수형이다. 컴퓨터 시스템에서 사용하는 문자와 숫자, 구두점과 같은 기본적인 기호들을 모두 char형
 으로 나타낼수있다. 대부분의 컴퓨터 시스템들은256개 보다 적은 개수의 문자들을 지원한다.
 이러한 문자들은 1바이트만으로 충분히 나타낼수 있다. 그러므로 char형은 문자들을 처리하는 데 사용할수 있고, short형보다 작은  범위의 정수를 나타내는데 사용할수 있다.
 예를들어 65는 문자 A에 해당하는 코드이고, 77은 문자M에 해당하는 코드이다.
 ASCII나 EBCIDC은 국제적인 요구를 모두 수용하지 못한다. 그래서 C++는 보다 넓은 범위의 값을 수용하는 Unicode국제 문자 세트
 를 사용할수 있는 확장 문자형을 지원한다 그러한 데이터형을 wchar_t형이다.



char형 A에 해당하는 숫자는 65이다.


 

 


-cout.put()란?
 cout.put()은 C++객체 지향 프로그래밍에서 중요한 개념인 맴버함수를 설명할수 있다.
클래스는 데이터 형식과 그 데이터를 다루는 방법을정의 해놓은 것이다.
맴버 함수는 클래스에 속하고, 클래스의 데이터를 다루는 방법을 정의한다.
예를들어, ostream클래스는 문자를 출력하도록 설계된 put()이라는 맴버함수를 가지고있다.

맴버함수는 그 클래스의 특정 객체를 통해서만 사용할수 있다. cout객체를 통해 put()이라는 맴버함수를 사용한다. cout과 같은
객체를 통해 멤버함수를 사용하려면 마침표(.)로 객체이름(cout)과 함수이름(put())을 서로연결해야한다.
이마침표를 멤버연산자라고 부른다. cout.put()이 나타내는 의미는 클래스 객체인 cout을 통해 클래스 멤버함수인 put()을 사용하겠다는 뜻이다.

cout.put 맴버함수는 << 연산자를 사용하여 문자를 출력하는 것에 대한 대안이다.
그런데 여기서 cout.put()이 왜 필요한가?
 그것은 C++ Release 2.0 이전에 cout은 문자 변수들을 문자로 출력했지만, 'M'이나 'N'과 같은 문자 상수들은 수로 출력했다. 이문제는  C와 C++초기 버전들이 문자 상수를 int형으로 저장하는데서 비롯되었다.
즉, 문자상수'M'에 해당하는 코드 77이 16비트 또는 32비트로 저장되었다. 그러나 cahr형 변수는 8비트만 차지했다.그래서 다음과 같은 명령문은

char ch='M';
 문자상수 'M'으로 부터 char형 변수 ch로 8비트만복사했다.
이것은 문자상수'M'과 char 변수 ch가 동일한 값을 가지고 있더라도 cout에게는 서도 다르게 보였다는것을 의미한다.

그래서 다음과 같은 명령문은
cout<<'$';

문자$를 출력하지않고. '$'에 해당하는 ASCII코드 36을 출력했다. 그러나 다음 과 같은 명령문은

cout.put('$');

원하는 대로 문자 $를 출력했다. C++ Release2.0 이후에 모든 C++들은 문자상수를 int형이 아닌 char형으로 저장한다.
그래서 이제는 cout이 문자상수를 바르게 처리할수 있게되었다.

■만국 문자 이름
- C++는 특정 키보드와 무관한 국제 문자들을 표현하는 메커니즘도 가지고있다. 그것을 만국문자이름(Universal character names)
   라고 한다.

●signed char형과 unsigned char형
-int 형과는 달리, char형은 signed형이나 unsigned형으로 미리 정해져있지않다. 이것은 개발자가 하드웨어 특성에 맞추어 알맞은
 char형을 정할수 있도록 하기위한 배려이다. 그러나 char형이 어느 특별한 한가지 행동만을 보여야한다면, signed char형 또는
 unsigned char형을 사용하여 그행동을 명시적으로 제한할수 있다.

char fodo;              //signed형 또는 unsigned형
unsigned char bar;     //unsigned형 char
signed char snark;    //signed형 char
이러한 구별은 char형으로 수를 나타내고자할때 중요하다.
unsigned char형은 0에서 255까지의 범위를 나타낼수 있고, signed char형은 -128부터 127까지의 범위를 나타낼수있다.
예를들어,200정도 되는 값을 char형 변수에 저장한다고 하면 이것은 어떤 시스템에서는 동작하지만 다른 어떤 시스템에서는 동작하지 않을것이다.  같은 값을 unsigned char형에 저장한다면 어느 시스템에서나 무리없이 동작할것이다. 그러나 표준ASCII문자를 char형
변수에 저장할때에는 signed형이나 unsigned형이나 상관없으므로 간단히 char이라고 쓰면 된다.

●확장 char형: wchar_t
-프로그램이 1바이트(8bit)로 표현할수 없는 문자세트(일본어,중국어,한글등)를 처리 해야할때에쓰인다.
 C++에서는 두가지 방법으로 처리 한다.
 첫번째, 확장 문자 세트가 시스템의 기본 문자 세트이면, 컴파일러 개발업체가 char형 을 처음부터 2바이트(16bit)또는 그이상으로
 만드는것.
 두번째, 기본문자 세트와 확장 문자세트를 동시에 지원하느것이다. 즉, 보통의 8비트 char형 으로 기본 문자세트를 나타내고,
 wchar_t형으로 확장 문자세트를 나타내는것이다.
 wchar_t형은 시스템에서 사용되는 가장 큰 확장 문자 세트를 나타낼수 있을만큼 충분한 비트 폭을 가진 정수형이다.
 wchar_t형은 기초데이터형 이라고 부르는 정수형과 동일한 크기와 부호 속성을 가진다. 기초 데이터형은 시스템에 따라 다른데,
 어떤 시스템에서는 unsigned short형일수도있고, 다른시스템에서는 int형이 될수도있다.

 확장문자상수나 확장 문자 문자열은 그앞에 L을 붙여서 나타낸다. 다음과 같은 코드는 변수 bob에 문자 P의 wchar_t형버전을
 저장하고, 단어 tall의 wchar_t형 버전을 디스플레이한다.

wchar_t bob=L'P';          //확장 문자 상수
wcout <<L"tall"<<endl;   //확장 문자 문자열의 출력

2바이트 wchar_t 형을 사용하는 시스템에서, 이코드는 각문자에 2바이트씩 할당하여 메모리에 저장한다.

●bool형
-bool형 변수는 참이나 거짓 어느 한가지 값만 가질수 있다. On / Off 스위치라 생각하면 쉽다.
 C++는 0이 아닌값들을 참으로, 0인값을 거짓으로 해석한다.

bool usready = true;

int ans = true;               //ans 에 1이되입된다.
int promise = false;      //promise에 0이 대입된다.

어떠한 수치 값이나 포인터 값도 하나의  bool값으로 묵시적으로 변환될수 있다.
bool start =-100;       //start에 true가 대입
bool stop = 0;          //stop에 false가 대입

■const 제한자
- #define문보다 쉽게 기호 상수를 다루는 방법은 const키워드를 사용하여 변수를 선언하고 초기화 하는 것이다.
  1년의 달수를 기호 상수로 나타내고 싶다면
const int MONTH =12;   //MONTHS는 12를 나타내는 기호 상수

MONTH와 같은 상수는 한번 초기화 되면 그값이 '고정' 된다. 컴파일러는 이후 MONTH의 값을 변경하려는 어떠한 시도도  허용하지
않는다.
키워드 const는 선언의 의미를 제한하므로 제한자라고 부른다.
일반적으로 관행은,MONTHS가 상수라는 것을 금방알수있도록 이름을 모두 대문자로 쓰거나,또다른 관행은 상수이름의 첫문자만
대문자로 쓴다던지, kmonth처럼 앞에다가 k를 넣는것이다.

상수를 만드는 일반적인 형식은 다음과 같다.

const  데이터형 상수이름 = 값;
const 상수는 선언할 때 초기화해야 하며, 다음과 같이 하는것은 좋지않다
---
const int toes;      //toes값은 미확정
toes= 10;

const상수는 선언할때 값으로 초기화 하지 않으면 변경할수 없는 미확정값으로 남겨진다.
#define보다 const를 사용하는게 좋은이유는
첫번째, 데이터형을 명시적으로 지정할수 있다는점.
두번째, C++의 활동범위 규칙에 의해 그 정의를 특정함수나 파일에만 사용할수 있도록 제한할수있다는점.
세번재, 배열이나 구조체 와 같은 복잡한 데이터 형에도 const를 사용할수 있기때문.

■연산자 우선순위
===C++연산자 우선순위와 결합 규칙====
              연   산   자             결 합 규 칙                 의   미
              우선 순위 그룹1               
 ::    사용 범위 결정 연산자
             우선 순위 그룹 2                  
 (expression)    괄호묶기
 ()                     L-R  함수호출
 ()    값생성, 즉 type(expr)
 []    배열 첨자
 ->    간접 맴버 연산자
 .    직접 맴버 연산자
 const cast    특수화된 데이터형 변환
 dymic cast    특수화된 데이터형 변환
 reinterpret cast    특수화된 데이터형 변환
 static cast    특수화된 데이터형 변환
 typeid    데이터형 인식
 ++    증가 연산자, 접미어
 --    감소 연산자, 접미어
              우선순위 3그룹(단항)            
 !                   R-L  논리부정
 ~    비트 부정
 +    단항 플러스(양수부호)
 -    단항 마이너스(음수부호)
 ++    증가 연산자, 접두어
 --    감소 연산자, 접두어
 &    주소
 *    내용 참조(간접 값)
 ()    데이터형 변환(type) expr
 sizeof    바이트 단위의크기
 new    동적으로 메모리할당
 new[]    동적으로 배열 할당
 delete    동적으로 할당된 메모리해제
 delete[]    동적으로 할당된 배열 해제
                 우선순위 4그룹  
 .*                    L-R  맴버내용 참조
 ->*    간접 맴버내용 참조
              우선순위 5그룹(2항)  
 *                   L-R  곱셉
 /    나눗셈
 %    나머지
              우선순위 6그룹(2항)  
 +                    L-R  덧셈
 -    뺄셈
                 우선순위 7그룹  
 <<                     L-R  비트들을 왼쪽으로 시프트
 >>    비트들을 오른쪽으로 시프트
                우선순위 8그룹  
 <                 보다 작다
 <=    보다 작거나 같다
 >=    보다 크거나 같다
 >    보다 크다
                 우선순위9그룹  
 ==                    L-R  같다
 !=    같지않다
     
                우선순위10그룹(이항)  
 &                     L-R  비트 AND
                우선순위 11그룹  
 ^                     L-R  비트 XOR
               우선순위  12그룹  
 |                     L-R  비트 OR
                우선순위 13그룹  
 &&                     L-R  논리AND
                우선순위 14그룹  
 ||                   L-R  논리OR
                우선순위 15그룹  
?:                    R-L  조건식
                우선순위 16그룹  
 =                   R-L  단순대입
 *=    곱셈후대입
                우선순위 17그룹  
 /=                 나눗셈후 대입
 %=    나머지셈 후 대입
 +=    덧셈후 대입
 -=    뺄셈후 대입
 &=    비트 AND후 대입
 ^=    비트 XOR후 대입
 |=    비트 OR후 대입
 <<=    왼쪽으로 시프트후 대입
 >>=    오른쪽으로 시프트후 대입
                 우선순위 18그룹  
 throw                     L-R  예외발생
                 우선순위 19그룹  
 ,                      L-R  두 수식을 하나로 결합


■데이터형 변환
C++는 데이터형의 불일치를 해결하기 위해 다음과 같은 상황일때자동으로 데이터 형 변환을 수행한다.
 ●특정 데이터형의 변수에 다른 데이터형의 값을 대입했을때
 ●수식에 데이터형을 혼합하여 사용했을때
 ●함수에 전달인자를 전달했을때.

◎대입명령문에서 데이터형변환
  -범위가 작은 데이터형의 값을 범위가 큰 데이터형에 대입하는것은 문제가 되지않는다. 하지만 short형 값을 long형 변수에
   대입하면 값은 변하지 않고 의미없는 여분의 바이트만 추가된다. 그러나 21112222333과 같은 큰 long형 값을 float형변수에
   대입하면 정밀도가 손실된다.
   데이터형변환에서 일어날수있는 잠재적문제는 다음과 같다.

                             데이터  형변환                                   잠재적   문제점      
 double→float와 같이 큰부동 소수점형을
 작은 부동 소수점형으로
 정밀도(유효숫자)가 손실된다. 원래의 값이 변환 데이터의 범위
를 벗어날경우, 결과를 예측할수없다.
 부동 소수점형을 정수형으로  소수부를 잃어버린다. 원래값이 변환 데이터형의 범위를 벗어날
경우, 결과를 예측할수없다.
 long→ short와 같이 큰정수형을
 작은 정수형으로
 원래 값이 변환 데이터형의 범위를 벗어날경우,
대개 하위 바이트들만 복사된다


■ 수식에서의 데이터형 변환
- 일반적으로 컴파일러는 산술식에 어떤ㅌ 데이터형 변환이 이루어져야하는지를 검사한다.
  이를 위해 컴파일러가 검사하는 목록은 순서대로 다음과 같다.
ⓐ한쪽 피연산자가 long double형이면, 상대편 피연산자를 long double형으로 변환한다.
ⓑ그렇지않고 한쪽 피연산자가 double형이면, 상대편 피연산자를 double형으로 변환한다.
ⓒ그렇지않고 한쪽 피연산자가 float형이면, 상대편 피연산자를 float형으로 변환한다.
ⓓ그렇지않다면 피연산자들이 정수형이므로 정수승급이일어난다.
ⓔ이경우에, 한쪽 피연산자가 unsigned long형이면, 상대편 피연산자를 unsigned long형으로 변환한다.
ⓕ그렇지않고 한쪽 피연산자가 long int 형이고 상대편 피연산자가 unsigned int형이면, 두데이터형의 상대적인 크기에 따라 변환이
   결정된다. long형이 unsigned int값을 나타낼수 있으면, unsigned int형이 long형으로 변환된다.
ⓖ그렇지않으면 두 피연산자가 모두 unsigned long 형으로 변환된다
ⓗ그렇지않고 한쪽 피연산자가 long형이면, 상대편 피연산자를 long형으로 변환한다.
ⓘ그렇지않고 한쪽 피연산자가 unsigned int형이면, 상대편 피연산자를 unsigned int 형으로 변환한다.
ⓙ컴파일러가 이 지점까지 도달한다면, 두 피연산자는 int형이다.

■데이터형 변환자
C++에서는 데이터형 변환자를 사용하여 강제로 데이터형을 변환시킬수있다.
데이터형 변환자는 두가지 형태로 사용된다.
(long) thorn      //thorn의 long형 변환을 리턴한다.
long (thorn)      //thorn의 long형 변환을 리턴한다.

데이터형 변환자는 thron변수 자체는 변경하지않는다.
그대신에 지시된 데이터 형의 새로운 값을 만든다.

(typeName) value       // value를 typeName형으로 강제 형변환한다.
typeName (value)       // value를 typeName형으로 강제 변환한다.
첫번째 형태는 C에서 사용하던 방법이다.
두번째형태는 C++에서만 사용하는 형태이다.
이것은 내장 데이터형에 대한 데이터형 변환을 마치 사용자 정의 클래스를 위해 설계할 수 있는 데이터 형
변환처럼 보이게한다.
satic_cast<>연산자는 어떤 수치 데이터형을 다른 수치 데이터형으로 변환하는데 사용할수 있다.
예를 들어, 다음과 같이 thorn을 long형 값으로 변환하는 데 사용할수 있다.
static_cast<long> (thorn)     //thorn의 long형 변환을 리턴한다.

일반적으로 다음과 같이 할수 있다.
static_cast<typeName>(value) // value를 typeName형으로 변환한다.


 


======================================요약=============================================
C++의 기본 데이터형은 두그룹으로 나뉜다. 한 그룹은 정수형으로 저장되는값들로 이루어진다. 다른 한 그룹은 부동 소수점형으로
저장되는 값들로 이루어진다. 값을 저장하는데 사용되는 메모리 크기와 그것이 signed냐 unsigned냐에 따라 정수형은 다시 여러가지
형으로 세분된다. C++의 정수형을 크기가 작은것부터 순서대로 나열하면 bool,char,signed char,unsigned char, short , unsigned shore, int , unsigned int, long, unsigned long형의 순이다.
wchar_t라는 정수형이 하나더있다. 앞의 크기 순서에서 wchar_t가 들어갈 위치는 시스템에따라 다르다. char형은 그시스템의
기본문자세트에 속하는 어떠한 문자도 저장할수있을만큼 커야한다. wchar_t형은 시스템의 확장문자 세트에 속하는 어떠한 문자도
저장할수 있을만큼 커야한다. short형은 최소 16비트이다. int형은 최소한 short형만큼 커야한다. long형은 최소 32비트이고, 최소한 int형만큼 커야한다. 각 데이터형의 정확한 크기는 C++시스템에 따라 다르다.
문자들은 그에 해당하는 수치 코드로 나타낸다. 그수치코드를 문자로 해석할것인지 수로 해석할 것인지는 입출력(I/O) 시스템이
결정한다.
부동 소수점형은 소수부가 있는 값을 나타낼수 있다. 또한 정수보다 훨씬 큰값을 나타낼수있다. 부동소수점형은 float, double, long double형 세가지가 있다. long double형은 최소한 double형 만큼은 커야한다. double형은 최소한 float형만큼은 커야한다.
일반적으로 float형은 32비트, double형은 64비트, long double형은 80에서 128비트의 메모리를 사용한다.

C++는 크기가 다른 다양한 데이터형과, 그들의 signed,unsigned 변형까지 제공하므로 특정 데이터에 적합한 데이터형을 골라서
사용할수 있다.

C++는 수치 데이터형에 대해 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈, 나머지셈) 을 수행하는 연산자를 제공한다. 두 연산자가 하나의 피연산자에 걸려있을때에는 우선 순위 규칙과 결합 방향 규칙을 적용하여 어느 연ㅅ간을 먼저 수행할 것인지를 결정한다.

변수에 값을 대입할때, 수식에 서로 다른 데이터형을 혼합하여 사용할때, 데이터 형 변환자를 사용하여 강제로 데이터형을 변환
시킬때, 이러한 경우에 C++에서는 한 데이터형을 다른 데이터형으로 변환한다. 데이터형 변환에서 데이터의 실제값은 대부분 그대로
유지된다. 예를 들어, int형 값을 long형으로 변환하는 것은 전혀 문제를 일으키지 않는다. 그러나 부동 소수점형을 정수형으로
변환할때에는 약간의 주의가 필요하다.

다양한 데이터형 변환 규칙을 고려 해 볼때, C++의 기본 데이터 형이 이렇게 많을 필요가 있을까 의문이 들수도있다.
그러나 기본데이터형들 중의 어느 하나가 상황에 꼭 맞는 경우를 언젠가는 만나기때문에 그럴 걱정은 필요없다.

'C++ > C++ PRIMER PLUS' 카테고리의 다른 글

함수 - C++의 프로그래밍 모듈  (0) 2011.11.09
분기 명령문과 논리 연산자.  (0) 2011.11.07
루프와 관계 표현식  (0) 2011.10.27
복합 데이터형  (0) 2011.10.27
C++시작하기  (0) 2011.10.18
포인터란?   주소 그자체
 ①포인터는 메모리의 번지 주소.
 ②포인터 변수  메모리의 주소를 가지는 변수.
 ③포인터 변수의 크기는 4Byte 의 부호없는 정수형

◎포인터연산자
 ① &(주소연산자)는 변수의 메모리 주소를 표현해주는 연산자.
 ② *(참조자)      는 주소를 이용하여 변수값을 접근하는 연산자.
#include <stdio.h>
void main()
{
   int number =100;
   int *p;
   p= &number; 
   printf("p =%d \n",p);
   printf("*p = %d \n",*p);
}


《p= &number》
→p는 포인터 변수로 number의 주소값을 가지고 있다.
   p라는 포인터 변수가 가지는 값을 주소로 보고, 그값(number의 주소)을 참조해서 해당주소의
   실제값을 출력.







printf에서 *p라는 참조연산자를 실행한값은 p라는 퐁인터변수가 가지는 값을 주소로 보고 그값(주소)을
참조하여 한번더 들어간다는 뜻.

즉,  number값은 100                         p값은  0000 이라는 number의 주소값
    &number값은  0000(주소)            &p값은  0004 라는 포인터 변수의 p값
                                                    *p값은  0000 이라는 p값의 데이터를 참조해서 찾아간 number의 값


 

#include <stdio.h>
void main()
{
   char *p = "string";
   while (*p)
   {
      printf("%c,%d \n",*p,p);
      p++;
    }
}


p[]로 사용하던것을 *p로 선언!
while문에서 *p의 마지막인 Null값을 만나면 종료.
포인트 변수에 +1



*scanf로 받을시

#include<stdio.h>                                       #include<stdio.h>
void main()                                                void main()
{                                  (수정code)            {
   char *p;                             →                      char *p,arr[10];
   scanf("%s",p);                                             scanf("%s",arr);
   printf("%s",p);                                               p=arr;
}                                                                   printf("%s",p);
                                                                 }

                                                               《p=arr;》→배열의 이름(첫번째주소값)을 p에대입.   

    

 

'C > 난정말C Programming을 공부한적이없다고요' 카테고리의 다른 글

다차원 배열(이차원배열)  (0) 2011.08.16
배열 and 포인터  (0) 2011.08.16
변수의 공간할당  (0) 2011.08.16
배열(문자)  (0) 2011.08.16
배열(숫자)  (0) 2011.08.16
int arr[4] = {10,16,17,19};
int A=32;
int B=31;
int C=63;



 ↑메모리 할당   그림으로 표시


   주소  값
arr[0]  0000  10
arr[1]  0004  16
arr[2]  0008  17
arr[3]   0012  19
 A  0100  32
 B  0124  31
 C  0088  63
↑표로표시


pritnf ("%d",A)      ← 0100 주소에 있는 값출력
printf("%d",arr[3]) ← 0012 주소에 있는 값출력

⊙배열 이름은 배열의 첫번째 주소를 가지고있다!

 char arr[] = "test";
 printf("%d",arr[3]);


*arr[0+2]  → 's'가있는 공간 0002에 접근

'C > 난정말C Programming을 공부한적이없다고요' 카테고리의 다른 글

다차원 배열(이차원배열)  (0) 2011.08.16
배열 and 포인터  (0) 2011.08.16
포인터  (0) 2011.08.16
배열(문자)  (0) 2011.08.16
배열(숫자)  (0) 2011.08.16
"TEST 문자열"

#include <stdio.h>
void main()
{
  char arr[4] = {'T','E','S','T'};
  int i=0;
  for ( i=0; i<4; i++)
  { 
    printf("%c",arr[i]);
   }
}


 변수 arr[0]   arr[1] arr[2]  arr[3] 
 값  'T' 'E'  'S'  'T' 

※char arr[4] ="TEST"; 로 초기화시 문자열의 마지막에 \0 즉, Null 의 값이 들어감.
<Null 값이 들어있지않을시에 Null값을 만날때까지 쓰레기값을 출력한다.>
그래서 char arr[4] ="TEST"; 
          char arr[5] ="TEST"; 로 바꿔야함

*배열의 크기를 잡지않고 arr[]을 쓰면 자동으로 크기가 할당됨.


'C > 난정말C Programming을 공부한적이없다고요' 카테고리의 다른 글

다차원 배열(이차원배열)  (0) 2011.08.16
배열 and 포인터  (0) 2011.08.16
포인터  (0) 2011.08.16
변수의 공간할당  (0) 2011.08.16
배열(숫자)  (0) 2011.08.16
DataType 배열이름[크기];

#include<stdio.h>
{ int arr[5] = {1.2,3,4,5}
   printf("arr = %d \n",arr[4]);
}

*선언시

 변수 arr[0]   arr[1]  arr[2]  arr[3] arr[4] 
 값  2  3  4  5

※특징
1. 배열은 [0] 부터 시작
2. 배열크기는 선언할때 메모리상 공간을 할당받기 때문에 프로그램도중에 크기를 변경할수 없다.
3. 배열의 이름은 배열의 첫번째 주소를 가지고 있다 (포인터상수)

#include <stdio.h>
void main()
{
   int  i = 0, sum = 0, english[10] = {};

   for(i=0; i<10; i++)
  {
     printf("%d번의 영어 점수를 입력하세요:",i+1");
     scanf("%d",&english[i]);
  }
printf("\n");

for(i=0; i<10; i++)
  sum += english[i];

printf("10명의 영어점수 총합은 %d",sum);
}

'C > 난정말C Programming을 공부한적이없다고요' 카테고리의 다른 글

다차원 배열(이차원배열)  (0) 2011.08.16
배열 and 포인터  (0) 2011.08.16
포인터  (0) 2011.08.16
변수의 공간할당  (0) 2011.08.16
배열(문자)  (0) 2011.08.16