프로그래밍 언어/C++
[C++] cout 소수점 n자리까지 표시하기
일반적으로 아무 설정 없이 소수점을 표시하면 #include using namespace std; int main(){ ios::sync_with_stdio(0); cin.tie(0); double x = 3.333333333; cout
[C/C++] 비트연산자 (&, |, ^, ~, <<, >>, and, or, xor, 비트 반전, 비트 이동)
1. & 연산자 & 연산은 두 개의 비트가 모두 1일 때 1을 반환하는 AND 연산을 한다. 따라서 & 연산자의 비트단위 연산의 결과는 다음과 같다. 위 연산의 결과 4의 비트는 다음과 같다. 00000000 00000000 00000000 00000100 즉 다음과 같은 연산과정을 거친다. 00000000 00000000 00000000 00001111 & 00000000 00000000 00000000 00010100 = 00000000 00000000 00000000 00000100 2. | 연산자 | 연산은 두 개의 비트 중 하나라도 1이면 1을 반환하는 OR 연산이다. 따라서 | 연산자의 비트단위 연산의 결과는 다음과 같다. 위 연산의 결과 31은 다음과 같은 연산과정을 거친다. 00000..
[C++] 함수를 객체로 사용하기 (std::function, std::mem_fn, std::bind)
Callable Callable 이란, 이름 그대로 호출(Call)할 수 있는 모든 것을 의미한다. 대표적인 예시로 함수가 있다. 하지만 C++에서는 ( ) 를 붙여 호출할 수 있는 모든 것은 Callable 이라고 정의한다. same_obj 는 클래스의 객체이지만, 함수처럼 ( ) 를 호출할 수 있다. 마찬가지로, a 는 람다 함수이지만, ( ) 를 통해 호출할 수 있기에 Callable 이라고 할 수 있다. #include struct S { void operator()(int a, int b) { std::cout
[C] 함수 포인터 사용법 & 예제 총 정리
함수의 주소 변수를 선언하면 메모리 공간이 할당되고 그 공간의 위치가 주소로 존재하듯이 함수를 선언해도 변수와 마찬가지로 메모리에 공간이 할당되며 그 위치를 표현하는 주소가 생겨난다. C언어 코드는 컴파일이 되면 기계어로 변경되고 프로그램이 실행되면 코드 세그먼트라는 메모리 영역에 위치하게 된다. 즉, 함수의 형태는 변경되겠지만 결국 메모리에 저장되기 때문에 주소를 가지게 된다는 의미다. #include void print_hello() { printf("Hello, world!\n"); } int main() { // 메모리 상에 저장된 함수의 주소값 printf("함수의 주소값 : %p\n", print_hello); // & 생략 가능 return 0; } 포인터 변수란? 위에서 설명했듯 포인터는 ..
[C++] 매크로 개념과 주의사항
매크로 -> 단순 치환 -> #define으로 정의한다. # : 전처리 지시자 -> 컴파일 이전에 수행 define : 정의하다. -> 컴파일 이전에 정의하라고 명령. #1 매크로 상수 #define 매크로이름 치환할 값 매크로 상수 사용 시 주의사항 -> 단순 치환이기 때문에 세미콜론을 작성할 경우 세미콜론까지 치환해버린다. 예) #define PI 3.14f; // 입력 cout 속도가 빠르다. -> 함수 호출을 위한 연산들이 필요 없어진다. 매크로 함수의 주의점 #1 연산을 수행할 때 연산자 우선순위를 명확하게 표시해야한다. 예) #define SQUARE(n) n * n cout
[실4] 28279 - 덱2
#include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n; cin >> n; deque dq; while(n--) { int o, t; cin >> o; if (o == 1) { cin >> t; dq.push_front(t); } else if (o == 2) { cin >> t; dq.push_back(t); } else if (o == 3) { if (dq.empty()) cout
[C++] emplace_back 과 push_back 의 차이
item 타입의 생성자가 타입을 인자로 받는다면? push_back 함수는 '객체' 를 집어 넣는 형식으로, 객체가 없이 삽입을 하려면 "임시객체 (rvalue) " 가 있어야 하거나 암시적 형변환이 가능하다면, 인자로도 삽입할 수 있다. ( 이는 인자를 통해 임시객체를 암시적으로 생성한 후 삽입한다 ) vector vt; item a = {}; // 기본 생성자 호출 vt.push_back(item("abc", 1, 234)); vt.push_back(std::move(a)); vector v; v.push_back(1); // 등등.. 1. push_back을 통해 객체를 삽입하기 위해, item 임시 객체를 하나 만든다. 2. 임시 객체를 복사 생성자를 통해 push_back 함수 내에서 임시 객체..
[C] 배열과 포인터의 관계 (변수형 포인터, 상수형 포인터), 포인터로 배열 변경하기
포인터는 크게 상수형 포인터와 변수형 포인터로 나뉠 수 있다. 결론부터 말하자면, 배열을 선언하는 변수는 "상수형 포인터" 그 외는 "변수형 포인터"이다. 배열 선언시 char arr[ ]; 이런식으로 선언하는데 실제 arr 은 상수형 포인터다. 즉 주소값을 알고있는 Lable이다. 그래서 char * arr; 이랑 똑같은 구조라 할 수 있지만, * 로 선언하면 "변수"로 선언했기 때문에 포인터 변수의 주소값을 바꿀 수 있고, char arr [ ] 으로 선언하면 상수이므로 그 주소를 바꿀 수 없다. 그리고 이 arr은 내 첫번째 배열값의 주소를 가리키고 있다. (이때 arr의 자료형이 무엇이냐? 하면 포인터이므로 char * 자료형이다 라고 한다.) - int arr[ ]; 으로 선언하면 int형크기(..
[C] 포인터로 문자열 선언, 배열 문자열 선언과 차이. (문자열 내부 변경하기)
문자열(string)이란, 알파벳 하나하나가 메모리상의 연속적으로 나열되며, 마지막에는 '\0' (NULL)으로 끝나는 배열이다. 위 그림과 같이 문자열을 만드는 방법은 아래와 같다. char string[11] = "hello world"; char이므로 한칸당 1byte를 사용하며, "~~"문자열 맨 뒤에 \0 (NULL)문자는 자동으로 들어가게 된다. 고로 띄어쓰기를 포함한 모든 문자들 공간과 마지막의 NULL이 들어갈공간을 포함해 11개의 공간을 선언했다. C언어로 문자열을 표현하는 방법은 대표적으로 배열선언과 포인터 선언이 있다. 배열도 "상수형 포인터"로 결국 포인터와 동일한 역할을 한다. 배열으로 선언하는 방법은 메모리공간을 미리 할당하는 방법과, 컴파일러가 문자열 길이를 보고 알아서 할당시..
[C] 문자열(string) 입출력 (puts, fputs, gets, fgets) 사용법
문자열 출력 함수로 : puts, fputs 가 있다. 출력 함수 puts - 함수 원형: int puts(const char * string) - 반환형이 int인 이유? char형은 컴파일러마다 unsigned, signed가 다른데, int는 모든 컴파일러가 signed int로 처리함. - int형 이므로 어떤 컴파일러든 -1값(EOF)을 반환하는데 무리가 없다. - 자동으로 문자열 맨뒤 '\n' 개행이 붙는다. - char * 이므로 메모리상의 특정 문자열의 주소값이 그데로 전달 됨을 알 수 있다. 출력 함수 fputs - 함수 원형: int puts(const char * string, FILE * stdout) - 반환형이 int인 이유? char형은 컴파일러마다 unsigned, signe..