C++

ChoRong0824·2023년 3월 26일
0

C

목록 보기
8/17
post-thumbnail

C++ 기본적이면서 필수적인 것들을 정리해보겠습니다.
질문의 정답은 맨 아래에 기재해놨습니다.

1~4 : 프로그래밍기초
5~6 : 함수와 활용
7~9 : 클래스와 활용

1~4 chapter

Dealing with Data // 데이터 처리

  • C
#include <stdio.h>

printf("hello\n");
  • C++
#include <iostream>

using namespace std;

int main(){
    cout << "hello world" << endl;

    return 0;
}
  • c++ 같은 경우,
#include <iostream> // 전처리 지시자
  • C++에서 함수를 사용하고자 한다면,
    반드시 그 함수의 원형을 미리 정의하여야 합니다.

  • C++에서 ; 는 종결자의 역할(한 문장의 끝)

  • endl 줄바꿈을 의미

  • << 데이터의 방향

  • 원래는 std::cout를 써야하는데 using namespace std; 를 사용해줌으로써
    std:: 를 안쓰고 cout만 사용 가능.

    이렇게 사용하면 에러 발생 출력문 작성시 각각 사용해야함.

int a; //선언
a=7; //대입
int b=7; // 초기화

cout << "a=" << a << ", b=" << b << endl;

1. 데이터 타입 및 출력

include <climits> 를 선언해주면 최대 값 함수 사용가능.

#include <iostream>
#include <climits>

using namespace std;

int main(){
    // short, int, long, long long

    int n_int = INT_MAX;
    short n_short = SHRT_MAX;
    long n_long = LONG_MAX;
    long long n_llong = LLONG_MAX;

    cout << "int는 " << sizeof n_int << "바이트입니다." << endl;
    cout << "최대값" << n_int << "." << endl;
    
    cout << "short는 " << sizeof n_short << "바이트입니다." << endl;
    cout << "최대값" << n_short << "." << endl;

    cout << "long는 " << sizeof n_long << "바이트입니다." << endl;
    cout << "최대값" << n_long << "." << endl;

    cout << "long long는 " << sizeof n_llong << "바이트입니다." << endl;
    cout << "최대값" << n_llong << "." << endl;

    return 0;
}

이유 및 해결법,

Visual Studio Code에서 Clang 컴파일러를 사용할 경우, 경로에 한글이 포함되어 있을 때 문제가 발생할 수 있습니다. 이러한 경우에는 다음과 같이 경로를 영문으로 변경하거나, 컴파일러에서 인식할 수 있는 경로로 명시해주어야 합니다.

  1. 경로를 영문으로 변경하기
    해당 파일이 있는 폴더의 이름을 한글에서 영문으로 변경해주세요. 이후 다음과 같은 명령어를 입력하여 컴파일러를 실행해보세요.
    clang -o ex2 ~/study/ex2.c
  2. 컴파일러에서 인식할 수 있는 경로로 명시하기
    Visual Studio Code에서는 작업 폴더를 설정할 수 있습니다. 작업 폴더를 변경한 후, 명령어에서 경로를 상대 경로로 지정해주는 방법을 사용할 수 있습니다.

예를 들어, 작업 폴더를 ~/study로 설정하고 다음과 같은 명령어를 실행할 경우:
clang -o ex2 ex2.c
이 경우, 컴파일러는 작업 폴더 내에 있는 ex2.c 파일을 찾아 컴파일합니다. 이 방법을 사용하면 경로를 한글로 지정해도 문제없이 컴파일이 가능합니다.

2. 실수

  • unsigned short b = -2; 해주면 양수만 출력됨.
#include <iostream>
#include <climits>

using namespace std;

int main(){

    float a =3.14;
    int b = 3.14;

    cout << a.f << "  " << b << endl;

    return 0;
}

여기서 문제, 어떤 점이 잘못되었는지 알 수 있습니까?

3. 문자열 인식

  • char : 작은 문자형
  • char b = 'a'; // char= "a" 로 작성하면 'a' + '\0' 을 포함하게된 것이라서 char을 사용하지 못함.
  • null 문자 '\0'을 꼭 작성해줘야함 그래야지 여기까지 내가 출력하는구나 를 인지할 수 있음.
  • '\0' 을 만나면 여기까지만 출력해야겠구나 라고 인지함
  • 즉, '\0'은 null 문자를 나타내며, 문자열의 끝을 나타내며, 표시하는 용도로 쓰임.
    계속 null을 쓰긴 귀찮으니까 문자열을 " "로 감싸주게 된다면, 명시적으로 null 문자가 포함됨. -> string
