C

C++ 을 위한 간략한 C 강좌 1 - 리터럴 및 기본 자료형

kim선달 2020. 7. 25. 15:46
Select Language

 

 

C++ 은 언어가 지향하는 점이 C 와 완전히 다른 언어입니다,

C++ 코드를 C 스타일로 작성하게 되면 가독성도 떨어질 뿐 더러, 여러가지 버그를 맞이할 확률이 높습니다(애초에 C가 아무생각 없이 짜다가는 버그가 나기 십상..)

 

하지만 일단 C++ 도 가장 기초적인 문법(변수, 함수, 조건, 반복 등등..) 들은 C의 문법과 거의 동일하고, 매크로나 goto 같은 경우는 반드시 필요한 경우가 있습니다.

또, C++14 이하에서는 입출력 및 파일시스템 등에서 C 함수를 써야 하는 경우가 종종 있지요(C++ 17 이후로는 거의 대부분 표준 함수를 이용해서 사용 가능합니다)

그래서 C++을 사용하더라도 기본적인 C 지식은 가지고 있어야 합니다.

 

이번 강좌에서는 필수적인 C 문법들과, 이들이 C++에서 어떻게 쓰이는지를 알아보려고 합니다.

다차원 배열 포인터나 변태같은 인덱싱 같은건 자세히 다루지 않습니다 (C++ 에서는 이들 타입을 명시적으로 쓸 일이 없으니)

C를 한번 써보신 분들이, C++ 로 넘어가시기 전에 알아두시면 좋을 내용들을 적었습니다

 

 

목차

  1. 리터럴
  2. 정수 및 실수 자료형
  3. 요약

 

1. 리터럴

3+7을 계산하려면 3이라는 값과 7이라는 값을 어딘가에 저장해야 합니다.

예를 들면 파일에 적어놓았다가, 코드에서 그 파일안에 숫자를 읽을 수 도 있고, 코드 안에서 바로 적어서 사용할 수 도 있습니다.

이때 코드 안에서 바로 적어서 사용하는 값들을 리터럴이라고 부릅니다.

int x = 100;
char str[] = "hello";

if (x < 200)
	printf("%s", str);

위 예시에서 100, "hello", 200, "%s" 가 리터럴에 해당됩니다. 대충 감을 잡으셨나요?

 

아래는 정수 리터럴 타입을 표현하는 방법입니다

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
int b = 0b101010; // C++14

5개의 변수 모두 10진법으로 42를 나타내고 있습니다. 앞에 0만 붙으면 8진법이고, 0x가 붙으면 16진법입니다. 

C++14 에서는 비트로 바로 표현하는 방식이 생겼습니다.

16진법은 비트에서 값을 골라내거나, 색을 표시할때 쓰는 경우가 있습니다.

 

unsigned long x = 100000000000ul;

또, 뒤에 unsigned 를 의미하는 u와 long 을 의미하는 l 을 붙일 수 있습니다. long long 이면 l을 두개 붙일 수 있습니다.

대소문자와 순서는 상관없습니다.

 

float f1 = 3/4;   // 0
float f2 = 3./4;  // 0.75
float f3 = 3.14f;

double d1 = 1.;  // 1.0
double d2 = .1;  // 0.1

long double d3 = 3.14L;

double n1 = 3.14E3;  // 3.14 x 10^3 = 3140
double n2 = 3.14e-2; // 3.14 x 10^(-2) = 0.0314

형식이 지정되지 않은 실수형은 모두 double 형입니다. float 이나 long double 은 각각 f 와 L 을 이용하여 명시할 수 있습니다. 마찬가지로 대소문자는 상관없습니다.

또한, 소수점 하나만 찍어 0표기를 무시할 수 있고, E를 이용해 큰수를 지수로 나타낼 수 있습니다.

실수형과 정수형의 연산 결과는 무조건 실수형입니다.


 

 

2. 자료형

C나 C++ 이나 모두 기본 타입들에서 시작을 해서, 이들을 묶는 구조체(C++ 은 class 가 추가됨)를 이용해서 모든 자료들을 다루게 됩니다.

C 에서의 기본 정수 및 실수 자료형은 다음과 같습니다

// 정수형
char c = 'a';
short s = 6000;
int x = 100;
long num = 200;
long long num2 = 300;


