달력

112024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

void 선언

karma( 업 )/C_C++ 2024. 4. 11. 09:01

C/C++ 에서 void type 은 '없음' 을 나타내는 특별한 타입이다.

이 것은 값 자체가 없음을 의미하기 때문에 L Value 가 될 수 없다. 

void a; //void는 값 자체가, 타입이 없기 때문에 선언할 수 없다. 메모리 할당이 불가능

void* pa; // void 포인터는 주소를 가리키는 것이기 때문에 L Value로 사용 가능

 

L Value는 object의 위치 값을 뜻하는 locator value라고도 한다. L Value는 object를 표기할 수 있다는 뜻이다.

void는 object가 없기 때문에 L Value가 될 수 업다.

 

 

 

 

 

 

'karma( 업 ) > C_C++' 카테고리의 다른 글

The Clockwise/Spiral Rule  (570) 2023.10.25
상수 포인터 & 포인터 상수의 차이  (1) 2023.10.25
C/C++ 프로그래밍을 잘하려면  (0) 2020.02.04
*& reference to pointer  (0) 2018.12.03
09. std::tuple( C++11로 가자 )  (0) 2018.11.01
Posted by 생짜
|

'karma( 업 ) > C_C++' 카테고리의 다른 글

void 선언  (0) 2024.04.11
상수 포인터 & 포인터 상수의 차이  (1) 2023.10.25
C/C++ 프로그래밍을 잘하려면  (0) 2020.02.04
*& reference to pointer  (0) 2018.12.03
09. std::tuple( C++11로 가자 )  (0) 2018.11.01
Posted by 생짜
|

const int*는 상수 포인터, int* const는 포인터 상수를 나타낸다.

const는 C++에서 변경 불가 keyword이다.

const가 붙는 위치에 따라 변수 선언이 다른 의미를 가진다.

const가 * 앞에 붙으면 상수 포인터, * 뒤에 붙으면 포인터 상수가 된다.

 

int* n;				// int형 포인터 변수
const int n = 10;   // n 이라는 value 값 자체를 변경 불가
const int* n;       // int형 상수에 대한 포인터, 데이터 상수화, int const* 와 동일
*n = 20;			// n의 주소값이 가리키는 value 값 변경 불가
int* const n;		// int형에 대한 포인터 상수, 포인터의 상수화, n의 주소값 변경 불가
const int* const n;	// n의 value와 주소값 모두 변경 불가, int const* const와 동일

 