#include <iostream>

using namespace std;

int main(){

    // char : 작은 문자형
    char b = 'a'; // char= "a" 로 작성하면 'a' + '\0' 을 포함하게된 것이라서 char을 사용하지 못함.
    // null 문자 '\0'을 꼭 작성해줘야함 그래야지 여기까지 내가 출력하는구나 를 인지할 수 있음.
    // '\0' 을 만나면 여기까지만 출력해야겠구나 라고 인지함
    // 즉, '\0'은 null 문자를 나타내며, 문자열의 끝을 나타내며, 표시하는 용도로 쓰임.
    // 계속 null을 쓰긴 귀찮으니까 문자열을 " "로 감싸주게 된다면, 명시적으로 null 문자가 포함됨. -> string
    char a[] = {'a','b','c', '\0'};

    cout << b << endl;
    cout << a << endl;


    return 0 ;
}

4. bool

#include <iostream>

using namespace std;

int main(){

    // bool : 0 혹은 1 만 사용가능.
    // 참고로 0은 FALSE 1 은 TRUE
    bool a = 0;
    bool b = 1;
    bool c = 10;

    // 0 이외의 모든 값은  1로 저장하기 때문에 출력할 때는 당연지사 0 1 1로 출력됨.
    cout << a << " "<< b << " " << c << endl;

    return 0;
}

5. 상수선언

const 데이터타입 변수명 = 값 ;

#include <iostream>
/* c에서 상수 선언 
#define PIE 3141592
*/

using namespace std;

int main(){

    // 원의 넓이를 구하는 프로그램
    float r = 3.14;
    float sum = r*r*r;

    /* c++ 에서 상수 선언 
    const float PIE = 3.1415;
    */    

    int r2 = 3;
    float s = r2*r2*3.14;
    
    cout << sum << endl;
    cout << s << endl;


    return 0;
}

6. 데이터 형 변환

  1. 특정 데이터형의 변수에 다른 데이터형의 값을 대입했을 때
  2. 수식에 데이터형을 혼합하여 사용했을 때
  3. 함수에 매개변수를 전달할 때
#include <iostream>

using namespace std;

int main(){

    // 데이터 형 변환
    /*
    1. 특정 데이터형의 변수에 다른 데이터형의 값을 대입했을 때
    2. 수식에 데이터형을 혼합하여 사용했을 때
    3, 함수에 매개변수를 전달할 때
    */
    int a = 3.141592;
    cout << a << endl;
   
    //강제적으로 데이터형 변환
    // typeName(a) || (typeName)a
    // 바꿀 데이터형이름 선언하고 소괄호를 써서 변수이름 씀
    char ch = 'M';
    cout << (int)ch << " " << int(ch) << endl;

    // c++ 에선,
    // static_cast<typeName>
    cout << static_cast<int>(ch) << endl;

    return 0;
}
}

auto

자동으로 데이터형 변환하고 결정함.
복잡한 변수형을 다룰 때 좋음.
but, 너무 맹신하는 것은 안좋음. (아래 예시)

#include <iostream>

using namespace std;

int main(){
    // c++가 복잡한 산술 연산을 수행할 수 있을까? 
    // => c++의 연산 수행법을 알아야 할 수 있습ㄴ디ㅏ.
    // float a =9.0;
    // int b = 5;
    // cout << a/b << endl;
    
    auto x = 0.0; // float 형
    float y = 0; // float 형
    auto z =0; // int 형

    return 0;
}

Complex Data

  • c++는 복합 데이터형을 제공합니다.
    사용자 정의대로 새로운 데이터형을 만들 수 있습니다.
    복합데이터형 : 기본 정수형과 부동 소수점형의 조합

배열

  • 배열을 다른 배열에 통째로 대입할 수 없습니다.
int arr1[3]= {1,2,3};
int arr2[12] = {2,4,6,7,9};
arr2 = arr1; // 불가능
  • 초기화 값의 개수를 배열 원소의 개수보다 모자라게 제공할 수 있습니다.
  • 배열을 부분적으로 초기화하면, 나머지 원소들은 모두 0으로 설정됩니다.
    즉, 명시적으로 첫 번째 원소만 0으로 초기화하면, 나머지 원소들은 모두 0으로 초기화 됩니다.
  • 배열을 초기화할 때, 대괄호 속을 비워두면 컴파일러가 초기화 값의 개수를 헤아려 배열 원소 개수를 저장합니다.