// 실수형
float f = 3.14;
double d = 100.;
long double d2 = 200.; // 크기(범위 x)가 double 의 두배


bool tf = true; // C++ 에서는 bool 타입과, true, false 가 생김

 

정수형들은 타입 앞, 또는 뒤에 unsigned 를 붙여 양수만 표기하는 대신, 양수 범위를 2배로 늘릴 수 있습니다.

unsigned 가 붙는 위치는 타입 앞이든 뒤든 상관 없습니다만, 보통 뒤에 붙이는게 관례입니다.

크기(비트 수)는 운영체제마다 달라서, 운영체제를 확인하시고 범위를 알맞게 쓰셔야 합니다.

자료형의 크기는 sizeof(int) 이런 식으로 확인할 수 있습니다.

이에 대한 자세한 설명은 https://en.cppreference.com/w/cpp/language/types 에 있습니다.

 

실수를 정수에 대입하면 무조건 내림해서 값이 대입됩니다.

만약, 반올림을 하고 싶다면 0.5를 더해주면 됩니다.

float f1 = 3.01;
float f2 = 3.99;

int x1 = f1; // x1 = 3
int x2 = f2; // x2 = 3

int x3 = f1 + .5 // x3 = 3
int x4 = f2 + .5 // x4 = 4

아쉽게도 C++ 에서도 반올림을 해주는 표준 함수는 없습니다.

 

 

타입 앞, 또는 뒤에 const 키워드를 붙여 불변하는 값으로 설정 해 줄 수 있습니다.

정확히는 직접적인 대입이 이루어질때, 컴파일러가 에러를 뱉게 만드는 것입니다.

C++11 에서는 더 진화한 키워드인 constexpr 이 새로 등장하였습니다.

const float pi = 3.1415;

pi = 3; // 컴파일 에러

 

const 키워드 외에 volatile 키워드도 있습니다.

volatile 키워드는 이 변수가 외부의 직접적인 메모리 참조로 값이 바뀔 수가 있으니, 최적화를 하지 마라 라고 컴파일러에게 말해주는 것입니다.

 

Apple clang version 11.0.3 (clang-1103.0.32.59) 에서 테스트 한 결과입니다.

const float pi = 3.1415f;

float* ptr = (void *)&pi;
*ptr = 3.f;

printf("%f", pi);

const 변수의 주소를 비-const 포인터에 대입해 값을 강제로 바꿔버리는 코드입니다(포인터는 다음 강좌를 참고해주세요).

변수를 const 로 설정하게 되면, 컴파일러는 이 값이 절대 불변이라고 생각하기 때문에 최적화를 통해 중간 단계를 무시해 버려 결국 

/Users/yonggyulee/CLionProjects/untitled4/cmake-build-release/untitled4
3.141500
Process finished with exit code 0

이렇게 나오게 됩니다.

 

이때 volatile 키워드를 사용하게 되면, 최적화를 하지 않고 모든 코드를 실행하기 때문에

volatile const float pi = 3.1415f;
// 이하 동일

// 결과
/Users/yonggyulee/CLionProjects/untitled4/cmake-build-release/untitled4
3.000000
Process finished with exit code 0

바뀐 값이 정상적으로 나오게 됩니다.

 

최적화는 컴파일러 마다 다른 결과가 나올 수 있습니다. volatile 키워드를 사용하는 경우는 거의 없으니 신경쓰지 않으셔도 됩니다.


3. 요약

 

정수 리터럴의 앞에 0, 0x, b를 붙여 8진법, 16진법, 비트를 표현할 수 있다.

정수 리터럴의 뒤에 u, l을 붙여 unsigned 와 long 을 표현할 수 있다.

실수 리터럴은 기본적으로 double 형식이다

실수 리터럴에 .만 찍어서 0을 생략할 수 있다.

실수 리터럴의 뒤에 f, l을 붙여 float 과 long double 을 표현할 수 있다

실수 리터럴을 <A>e<B>로 표현해서 A x 10^B로 표현할 수 있다.

 

const 키워드로 상수 변수를 선언할 수 있다.

volatile 키워드로 최적화를 막을 수 있다.

'C' 카테고리의 다른 글

C++ 을 위한 간략한 C 강좌 2 - 배열 및 포인터  (0) 2020.07.25