본문 바로가기
C & C++/C++

[C++] 데이터, 입출력, 연산자

by 거북이 코딩 2024. 6. 25.

 종강을 했습니다. 사실 종강한 지는 조금 되었는데 나태해서 이제야 글을 다시 쓰게 되었네요. 매주 글을 쓰기로 마음을 먹었었는데 참 쉽지 않은 것 같습니다. 그래도 이번 학기는 전공 공부에 집중한 덕분에 우수한 성적으로 학기를 마무리할 수 있었는데요. 의외의 수확인 것 같습니다.

 학기도 끝났고 이제는 개발에 관한 공부를 하고 싶어서 C++을 다시하게 되었습니다. 이번에는 학교에서 주최하는 NGT 러닝패스 프로그램에 참여하게 되어 패스트 캠퍼스의 무료강의를 수강할 수 있게 되었는데요. 아직 조금밖에 들어보지 않았지만 강의를 진행하시는 강사분이 중요하지만 언뜻 중요하지 않아 보여서 지나칠 수 있는 부분도 집어주고, 요즘의 트렌드를 반영하여 설명하고, 활용에 대한 예제도 많이 보여주셔서 꽤나 좋았습니다. 그래서 강의를 보며 공부한 내용을 블로그에 적어놓겠습니다. 지켜봐 주세요 ㅎㅎ 감사합니다.

Ch 01. C++ 오리엔테이션

소개

데니스 리치와 켄 톰슨이 유닉스를 만들기 위해 C를 만들었다.

비야네 스트롭스트룹이 C++을 만들었다.

C++은 여러 버전이 있다. 현재 최신은 C++20.

개발 환경

IDE는 통합 개발환경을 의미한다. 컴파일, 빌드, 디버깅, … 을 제공한다.

Visual Studio : 가장 점유율이 높은 IDE이다. 이번 강의에서 사용한다.

프로젝트 둘러보기

소스코드와 주석으로 구분된다.

소스코드는 프로그램을 구성한다.

주석은 사람을 위해 쓰여진 정보이다.

//주석은 이렇게 작성한다.
/* 여러줄의
주석을
작성한다 */

Ctrl + F5 : 프로그램 실행

F5 : 디버그 시작

F9 : 디버그 중단점 설정

F11 : 한 단계 실행

main 함수는 프로그램이 시작되었을 때 제일 먼저 실행되는 함수이다.

빌드 : 솔루션을 빌드한다. 다시 빌드, 솔루션 정리, 등도 할 수 있다.

Hello World

#은 전처리기에 지시하는것을 의미한다.

#include <iostream>
//인풋 아웃풋 스트림을 인클루드 시킨다.

함수의 구조는 반환형 함수이름 인자 함수몸체로 구성된다.

#include <iostream>
int main (){ //반환값과 함수이름
//함수몸체
std::cout<<"Hello World";
return 0; //리턴값
}

Ch 02. 데이터

정수형

변수 : 데이터를 담는 그릇

int : 정수형 변수를 의미한다.

int x, y, z; //정수형 변수 x, y, z

변수의 초기화

int x = 1; //C style 초기화
int y(2); //C++ style 초기화

정수형 변수에 실수를 넣게 되면 소수 부분은 잘려서 없어지게 된다.

int x = 1.5;
std::cout<<x; //1이 출력된다.

리터럴 정수 표현

11 //10진법
011 //8진법
0b11 //2진법
0x11 //16진법

다양한 인트 표현

short 2 바이트 -32768 32767

unsigned short 2 바이트 0 65535
int 4 바이트 -21억 21억
unsigned int 4 바이트 0 42억
long 4 바이트 -21억 21억
unsigned long 4 바이트 0 42억
long long 8 바이트 -900경 900경
unsigned long long 8바이트 0 1800경

sizeof 연산자

sizeof(int)
sizeof(변수)
sizeof 변수
//인자의 크기를 출력한다.

리터럴의 타입 지정 방법

11u //unsigned int
11L //long
11LL //long long
11LLu //unsigned long long

이진법

1101 : 2^3 + 2^2 + 2^0 = 8 + 4 + 1 = 13

각 자릿수만큼 2의 제곱을 해준값을 더해준다.

음수인 정수의 표현방법 : 2의 보수 표현법

모든 비트를 반전시킨 후 1을 더해준다.

0010 0100 1011
1101 1011 0100 //비트반전
1101 1011 0101 //+1

최대 최솟값 보기

#include <numeric>

using namespace std; //std의 네임스페이스 사용

int main(){
	 cout << numeric_limits<int>::max() << endl; //최대
	 cout << numeric_limits<int>::max() << endl; //최소
}

부동 소수점

float : 부동 소수점 형 변수를 의미한다.

float a = 1.5;

float 4 바이트 부호(1) + 지수부(8) + 가수부(23)

double 8 바이트  
long double 8 ~ 16 바이트  

부동 소수점형의 형변환을 막는법

1.0f //float
1.0 //double
1.0L //long double

memcpy : 메모리 카피

memcpy(새 주소, 기존 주소, 데이터의 크기);
//기존 주소의 데이터를 새 주소로 옮긴다.

부동 소수점형은 오차가 있기 때문에 조건문에 사용하지 않는다.

문자형

char : 문자형의 변수를 의미한다.

char ch = 'a';

char 1 바이트

아스키 표의 값을 따른다 (7비트)

타입 간의 형변환

(int)ch //C style 형변환
int(ch) //C++ style 형변환

이스케이프 시퀀스

\\n : 개행
\\t : 탭
\\b : 백스페이스
\\a : 경고음
\\' : '
\\" : "
\\\\ : \\
/x16진수 : 숫자에 맞는 아스키 문자 출력
/8진수 : 숫자에 맞는 아스키 문자 출력