#include <iostream>

using namespace std;

int main(){

    short month[12]={1,2,3};
    cout << month[3] << endl;

    return 0;
}

문자열

  • " " 사용시 \0 자동으로 포함함. 따라서 따로 쓸 필요 없이 문자열로 인식. 그래서 아래와 같이 사용함.
#include <iostream>

using namespace std;

int main(){

    //short month[12]={1,2,3};
    //cout << month[3] << endl;

    char arr[] = "Hello";

    cout << arr << endl;
    return 0;
}

사용자 입력과 string

  • sizeof() : 변수의 바이트 크기를 반환함
  • strlen() : 문자열의 길이 반환 -> #include <cstring> 에 정의되어 있음.
#include <iostream>
#include <cstring>

using namespace std;

int main(){

    const int Size = 15; 
    char name1[Size]; // 비어있는 배열
    char name2[Size] = "C++Programaing"; // 문자열 상수로 초기화

    cout << "안녕하세요. 저는 " << name2 << "입니다 ! 성함이 어떻게 되십니까?\n";
    cin >> name1;
    cout << "음, " << name1 << "씨, 당신의 이름은" << strlen(name1) << " 자입니다만\n";
    cout << sizeof(name1) << "바이트 크기의 배열로 저장되었습니다.\n";
    cout << "이름이" << name1[0] << "자로 시작하시는군요.\n";
    name2 [3]='\0';  // \0 을 넣어줌으로써 문자열이 끝남을 알림.
    cout << "제 이름의 처음 세 문자는 : ";
    cout << name2 << endl;
    return 0;
}

와우, cout 분리 잘 해야겠다는 생각이 듭니다.

#include <iostream>
#include <cstring>

using namespace std;

int main(){

    const int Size = 15; 
    char name1[Size]; // 비어있는 배열
    char name2[Size] = "C++Programaing"; // 문자열 상수로 초기화

    cout << "안녕하세요. 저는 " << name2;
    cout << "입니다 ! 성함이 어떻게 되십니까?\n";
    cin >> name1;
    cout << "음, " << name1 << "씨, 당신의 이름은";
    cout << strlen(name1) << " 자입니다만\n";
    cout << sizeof(name1) << "바이트 크기의 배열로 저장되었습니다.\n";
    cout << "이름이" << name1[0] << "자로 시작하시는군요.\n";
    name2 [3]='\0';  // \0 을 넣어줌으로써 문자열이 끝남을 알림.
    cout << "제 이름의 처음 세 문자는 : ";
    cout << name2 << endl;

    return 0;
}

  • 화이트 스페이스가 들어갈 경우 (공백) 그 이후부터는 cin이 인식을 못함.
  • 화이트 스페이스가 들어가면 cin이 문자열이 끝났다고 생각함.

getline(변수,입력받을 최대크기)

따라서,
// 변수와 사용자의 입력을 받을 최대 크기를 명시해준다면 공백을 포함해서 저장할 수 있습니다.

cin.getline(name1, Size);

복합데이터 String

  • C++에서 문자열을 다루는 방법 중 하나인 string.
  • C스타일로 string 객체를 초기화할 수 있습니다. // 변수의 선언과 초기화 등 지금까지 배운것
  • cin을 사용하여 string 객체에 키보드 입력을 저장할 수 있습니다.
  • cout을 사용하여 string 객체를 디스플레이할 수 있습니다.
  • string 의 장점 : 배열은 다른 배열에 통째로 대입할 수 없으나 string은 가능합니다.
#include <iostream>

using namespace std;

int main(){

    char char1[20];
    char char2[20]= "jaguar";
    string str1;
    string str2= "panda";

    // char1= char2; //틀림.
    str1 = str2; //가능함. -> 복합데이터 string의 장점.

    cout << str1[0] << endl;
    return 0;
}

구조체 struct

  • 배열 : 같은 데이터형의 집합
  • 구조체 : 다른 데이터형이 허용되는 데이터의 집합

->하나의집합으로 넣으면 좋음

#include <iostream>

using namespace std;

struct ex12{
        string name;
        string position;
        int height;
        int weight;
} B;


