[모던C++입문] 1.2 변수

    1. C++ 기초

    1.2 변수

    int main()
    {
        int i1 = 2;
        int i2, i3 = 5;         //i2 는 초기화 되지 않음
        float pi = 3.141592;
        double x = -1.5e6;      //-1500000
        double y = -1.5e-6;     //-0.0000015
        char c1 = 'a'; c2 = 35;
        bool cmp = i1 < pi,     //true
             happy = true;
        auto i4 = i3 + 7;       //i4는 int 타입
    
        return 0;
    }

    내장 타입 목록 (대표적인 것들)

    char, short, int, long, long long, 
    unsigned, signed,
    float, double, long double, bool

    상수

    • c++에서 상수는 불변이라는 속성을 가지는 변수, 변수타입앞에 const를 붙여 지정
    const int ci1 = 2;
    const int ci3;              //값을 할당하지 않아 빌드오류
    const float pi = 3.14159;
    const char cc = 'a';
    const bool cmp = ci1 < pi;

    리터럴

    • 일반적인 정수는 자릿수에 따라 int, long, unsigned long 타입으로 취급
    • 소수나 지수는 double 타입으로 취급
    • 다른 리터럴 타입은 다음의 접미사를 추가한다
      리터럴 타입
      2 int
      2u unsinged
      2l long
      2ul unsigned long
      2.0 double
      2.0f float
      2.0l long double
    • 표준 라이브러리에는 복소수를 위한 std::complex 항목을 제공
      std::complex<float> z(1.3, 2.4) z2;
      z2 = 2 * z;     //오류: int * complex<float> 없음
      z2 = 2.0 * z;   //오류: double * complex<float> 없음
      z2 = 2.0f * z;  //정상: float * complex<float> 있음    
    • 정확한 자리수를 입력하기 위해서는 리터럴을 입력해야한다
      //double타입으로 처리되어 자릿수가 정확하지 않음
      long double third1 = 0.3333333333333333333;
    
      //long double 타입으로 처리되어 자릿수 정확
      long double third2 = 0.3333333333333333333l;    
    • 10진수가 아닌수
      • 0으로 시작하는 정수는 8진수로 해석
      • 0x 나 0X라는 접두사를 붙이면 16진수로 해석
      • c++14 에서는 0b,0B 를 통해 2진수 리터럴을 도입
      • c++14 에서는 리터럴의 가독성을 위해 '(아포스트로피)로 숫자를 분리할수 있게 됨
      int o1 = 042;   //int o1 = 34;
      int o2 = 089;   //오류: 8진수에는 8,9 를 사용할 수 없다
      int h1 = 0x42;  //int h1 = 66;
      int h2 = 0xfa;  //int h2 = 250;
      int b1 = 0b11111010;    // int b1 = 250;
      long d = 6'546'687'616'861'129l;
      unsigned long ulx = 0x139'ae3b'2ab0'94f3;
      int b = 0b101'1001'0011'1010'1101'1010'0001;
      const long double pi = 3.141'592'653'589'793'238'462l;

    축소하지않는 초기화

    • c++11에서는 데이터가 손실되지 않음을 확인하는 초기화를 도입
    • 중괄호 초기화(braced initialization)의 값은 축소할수 없다
    • signed int 와 unsigned int 타입의 크기는 같지만 값은 다르게 표시한다
      //축소하지만 컴파일 됨 (경고:'초기화 중':'double'에서 'int'로 변환하면서 데이터가 손실될 수 있습니다.)
      int i1 = 3.14;   
    
      //축소 오류 (빌드오류 : 'double'에서 'int'(으)로의 변환에는 축소 변환이 필요합니다.)       
      int i1n = {3.14};
    
      //축소하지만 컴파일 됨 (경고:'초기화 중': 'int'에서 'unsigned int'(으)로의 변환입니다. signed 또는 unsigned가 일치하지 않습니다.)
      unsigned u2 = -3;
    
      //축소 오류 (빌드오류 : 'int'에서 'unsigned int'(으)로의 변환에는 축소 변환이 필요합니다.)
      unsigned u2n = {-3};
    
      //괜찮을까? (경고 : '초기화 중': 'double'에서 'float'(으)로 잘립니다.)
      float f1 = {3.14};

    범위

    • 전역 정의
      • 전역 변수는 모든 함수의 바깥에 선언
      • 전역 변수는 코드 어디에서나 참조 할수 있음
      • 규모가 커지면 전역 변수들의 수정사항을 추적하기 어려워짐
      • 전역상수가 아니면 가급적 전역 변수를 사용하지 않도록 하자
    • 지역 정의
      • 지역 변수는 함수 안에서 선언
      • 지역 변수의 가시성/가용성은 { } 중괄호로 둘러싸인 블록으로 제한
      void main()
      {
          {
              const double pi = 3.141592;
          }
    
          //빌드오류 ('pi': 선언되지 않은 식별자입니다.)
          std::cout << "pi is " << pi << ".\n";
      }

    숨기기

    • 안쪽 범위에 잇는 변수는 바깥쪽 범위에 잇는 이름이 같은 변수를 숨긴다
      void main()
      {
          int a = 5;  //a#1을 정의
          {
              a = 3;  //a#1을 할당
              int a;  //a#2를 정의, a#1은 숨겨짐 (경고: 'a' 선언은 이전 로컬 선언을 숨깁니다.)
              a = 8;  //a#2를 할당
              {
                  a = 7; //a#2를 할당
              }
          }           //a#2의 범위 종료
          a = 11;     //a#1에 할당 (a#2는 범위 밖)
      }
    반응형

    댓글

    Designed by JB FACTORY