상수 포인터 ( const int* //int const* )는 포인터 값은 변경가능하지만 포인터가 가르키는 주소에 있는 값은 변경이 불가능하다. 문자열 자체가 프로그램의 데이터 세그먼트에 있고 변경해서는 안되는 경우에 중요하다

'karma( 업 ) > C_C++' 카테고리의 다른 글

void 선언  (0) 2024.04.11
The Clockwise/Spiral Rule  (570) 2023.10.25
C/C++ 프로그래밍을 잘하려면  (0) 2020.02.04
*& reference to pointer  (0) 2018.12.03
09. std::tuple( C++11로 가자 )  (0) 2018.11.01
Posted by 생짜
|

내가 처음 프로그래밍을 시작할 때는 C 가 전부였다.

 

물론 코볼도 있었고 포트란도 있었고 어셈도 있었지만 대부분의 사람들이 프로그래밍을 시작할 때 C를 배우고 시작했다.

 

현재의 Managed 언어에 비해 C/C++은 어려운 언어이다. 

 

C/C++은 메모리를 건든다. 그렇기 때문에 컴퓨터 내부 구조와 밀착되어 있는 언어이다. 컴퓨터의 처리 방식을 충실히 따르는 언어라고 할 수 있다.

 

컴퓨터의 구조만 이해한다면 C/C++ 프로그래밍을 더욱더 잘할 수 있다는 말이다. 

 

그렇다고 컴퓨터 구조만이 전부는 아니다. C/C++을 잘할려면 그 외 많은 것을 배워야 한다.

 

C/C++ 뿐만 아니라 프로그래밍이라는 것에 대해 이해가 빠른 사람들은 아래와 같은 특징들을 가지고 있다.

 

  1. 일단 뭐든 일에서 그렇듯이 재미있어 한다. 이게 가장 큰 이유이다.
  2. 프로그래밍을 시작할 때 준비와 순서를 먼저 생각한다.
  3. 문제를 해결하는데 있어 무엇이 문제인지 빨리 알아챈다.
  4. 문제를 해결한 후 더 좋은 다른 방식을 찾는다.
  5. 한 가지를 이해했으면 그것을 발전시켜 다른 무언가를 시도하면서 시행 착오를 경험한다.
  6. 법칙이 주어졌을 때 그 법칙을 이용해 계속해서 문제를 해결한다.
  7. 비슷한 동작이 반복될 때 그 안에서 법칙을 찾아낸다.
  8. 머릿속이 정리되지 않을 때에는 종이나 연필을 이용해 그림이나 숫자를 써가며 생각을 정리한다.
  9. 끝을 봐야 직성이 풀린다.
  10. 컴퓨터적인 사고가 가능하다.( Divide & Conquer )
  11. 컴퓨터의 구조를 이해하고 있다.

'karma( 업 ) > C_C++' 카테고리의 다른 글

The Clockwise/Spiral Rule  (570) 2023.10.25
상수 포인터 & 포인터 상수의 차이  (1) 2023.10.25
*& reference to pointer  (0) 2018.12.03
09. std::tuple( C++11로 가자 )  (0) 2018.11.01
02. 범위기반 for문( C++11으로 가자 )  (0) 2018.11.01
Posted by 생짜
|

간단하게 말해 pointer형 변수를 참조하겠다는 뜻이다.

아래 코드를 참조하면 이해가 될 것이다.


int a = 5;

int* b = &a;

printf("%d, %d", a, *b); //5, 5로 출력

int*& c = b; //포인터 변수 b를 참조

printf("%d, %d, %d", a, *b, c); //5, 5, 5로 출력

c=10;

printf("%d, %d, %d", a, *b, c); //10, 10, 10로 출력

int d = 3;

b = &d;

printf('%d, %d, %d", a, *b, c); //10, 3, 3로 출력 


 char *str = "Hello";


char *ptr = str;
char *&rptr = str;
char *world = "World";
ptr = world;

printf(str); // Hello 출력


rptr = world;

printf(str); //World 출력



Posted by 생짜
|

///////////////////////////////////////////////////////////////

// 09. tuple( std::tuple ) Example

// * C++11에  새롭게 추가, C++11 이전의 컴파일러는 지원을 하지 않음

// * C++11 이전 컴파일러에서는 '-std=c++11' or '-std=gnu++11' 컴파일 옵션을 추가해야 함

// * 가장 일반적인 형태는 함수의 반환값으로 사용

// * 여러개의 반환값을 하나의 tuple로 묶어사용하여 다수의 값 또는 객체를 반환할 수 있다.

///////////////////////////////////////////////////////////////

#include <iostream>

#include <string>

#include <tuple>


std::tuple<double, char, std::string> get_student(int id) //<<-- 리턴값을 tuple로 함

{

    //여러개의 리턴값을 tuple로 만들어 주는 함수( make_tuple )

    if (id == 0) return std::make_tuple(3.8, 'A', "Lisa Simpson"); 

    if (id == 1) return std::make_tuple(2.9, 'C', "Milhouse Van Houten");

    if (id == 2) return std::make_tuple(1.7, 'D', "Ralph Wiggum");

    throw std::invalid_argument("id"); //<<--- 인자값을 검사하는 throw/catch 구문

}


int main()

{

    auto student0 = get_student(0);

    std::cout << "ID: 0, "

               << "GPA: " << std::get<0>(student0) << ", "

               << "grade: " << std::get<1>(student0) << ", "

               << "name: " << std::get<2>(student0) << '\n';


    double gpa1;

    char grade1;

    std::string name1;


    //tuple로 리턴한 값들을  tie 객체를 써서 각각의 변수에 대입

    std::tie(gpa1, grade1, name1) = get_student(1); 

    std::cout << "ID: 1, "

               << "GPA: " << gpa1 << ", "

               << "grade: " << grade1 << ", "

               << "name: " << name1 << '\n';

}


cpp11_tuple.cpp


'karma( 업 ) > C_C++' 카테고리의 다른 글

C/C++ 프로그래밍을 잘하려면  (0) 2020.02.04
*& reference to pointer  (0) 2018.12.03
02. 범위기반 for문( C++11으로 가자 )  (0) 2018.11.01
01. auto( C++11으로 가자 )  (0) 2018.11.01
01. C++11의 특징( C++11으로 가자 )  (0) 2018.11.01
Posted by 생짜
|

///////////////////////////////////////////////////////////////

// 02. 범위기반 for 문 Example

// C++11은 Java나 C#에서 제공하는 범위기반 for문을 제공한다.

// * for 루프가 간단해 짐

// * 루프의 순회값(i)의 초기값을 정해줄 필요가 없다.

// * 배열의 길이를 지정해주지 않아도 된다.

// * 언제까지 순회(범위)해야 할지 지정할 필요가 없다.

///////////////////////////////////////////////////////////////////

#include <iostream>

#include <vector>

using namespace std;


int main()

{

    vector<int> vInt;

    for(auto i=0; i<10; ++i)

    {

        vInt.push_back(i);

    }


    //C++03 표준

    cout << "C++03 standard"<<endl;

    std::vector<int>::const_iterator it;

    for(it = vInt.begin(); it != vInt.end(); ++it)

    {

        std::cout << *it << std::endl;

    }


    //C++11 표준

    cout<< "C++11 standard"<<endl;

    for(auto i: vInt)  //for ( for-range-declaration : expression )

    {

        std::cout << i <<std::endl;

    }


    getchar();

    return 0;

}



'karma( 업 ) > C_C++' 카테고리의 다른 글

*& reference to pointer  (0) 2018.12.03
09. std::tuple( C++11로 가자 )  (0) 2018.11.01
01. auto( C++11으로 가자 )  (0) 2018.11.01
01. C++11의 특징( C++11으로 가자 )  (0) 2018.11.01
C++11으로...  (0) 2018.11.01
Posted by 생짜
|

////////////////////////////////////////////////////////////////

// 01. auto Example

// C++11의 auoto 관련 예제

// JavaScript의 'var' 와 같은 기능을 함

// STL 컨테이터에서 반복자 등을 지정할 때는 'auto' 키워드가 입력해야 할 코드 양을 상당히 줄여줌

///////////////////////////////////////////////////////////////////


#include <iostream>

#include <vector>

using namespace std;


int main(int argc, char** argv)

{

    vector<int> vInt;

    for(auto i=0; i<10; ++i)

    {

        vInt.push_back(i);

    }


    //C++03 표준

    cout << "C++03 standard"<<endl;

    vector<int>::iterator it = vInt.begin(); // STL의 vector을 사용하기 위해 vector의 iterator을 선언

    while(it != vInt.end())

    {

        cout << *it<<endl;

        it++;

    }


    //C++11 표준

    cout<< "C++11 standard"<<endl;

    auto it2 = vInt.begin(); //auto 키워드로 선언하면 컴파일러가 자동으로 vector iteraotr을 인식, 

                              //타수가 줄어든다

    while(it2 != vInt.end())

    {

        cout<< *it2<<endl;

        it2++;

    }


    getchar();

    return 0;

}


cpp11_auto.cpp




'karma( 업 ) > C_C++' 카테고리의 다른 글

09. std::tuple( C++11로 가자 )  (0) 2018.11.01
02. 범위기반 for문( C++11으로 가자 )  (0) 2018.11.01
01. C++11의 특징( C++11으로 가자 )  (0) 2018.11.01
C++11으로...  (0) 2018.11.01
Endian Check  (0) 2016.09.12
Posted by 생짜
|

00. C++ 11 제정

2011년 8월 12일에 ISO c++표준 위원회의 만장일치로 통과, 그동안 C++0x 등으로 불

렸으나 표준으로 인정받은 해에 맞춰 기술하는 원칙에 따라 C++11이라는 정식 명칭으

로 탄생


01.C++11의 특징

  • 안정성 및 C++98과의 호환성 유지
  • 핵심 언어의 확자오다는 표준 라이브러리를 이용한 새로운 기능 추가
  • 프로그래밍 기술을 발전시킬 변화 선호
  • 특정 애플리케이션에서만 유용한 새로운 기술 보다는 시스템 라이브러리 디자인에

     유용하게 C++를 개선

  • 이전의 안전하지 않은 기술에 대해 좀더 안전한 대안을 제공
  • 성능 향상과 하드웨어 직접 조작 능력 강화
  • 실 세계의 문제를 해결할 수 있는 해법 제시
  • '부담 최소화'의 원칙 (어떤 유틸리티가 필요로하는 추가적인 자원은 그 유틸리티를

     사용할 때만 필요해야 함)

  • 전문 프로그래머가 필요로 하는 어떤 유틸리티도 제거하지 않고도, 쉽게 가르치거

     나 배울 수 있어야 함.


02. 문법의 편의성이 크게 향상

  • 템플릿에서 가변 인자
  • 새로운 문자열 리터럴
  • 사용자 정의 리터럴
  • 멀티태스킹 메모리 모델
  • TLS (Thread-Local-Storage)
  • 특수 멤버 함수의 기본값 사용 및 삭제에 대한 명시적 표시
  • long long int 타입
  • 정적 assertion
  • 멤버에 대한 sizeof 허용


03. C++ 컴파일러

  • GCC

현재 C++를 가장 완벽하게 지원하는 컴파일러.

  • MSVC (MS Visual C++)

C++11/14/17 Feature In VS 2015 Preview

  • LLVM과 CLang

LLVM은 원래 다양한 프로그래밍 언어의 정적/동적 컴파일러 집합과 도구를 마들

어내는 오픈소스 프로젝트로 시작 Clang은 LLVM 컴파일러 컴포넌트를 기반으로

해 C, C++, Objective-C, Objective-C++ 프로그래밍 언어를 지원하기 위한 컴파

일러 프론트엔드, GCC 프론트 엔드보다 빠르고, 메모리 소모가 적으며 에러메시

지가 명확하다는 특징이 있음. 애플이 주도하며 구글에서도 C++를 사용할때

LLVM에 기반을 둔 Clang을 사용하길 권장, Xcode에 포함.

'karma( 업 ) > C_C++' 카테고리의 다른 글

09. std::tuple( C++11로 가자 )  (0) 2018.11.01
02. 범위기반 for문( C++11으로 가자 )  (0) 2018.11.01
01. auto( C++11으로 가자 )  (0) 2018.11.01
C++11으로...  (0) 2018.11.01
Endian Check  (0) 2016.09.12
Posted by 생짜
|

C++11으로...

karma( 업 )/C_C++ 2018. 11. 1. 13:28

오랜 기간 C/C++을 해왔지만, 처음 배운 C++99이 전부였다.

사실 C++도 아니고 그냥 C였지만.

요즘 QT를 가지고 작업을 하는데 QT는 C++11을 기본으로 하고 있어

C++11을 익히기로 마음 먹어 본다.


이 글은 GitBook의 문서( https://legacy.gitbook.com/book/duragon/c-11/details ) 를 기반으로 

몇 가지를 더 첨부했다.


0. C++11의 특징

01. auto

02. 범위기반 for문

03. 유니폼 초기화

04. decltype

05. std::array

06. Ramda

07. 스마트 포인터

08. static_assert

09. std::tuple

10. std::thread

11. std::chrono

12. 그 외 객체지향으로의 C++




 

'karma( 업 ) > C_C++' 카테고리의 다른 글

09. std::tuple( C++11로 가자 )  (0) 2018.11.01
02. 범위기반 for문( C++11으로 가자 )  (0) 2018.11.01
01. auto( C++11으로 가자 )  (0) 2018.11.01
01. C++11의 특징( C++11으로 가자 )  (0) 2018.11.01
Endian Check  (0) 2016.09.12
Posted by 생짜
|