int main(){
    // 1번 방식 , 멤버연산자 사용해서 각각 입력
    // ex12 A;
    // A.name = "Son"; // 변수명.ㅇㅇ 방식으로 접근할 수 있음    
    // A.position = "WorldClass";
    
    // 2번 방식
    ex12 A = {"Son","WorldClass",183,73};

    cout << A.name << endl;
    cout << A.position << endl;
    cout << A.height << endl;
    cout << A.weight << endl;

    // 모든 값을 대입할 필요는 없음. 빈 값은 0으로 대입됨
    B = {

    };
    cout << "B struct " << B.height << endl;


    // 구조체 배열 
    ex12 C[2]={
        {"A","A",1,1},
        {"B","B",2,2}
    };
    cout << C[1].height << endl;

    return 0;
}

공용체 union

  • 구조체랑 달리 공용체(union)는 한 번에 한가지의 데이터만 저장할 수 있음.
  • 다른 데이터형을 보관할 때마다 이전에 보관했던 데이터 값들이 소실됨 -> 동시 사용 불가능함.
  • (장점은 메모리 낭비 줄일 수 있어서 좋음. but 잘 사용하진 않음)

열거체 enum

  • 기호 상수를 만드는 것에 대한 또다른 방법 (상수를 기호적으로 나타냄)
#include <iostream>

using namespace std;

int main(){
    // 열거체 enum
    // 열거체에 정수를 대입할 수 있음. 즉, red =0, orange= 2, 이렇게 대입하고 나면 yellow 는 3이됨.
    // 이유 : +1씩 해주기 때문 = > 열거체 특성.
    enum spectrum {red,orange, yellow, green, blue, violet, indigo, ultraviolet};
    /*
    1. spectrum을 새로운 데이터형 이름으로 만듭니다.
    2. spectrum 에서 정의된 0에서부터 7까지 정수 값을 각각 나타내는 기호 상수로 만듭니다.
    -> 즉, spectrum에 있는 red 는 0 , orange 는 1 ... (이런식)
    */
    // 열거체에서 특징이 사용된 열거자들을 상수로서(기호상수) 관리 해야하기 때문에, 산술연산 적용 불가능. 
    // EX) spectrum a = orange + yellow; 이건 불가능.
    spectrum a = orange;
    cout << a << endl;

    int b;
    b = blue;
    b = blue + 3; // int형 변수에 값을 대입하고자 할때는, 열거자들의 값은 int형 정수자로 계산됨, 이떄 blue 는 4를 가지고 있기 때문에
    cout << b << endl; 

    return 0;
}
  1. spectrum을 새로운 데이터형 이름으로 만듭니다.
  2. spectrum 에서 정의된 0에서부터 7까지 정수 값을 각각 나타내는 기호 상수로 만듭니다.
    -> 즉, spectrum에 있는 red 는 0 , orange 는 1 ... (이런식)
  • 열거체에서 특징이 사용된 열거자들을 상수로서(기호상수) 관리 해야하기 때문에, 산술연산 적용 불가능. EX) spectrum a = orange + yellow; 이건 불가능.

포인터 (꽃)

  • 주소 연산자 " & " 를 통해 값이 메모리 어디에 저장되어 있는지 확인가능 (메모리 나타냄)
  • 포인터 : 사용할 주소에 이름을 붙입니다.
    즉, 포인터는 포인터의 이름이 주소를 나타냅니다.
    이를 c++ 에서는 간접값 연산자, 간접 참조 연산자 " * " 로 표현
#include <iostream>

using namespace std;

int main(){
    /*
    int *a; // C 스타일
    int* b; // C++ 스타일
    int* c, d; // c는 포인터 변수 , d는 int형 변수로 선언됨.
    */
    int a =6; // 수
    int* b; // 포인터는 위치를 나타냄.

    b = &a; 
    
    cout << "a의 값 " << a <<endl;
    cout << "*b의 값" << *b <<endl; // 포인터로 선언된 변수의 값을 확인할 때는 * 를 붙여서 출력

    cout << "a의 주소" << &a <<endl; 
    cout << "*b의 주소" <<b <<endl; // 포인터로 선언된 변수의 주소를 확인할 때는 아무런 표시없이 변수명만으로 출력
    
    *b = *b +1; // 포인터의 주소의 값에 변화를 줘서 값을 수정
    cout << "이제 a의 값은" << a << endl; 

    return 0;
}

new 연산자

  1. 어떤 데이터형을 원하는지 new 연산자에게 알려주면,
  2. new 연산자는 그에 알맞은 크기의 메모리 블록을 찾아내고
  3. 그 블록의 주소를 리턴합니다.
    int* p = new int; // new int 형 데이터를 지정할 수 있는 새로운 메모리가 필요하다고 초기화.