불리언형

bool : true or false를 표현하는 타입이다.

bool bo = true;

bool 1 바이트

다양한 연산자

0 == 0 // 같다
1 > 0 //크다
0 < 1 //작다
1 >= 0 //크거나 같다
0 <= 1 //작거나 크

cout.setf(ios_base::boolalpha); : cout의 출력값을 true, false로 보여준다.

Ch 03. 입출력

printf

print formatted

#include <cstdio> 
//헤더파일
printf("Hello World!");
printf("%d",10);

형식 지정자를 사용할 수 있다.

%d : 10진수

%i : 10진수

%u : unsigned int

%hhu : unsigned char

%f : float, double

%lf : float, double

%x : 16진수 (소문자)

%X : 16진수 (대문자)

%o : 8진수 (소문자)

%010d : 10 자릿수를 지정하고 앞쪽을 0으로 채움

%.1f : 소수점 아래 한 자릿수만 표현

%-10d : 10 자릿수를 지정하고 왼쪽 정렬

%% : % 출력

freopen("output.txt", "w", stdout);
//표준 출력 스트림을 파일로 연결

scanf

scanf("%d",&num); //정수를 받아서 num에 저장

성공적으로 입력받은 횟수를 반환한다.

if(scanf("%d", &num)){ //성공적으로 받으면 if문 실행
//
}

형식을 맞춰서 입력을 받기

scanf("%d + %d = %d", &n1, &n2, &n3);

%i는 접두사를 붙여서 진법을 정해줄 수 있다.

0x10이라고 입력하면 16이 나온다.

scanf("%i" , &num);
printf("%i" , num);

%f : float

%lf : double

버퍼에 문자가 남아있어서 입력이 안될 때

while(getchar() != '\\n'); //개행이 나올 때 까지 버퍼 비우기

텍스트 파일로 입력받기

freopen("input.txt", "r", stdin);
//표준 입력 스트림을 파일로 연결한다.

cout

using namespace std;

cout << 1 << "1" << '\\n' << endl;

다양한 타입을 한 번에 출력할 수 있다.

cout.put('a'); // 한글자 출력
cout.write("hello", 5); //5글자 출력
cout.width(10); //폭을 10으로 설정
cout.fill('#'); //공백을 #으로 채운다.
cout.precision(n) : cout의 정밀도를 n으로 설정한다.
cout.setf(ios_base::showpos); : 부호를 표시한다.
cout.unsetf(ios_base::showpos); : 부호를 표시하지 않는다.
cout.setf(ios_base::boolalpha); : 부울을 문자로 표시한다.
cout.setf(ios_base::left, ios_base::adjustfield); : 좌측으로 정렬한다.
cout.setf(ios_base::hex, ios_base::basefield); : 16진수로 출력한다.
hex(cout); : 16진수로 설정
cout << hex << 16; : 16진수로 출력
cout<<setw(10)<<setfill('#')<<setprecision(3)<<1.1f; 
: 1.1을 너비 10 정밀도 3 빈곳은 #으로 채워서 출력한다.

cin

int num;
cin >> num; //입력에 실패하면 0 입력
cout << num;
if(cin>>num) // scanf 처럼 쓸 수 있다.

입력에 문제가 생겼을 때

if(cin.fail()) // 입력에 실패하면 버퍼를 비워준다.
	cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\\n'); //개행이 나올 떄 까지 무시

문자로 부울 받기

cin.setf(ios_base::boolalpha);
cin.setf(ios_base::hex, ios_base::basefield); : 16진수로 입력받기

Ch 04. 연산자

산술 연산자

a=b=c=10; //할당 연산자 : 오른쪽값을 왼쪽에 대입하고 그 값을 반환
+1  -1 //단항 연산자
++num num++ //전위 후위 연산자

num+=10 //복합 연산자

비교&관계 연산자

0 == 0 // 같다
1 > 0 //크다
0 < 1 //작다
1 >= 0 //크거나 같다
0 <= 1 //작거나 크다

우주선 연산자

num1 <=> num2  //같으면 0 크면 양수 작으면 음수 반환
(1<=>1) == 0 //왼쪽의 형식으로 사용함
is_eq(1<=>1) //같으면 true
is_neq(1<=>1) //같지않으면
is_lt(1<=>1) //작으면
is_lteq(1<=>1) //작거나 같으면
is_gt(1<=>1) //크면
is_gteq(1<=>1) //크거나 같으면

strong odering : 타입까지 동일함

partial odering : 값은 동등하다

논리 연산자

&& //and
|| //or
! //not

연산자 우선순위 : ! > && > ||

short circuit evaluation

false && 조건문 // 조건문 검사를 하지 않음 어차피 false 이기 때문
true || 조건문 // 어차피 true이므로 검사를 하지 않음

비트 연산자

& //and
| //or
~ //not
^ //xor
>> //right shift 2분의 1배가 됨
<< //left shift 2배가 됨

제곱 연산자

pow(2, 0) //2의 0 제곱

홀수개가 있는 수를 찾기 (a= 1, b=2, c=3, d=2, e=1)

cout<<(a^b^c^d^e)<<endl; 
//3 출력
//모든 수를 xor 연산한다.

기타 연산자

삼항 연산자

조건문 ? true일때 : false일때 // 조건문이 참이면 true일때, 거짓이면 false일때

범위 지정 연산자

std::cout //std의 cout
::변수 // 전역변수에 접근

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

[C++] 연산자 오버로딩  (4) 2024.07.16
[C++] 클래스  (0) 2024.07.13
[C++] 함수, 범위, 공간  (0) 2024.07.08
[C++] 포인터, 참조  (1) 2024.07.01
[C++] 흐름 제어, 복합 데이터  (0) 2024.06.26