delete 연산자

  • 사용한 메모리를 다시 메모리 폴로 환수.
    환수된 메모리는 프로그램의 다른 부분이 다시 사용.
int* ps = new int; // 메모리 사용
delete ps; 

규칙,

  1. new로 대입하지 않은 메모리는 delete로 해제할 수 없습니다.
  2. 같은 메모리 블록을 연달아 두 번 delete로 해제할 수 없습니다.
  3. new[]로 메모리를 대입할 경우, delete[]로 해제합니다.
  4. new 연산자를 사용할 때 대괄호를 사용하지 않았다면 delete도 대괄호를 사용하지 않아야 합니다.

예제

#include <iostream>

using namespace std;

int main(){

    double* p3 = new double[3]; // double 형 데이터 3개를 저장할 수 있는 공간을 대입합니다.
    p3[0] = 0.2; // p3를 배열 이름처럼 취급합니다.
    p3[1] = 0.5;
    p3[2] = 0.8;

    cout << "p3[1] is " << p3[1] << ".\n";

    p3 = p3 +1; // 포인터를 증가시킵니다.
    
    cout << "Now p3[0] is " << p3[0] << " and ";

    cout << "p3[1] is " << p3[1] << ".\n";

    p3 = p3 - 1;     // 다시 시작 위치를 지시합니다
    delete[] p3;    // 배열 메모리를 해제합니다. new에서 대괄호 사용했으니 당연지사 delete도 대괄호 사용
    // cin.get();
    
    return 0;
}

해당 코드중 제일 중요한 부분이 있습니다.

p3 = p3+1;

배열에 이 값을 더하는 행위는, 지금 예제처럼 p3가 포인터라면 맞는 표현이고,
p3가 단순한 배열 이름이라면, 틀린것입니다.
왜냐? 배열이름이라면 값을 변경할 수 없기 때문입니다.
포인터는 변수처럼 사용할 수 있어서 값을 변경할 수 있음.
즉, 다시 말해 포인터 변수에 1을 더하게되면 그 포인터가 지시하는 데이터의 바이트 수만큼 증가하게됨.

new를 사용한 후에는 반드시 delete를 사용해야 합니다.
그렇지 않은 경우에는 대입은 되었지만, 나중에 사용되지 않는 메모리 누수가 발생할 수 있고,
메모리 누수의 규모가 매우 커지게 될 수 있고, 이런 경우 프로그램은 먹통이 됩니다.


객체지향 프로그래밍의 가장 큰 특징

  • 컴파일 시간이 아닌 실행 시간에 어떠한 결정을 내릴 수 있습니다.
    (컴파일 시간 : 프로그래밍이 코드를 읽는시간, 실행 시간 : 코드가 실행되서 돌아가고 있는 시간)

    예시)
    배열 생성,
    재래적 / 절차적 프로그래밍 : 배열의 크기가 (컴파일 시간에)미리 결정
    객체지향 프로그래밍 : 배열의 크기를 실행 시간에 결정


포인터에 문자열

#include <iostream>
#define SIZE 20

using namespace std;

int main(){

    char animal[SIZE]; 
    char* ps;

    cout << "동물 이름을 입력하세요\n";
    cin >> animal;
    
    //동적 구조체 생성하는게 더 나을 것 같음. -> 다음 예제
    ps = new char[strlen(animal+1)]; 
    // stren 소괄호로 둘러싸인 이 변수의 크기를 반환하는 함수 , +1은 넉넉한 공간을 확보하기 위해 더해줌. 실행시간에 배열읰 크기 정해줌
    strcpy(ps, animal); // animal의 값을 ps에 복사하는 역할

    cout << "입력하신 동물 이름을 복사하였습니다." << endl;
    cout << "입력하신 동물 이름은 " << animal << "이고, 그 주소는 " << (int*)animal << " 입니다."  << endl;
    cout << "복사된 동물 이름은" << ps << "이고, 그 주소는 "<< (int*)ps << " 입니다." << endl;

    return 0;
}

동적 구조체

. 멤버 연산자를 " -> " 로 바꿈

#include <iostream>

using namespace std;

struct My{
    char name[20];
    int age;
};

int main(){

    My* temp = new My;

    cout << "당신의 이름을 입력하세요 \n";
    cin >> temp -> name;

    cout << "당신의 나이를 입력하세요 \n";
    cin >> (*temp).age; // -> 가 싫으면 이렇게 접근해도 됨.

    cout << "안녕하세요 ! " << temp -> name << "씨!\n";
    cout << "당신은 " << temp -> age << "살 이네여.";

    return 0;
}


Loop

b++ : ++가 앞에 붙으면 변수의 값을 판단하고 나중에 증가
++b : b초기화 값에 1을 추가하고 판단

for

#include <iostream>
using namespace std;
int main (){

    char a[10] = {'a','b','c','d','e'};

    for (size_t i = 0; i < 5; i++){
        cout << a[i] <<endl;
    } return 0;
}

while

// 1 
#include <iostream>

using namespace std;

int main(){

    string str ="Panda"; //개행 문자를 포함하고 있음.
    int i=0;
    // null 문자가 아닐 때 동안 반복함 - > 자바로는 while (st.hasMoreTokens()) 라고 보면 될듯.
    while (str[i] !='\0'){

        cout << str[i] << endl;
        i++;
    }

    return 0;
}

do while

  • 먼저 반복을 진행하고 나서 조건을 검사함
// 2 do while
#include <iostream>

using namespace std;

int main(){

    int j=false;
    do{
        cout << "while문 입니다.\n";
        j++;
    } while (j);
    return 0;
}

반복문 활용

for(a:b) : a= 출력하고 싶은 데이터 형과 똑같은 데이터형 선언 / b= 콜론 다음에 배열의 이름을 대입
해당 반복문은, 배열의 사이즈 끝까지 출력하기 때문에, 0으로 초기화된 나머지 값을 출력하게 됨. (주의)

#include <iostream>

using namespace std;

int main(){

    int a[5] = {1,3,5,7,9};

    for ( int i = 0; i < 5; i++){
        cout << a[i];
    }
    cout << "\n";
    cout << "강화 for문" << "\n";
    for(int i : a){
        cout << i;
    }
    return 0;
}

Branch syntax

  • if, if-else, 논리표현식
#include <iostream>

using namespace std;

int main(){

    cout << "당신의 나이를 입력";
    int age;
    cin >> age;

    if(age <0||age >100){
        cout << "구라치지마\n";
    }else if (20 <=age && age<30){
        cout << "20대군요,\n";
    }else cout << "당신의 나이를 잘 모르겠습니다\n";

    return 0;
}
#include <iostream>

using namespace std;

int main(){

    int n = 0;
    while (true){

        cout << "n 의 값은" << n << "입니다" << endl;
        if (n>10)
        break;
        n++;

    }
    cout << "while 종료" << endl;

    return 0;
}
#include <iostream>

using namespace std;
const int SIZE =30;

int main(){

    cout << " 문장을 입력" << endl;
    char line[SIZE];
    cin.get(line,SIZE);
    cout << "입력하신 문장은\n";
    int spaces =0;
    // 개행 문자를 받기 전까지 반복 
    for (int i=0; line[i]!='\0';i++){
        cout << line[i];

        //만약 공백 입력시 spaces 늘어나지 않고 반복문으로 돌아감.
        if (line[i] != ' ')
            continue;
        
        spaces++;
    }
    cout << "입니다.\n";
    cout << "입력하신 문장에서 공백을 제외한 문자 수는" << spaces << "개 입니다.\n";
    cout << "while문 종료" << endl;

    return 0;
}

강의로만 c++을 공부를 진행한 필자는 문득, 궁금했습니다.
왜 c++ 에서는 void main()이 아닌, int main() 함수로 시작을 하는 것일까?

  • 그냥 간단히 반환값 때문일까?
  • 에러 발생유무를 확인하려고 그러는 것일까?
    라는 생각들을 했었습니다.
    하지만, 이유는 간단했습니다. void main()은 반환값이 없는 함수를 의미하며,
    C++ 표준에서는 main() 함수가 반드시 반환값을 가져야 한다고 명시되어 있습니다.
    따라서, void main()을 사용하는 것은 C++ 표준을 위반하는 것이게 됩니다.

결론 : int main() 함수 사용 후 return 해주자.

profile
컴퓨터공학과에 재학중이며, 백엔드를 지향하고 있습니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

1개의 댓글

comment-user-thumbnail
2023년 3월 27일

정답: 식에 클래스 형식이 있어야하는데 float형식이 있습니다.
한마디로 cout << a 를 해줘야 실수형이 출력 가능하다는 것입니다.
c 언어는 printf 변수명.f 해줬어야 했으나, c++ 은 변수명만 작성하면 출력됩니다.

답글 달기