C++가 이렇게 어려운데 왜 아직도 C++를 사용하는 걸까요? C++ 핵심 지침 분석을 통해 답을 얻었습니다.

머리말

C++는 강력하고 복잡한 프로그래밍 언어입니다. 고유한 응용 시나리오와 장점이 있습니다. 배우고 사용하는 데 몇 가지 어려움이 있을 수 있지만 여전히 널리 채택되는 데에는 많은 이유가 있습니다. C++에는 장점이 있지만 다음과 같은 이점이 있습니다. 일부 복잡성과 잠재적인 함정이 있으므로 사용하기로 선택할 때 절충점이 있습니다. 일부 애플리케이션 시나리오의 경우 Python, Java 또는 C#과 같은 다른 프로그래밍 언어가 시작하기 쉽고 더 적합할 수 있습니다. C++ 사용 여부는 특정 프로젝트 요구 사항, 팀 기술 및 리소스 가용성에 따라 달라집니다.

눈 깜짝할 사이에 졸업한 지 몇 년이 되었고, 대학 시절 많은 프로젝트에서 Java를 사용했고, 여러 대회에 참가한 프로젝트에서도 Java + Spring Boot를 백엔드로 사용했습니다. 수많은 추억들 IOC란 무엇인가 Docker와 Mybtis의 소스코드는 그 당시에는 정말 익숙했습니다.

저는 또한 대학에서 오픈 소스 프로젝트를 만들었습니다: https://github.com/truedei/truedei-swagger-plugin

4학년 인턴십 중에도 백엔드 개발을 위해 Java를 사용했습니다.

졸업 후 C 언어 및 C++ 관련 직업을 찾은 이유는 다음과 같습니다.

말이 많으니 조금만 기다려주세요. 글 마지막에는 읽을 수 있는 책 몇 권을 소개해 드리겠습니다.

시작하기 위해 C++/Java/Python 대신 C를 선택하는 이유는 무엇입니까?

대부분의 컴퓨터 관련 전공자들은 대학에 입학한 후 프로그래밍 입문과정을 C 언어로 이수한 후 C++/Java/Python 등 고급 언어로 서서히 발전합니다.C를 먼저 배우는 이유는 무엇입니까?Java나 C++를 직접 배우지 않는 이유는 무엇입니까? 내가 들은 답변 중 다음과 같은 내용이 동의했습니다.

  1. 단순성과 기본 사항 : C 언어는 많은 고급 프로그래밍 언어보다 단순하고 구문이 상대적으로 적기 때문에 이해하고 배우기가 더 쉽습니다. 따라서 제어 흐름, 데이터 구조, 기능 등과 같은 기본 프로그래밍 개념과 기술을 구축하는 데 도움이 되는 이상적인 입문 언어입니다.

  2. 저수준 제어 : C 언어는 컴퓨터 하드웨어에 대한 저수준 제어를 제공하며 이는 컴퓨터 아키텍처와 시스템 프로그래밍을 이해하는 데 매우 유용합니다. 대학에서는 학생들이 더 높은 수준의 언어를 배우기 전에 이러한 낮은 수준의 이해를 쌓을 수 있기를 기대하는 경우가 많습니다.

  3. 크로스 플랫폼 : C는 다양한 운영 체제 및 하드웨어 플랫폼에서 프로그램을 작성하는 데 사용할 수 있는 하위 수준 언어로, 학생들이 이식 가능한 코드를 작성하는 능력을 개발하는 데 도움이 됩니다.

  4. 기본 알고리즘 및 데이터 구조 : C 언어를 학습하면 학생들은 기본 알고리즘 및 데이터 구조에 대해 더 깊이 이해하는 데 도움이 되며, 이러한 지식은 C++, Java 또는 Python을 사용하는 후속 프로그래밍에서 매우 중요합니다.

    C++, Java 등 많은 고급 언어가 C 언어를 기반으로 하고 유사한 구문 구조와 프로그래밍 개념을 갖고 있기 때문에 학생들이 C 언어의 기본 프로그래밍 개념을 익히면 일반적으로 다른 프로그래밍 언어로 더 쉽게 전환합니다. 또한 C 언어를 배우면 학생들에게 견고한 프로그래밍 기초가 제공되어 고급 언어의 추상 개념과 객체 지향 프로그래밍을 더 쉽게 이해할 수 있습니다.
    C 언어를 배우려면 더 많은 시간과 노력이 필요할 수 있지만, 이는 학생들에게 컴퓨터 프로그래밍에 대한 심층적인 이해를 위한 탄탄한 기반을 제공하므로 향후 경력 개발에 매우 ​​도움이 됩니다. C를 마스터하고 나면 다른 프로그래밍 언어를 배우는 것이 일반적으로 상대적으로 쉽습니다. 따라서 대부분의 대학에서는 컴퓨터공학 전공 입문 프로그래밍 언어로 C 언어를 선택하는 것이 합리적입니다.

C++를 사용하는 사람은 누구입니까?

C++는 많은 조직과 분야에서 널리 사용되는 프로그래밍 언어입니다. 임베디드 시스템부터 다양한 서버에 이르기까지 C++는 어디에서나 볼 수 있습니다. 다음은 몇 가지 주요 영역 및 용도입니다.

  1. 게임 개발 : C++는 게임 개발에서 매우 인기가 높습니다. Unity, Unreal Engine, CryEngine과 같은 많은 대형 게임 엔진은 C++로 작성되었습니다. C++는 실시간 그래픽 렌더링과 물리 시뮬레이션이 필요한 게임에 중요한 고성능과 직접적인 하드웨어 제어를 제공하기 때문입니다.
  2. 시스템 프로그래밍 : 운영 체제, 드라이버 및 임베디드 시스템은 C++로 작성되는 경우가 많습니다. 낮은 수준의 하드웨어 제어 및 메모리 관리를 위한 C++ 기능으로 인해 C++는 이러한 영역에서 선택되는 언어입니다.
  3. 금융 분야 : 많은 금융 기관에서는 C++를 사용하여 고성능 거래 시스템 및 금융 애플리케이션을 구축합니다. C++는 복잡한 알고리즘을 빠르게 수행하고 많은 양의 데이터를 처리할 수 있기 때문입니다.
  4. 과학 컴퓨팅 및 데이터 분석 : C++는 특히 수치 계산이나 대규모 데이터 세트 처리가 필요한 경우 고성능 과학 컴퓨팅 및 데이터 분석 작업에 사용됩니다. 예를 들어 일부 수치 및 데이터 처리 라이브러리는 C++로 작성되었습니다.
  5. 임베디드 시스템 : C++는 특정 하드웨어 플랫폼에 최적화될 수 있고 하드웨어에 대한 낮은 수준의 액세스를 제공하므로 임베디드 시스템 분야에서 매우 유용합니다.
  6. 네트워킹 및 통신 : 일부 네트워크 및 통신 애플리케이션은 고성능 데이터 전송 및 프로토콜 처리를 가능하게 하기 위해 C++로 작성되었습니다.
  7. 그래픽 디자인 및 컴퓨터 그래픽 : C++는 그래픽 디자인 도구, 3D 모델링 소프트웨어 및 그래픽 렌더링 응용 프로그램을 만드는 데 사용됩니다. OpenGL 및 DirectX와 같은 일부 오픈 소스 그래픽 라이브러리도 C++로 작성되었습니다.
  8. 대규모 애플리케이션 : 데이터베이스 관리 시스템 및 운영 체제 코어와 같은 일부 대규모 애플리케이션도 높은 수준의 제어 가능성과 성능을 제공하기 때문에 C++로 작성됩니다.

C++는 성능, 제어 및 크로스 플랫폼 기능으로 인해 다양한 분야와 산업에서 널리 사용되는 다목적 프로그래밍 언어입니다. 다소 복잡하기는 하지만 고성능과 낮은 수준의 제어가 필요한 애플리케이션에서는 여전히 강력한 선택입니다.

내 경험

졸업 후 C언어, C++ 관련 직업을 찾은 이유는 무엇일까요?그 답이 지금 공개됩니다.

그 이유는 졸업을 앞두고 2~3주 뒤에 학교를 떠날 예정인데 이미 취업도 했고, 베이징, 상하이, 심천에서도 면접 제의도 받았고, 2만 이상 벌면 너무 좋다. 심천에 있어요 나쁘지 않아요 연봉이 30W 이상이고 회사가 꽤 크고 큰데 저는 가본 적이 없습니다 이 회사 문화가 마음에 들지 않습니다 야근이 꽤 심각하고 너무 가혹합니다 집이랑 멀어서 집에 무슨 일 생기면 집에 돌아가기 힘들어요 심천에 가면 1000원, 왔다갔다 하면 2000원... 할 수 있어요 생각만 하면 받아들이지 마세요.

베이징도 아주 좋아요. 게임 개발이나 전통적인 소프트웨어 관련 일자리도 있어요. 4학년 때 베이징에 있는 Glodon 본사에서 1년 동안 인턴을 했기 때문에 베이징에 정말 가고 싶지 않아요. 베이징에서 그런 느낌을 받았어요. 혼잡하다는 거죠. 제가 가는 곳마다 줄, 줄, 줄이 있습니다.

여러 가지 이유로 상하이를 선택했는데, 상하이에서 제의를 선택한 직후 갑자기 좋은 채용 소프트웨어의 상사가 나에게 연락해 자신의 직책을 시험해보고 싶은지 물었고 당시 나는 이미 상하이의 다른 회사와 협상을 마친 상태였습니다. 회사에 수백명의 사람들이 있었습니다. 여러 가지 방법으로 거절했고 시도하고 싶지 않았습니다. 그 이유 중 하나는 회사가 상대적으로 작았고 그다지 신뢰할 수 없을 것이라고 생각했기 때문이었습니다. 또한 이전 인터뷰는 다음과 같습니다. 모두 Java로 되어 있고 이 회사에서는 C나 C++가 필요하고 지식 체계가 있는 사람이고 Linux에서 C/C++ 소프트웨어 개발을 하고 있습니다.

저는 고등학교 1학년 때부터 Linux를 접해왔기 때문에 Linux에 대한 애착이 있습니다. 고등학교 때 Linux 대회에 참가하여 전국 금메달을 수상하기도 했으며, 대학까지 계속해서 Linux를 사용해왔습니다.

사실 이 회사에서 채용하는 걸 보기 전에는 Linux 관련 일자리를 찾고 싶은 마음이 전혀 없었습니다. 첫 번째 이유는 운영 및 유지 관리가 너무 단순하다고 느꼈고 참여하고 싶지 않았기 때문이었습니다. 두 번째 이유는 그 어려운 자리가 너무 어려웠고, 나는 거기에 참여한 적이 없었다. .

나중에 얘기해본 결과 이 ​​회사가 눈에 띄더군요. 좋은 사장님은 제가 이 분야를 접해본 적이 없어도 상관없다고 하셨습니다. 퇴근 후에 공부할 시간도 주셨고, 월급도 얼마든지 받을 수 있다고 하셨습니다. 이미 구한 일자리의 급여에 따라 주세요. (조금 설렜지만) 면접에 참석하기로 했습니다.

나중에 회사의 기술리더와 좋은 상사가 대화와 인터뷰에 참여했는데, 대화를 마치고 나니 기술리더가 4학년 인턴 시절 함께 일했던 마스터와 똑같다는 느낌이 들었고, 꽤 좋은 사람이었다. 면접 덕분에 인턴십 동안 일도 잘 되고 이 회사에 가기로 결정하기 전에 기분도 좋아지고 대화도 더 편해지고, 모르는 부분도 명확하게 설명해줄 수 있고... 진짜 상사입니다. 상사가 감동하지 않을까요?...드디어 동의하고 이 회사에 갔습니다.

이렇게 제가 Java에서 C/C++로 전환하게 된 것은 운명적인 일이었습니다. 기회를 주신 좋은 상사님께 정말 감사드립니다. 저는 리눅스를 정말 좋아하고 어려운 일에 도전하고 싶을 뿐입니다.

이렇게 지금까지 저는 리눅스 임베디드 애플리케이션, 오디오, 비디오 관련 작업을 해왔고, 일부 리눅스 커널과 드라이버 관련 작업도 접해보았는데 모두 C/C++입니다.

C++은 정말 어려워서 한번 사용하면 금방 포기하게 됩니다.

나는 (임베디드 분야에서) 어려움이 있다고 생각합니다.

  • 1. 디버깅이 번거롭다 임베디드 작업을 할 때 효율적이고 보편적인 디버깅 방법은 printf() 밖에 없다고 생각한다; (코드를 빨리 디버깅하고 버그를 찾으려면 GDB 같은 디버깅 도구를 배워야 한다)
  • 2. 개발 도구가 그다지 스마트하지 않습니다. 사용하는 개발 도구가 xxx.xxx를 프롬프트하지 않을 수 있습니다. 후속 코드 완성 프롬프트는 Java 개발 시 IDEA 아티팩트와 다릅니다. (C/C++를 잘 사용하려면 상황에 따라 다릅니다.) 개인별로)
  • 3. 하드웨어 지식이 없으면 하드웨어 기술을 다루면 더 어려울 것입니다.(학습 외에는 다른 방법이 없으므로 계속 학습해야 합니다.)
  • 4. 상대적으로 강력한 이론적 지식이 필요합니다.
  • 5. 프로그래밍 언어의 사양 (매우 중요, 매우 중요, 매우 중요, 매우 중요)

기본적인 질문, 훌륭한 지식

다음은 제가 예전에 기록한 문제들입니다. 공부하고 나서 기록한 것인데 아직 블로그에 올릴 시간이 없었습니다. 단지 C++ 사양을 반영한 것일 뿐입니다. C와 언어 개발에서 겪은 문제에 대해서는 1부에서 설명하겠습니다. 다음 측면과 이를 사용하는 방법 해결하기 위한 C++ 및 해당 솔루션;

1. C 언어 문자 구문의 일반적인 함정과 C++로 이를 해결하는 방법

예를 들어 다음 4개의 변수가 정의됩니다.

char c1 = 'yes';
char c2 = "yes";

const char* s1 = "/";
const char* s2 = '/';

당신은 당신의 경험에 따라 어느 것이 옳고 어느 것이 그른지 선택할 수 있습니다.

정답은:

c1과 s1은 맞고, c2와 s2는 틀렸습니다.

여기서 주목해야 할 것은 char과 char*, 이중 " " 따옴표 및 단일 ' ' 기호 간의 차이점입니다.

char은 단일 문자를 저장하고
char*는 문자열을 저장합니다.

큰따옴표 " "는 문자열을 저장
하지만 따옴표 ' '는 문자를 저장합니다.

그래서:

char을 사용하여 문자열을 저장하는 것은 잘못된 것입니다.

char c2 = "yes";

그래서:

char*를 사용하여 문자를 저장하는 것은 잘못되었습니다.

const char* s2 = '/';

당신은 생각하고 있습니까: c2="yes"를 c2="y"로 변경하고 큰따옴표 "" 안에 단일 문자만 저장합니까? 충분합니까?

char c2 = "yes";

#改成

char c2 = "y";

내 대답은 아니오 야;

예를 들어:

char c2 = "y"; // “y” 双引号其实是由\0结尾的,所以真正的存储方式是: {'y','\0'}

몇몇 동지들은 c1에 대해 약간 혼란스러울 수도 있습니다. 단일 문자를 저장하는 데 작은따옴표 ''가 사용되는 것이 아닌가요? c1='yes'를 3글자로 써도 왜 문제가 없나요?
이는 C 언어 컴파일러에 잘림 메커니즘이 있기 때문입니다.

char c1 = 'yes';//会被截断,结果可能有2种:1.保留首字符,2.保留尾字符
cout << c1 << endl; 

c1이 인쇄되면 내 컴퓨터의 결과는 s입니다.

컴파일러에 따라 결과가 다를 수 있습니다.

우분투 x86 컴퓨터에서:

(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$ g++ main.cpp 
main.cpp:15:15: warning: multi-character character constant [-Wmultichar]
   15 |     char c1 = 'yes';
      |               ^~~~~
main.cpp: In function ‘int main()’:
main.cpp:15:15: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘7955827’ to ‘'s'[-Woverflow]
(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$ 

ARM 크로스 컴파일 도구:

(base) zhenghui@zh-pc:~/tftpboot$ arm-linux-gnueabihf-sigmastar-9.1.0-g++ test.cpp -o test
test.cpp:5:15: 警告: 多字节字符常量 [-Wmultichar]
    5 |     char c1 = 'yes';
      |               ^~~~~
test.cpp: 在函数‘int main()’中:
test.cpp:5:15: 警告: unsigned conversion from ‘int’ to ‘char’ changes value from ‘7955827’ to ‘'s'[-Woverflow]
(base) zhenghui@zh-pc:~/tftpboot$ 

자동으로 s로 변환되는 경고 메시지가 표시되는 것을 볼 수 있습니다.

또 다른 arm 크로스 컴파일 도구:

(base) zhenghui@zh-pc:~/tftpboot$ arm-linux-gnueabihf-g++ test.cpp -o test
test.cpp:5:15: 警告: 多字节字符常量 [-Wmultichar]
     char c1 = 'yes';
               ^~~~~
test.cpp: 在函数‘int main()’中:
test.cpp:5:15: 警告: large integer implicitly truncated to unsigned type [-Woverflow]
(base) zhenghui@zh-pc:~/tftpboot$ 

여전히 잘리고 결과는 여전히 s입니다.

다시 변경했지만 결과는 여전히 동일했습니다.

zh@xxx:project$ arm-none-linux-gnueabi-g++ test.cpp -o testa
test.cpp:5:15: warning: multi-character character constant
test.cpp: In function 'int main()':
test.cpp:5: warning: large integer implicitly truncated to unsigned type
zh@xxx:project$ 

s1과 s2의 경우도 마찬가지입니다. char*는 문자열을 수신하지만 s2는 작은따옴표 값을 전달하므로 s2는 오류를 보고합니다.

const char* s1 = "/";
const char* s2 = '/';

그러나 char*는 char을 참조할 수 있습니다.

    char c1 = 'yes'; //s
//    char c2 = "yes";
    cout << c1 << endl;

    const char* s1 = "/";
//    const char* s2 = '/';
    const char* s2 = &c1;  //s
    cout << *s2 << endl;

C 언어는 고급 언어 중 저급 언어입니다.

장점은 작고 효율적이며 지상에 가깝다는 것입니다.
단점은 세부 사항과 함정이 많다는 것입니다.

C++를 사용하여 위의 문제를 해결하고 방지하세요.

C++에서는 일련의 문자열 작업을 저장하고 제공하는 데 특별히 사용되는 문자열 클래스를 정의합니다.

#include "string"
using namespace std;


string  str1(1,'yes');
cout << str1 << endl;           // s

string  str2(2,'yes');
cout << str2 << endl;           // ss

string  str3("yes");
cout << str3 << endl;           // yes

예를 들어 다음 예에서는 1, 'yes'가 전달되고 인쇄 시 1s가 제거됩니다.

string  str1(1,'yes');
cout << str1 << endl;           // s

2를 전달하면 2ss가 인쇄됩니다.

string  str2(2,'yes');
cout << str2 << endl;           // ss

위의 문제를 피할 수 있으며, C++를 사용하여 문자열을 연산하는 것이 더 안전합니다.

2. C 언어 배열의 일반적인 문제와 C++를 사용하여 해결하는 방법

C 언어 프로젝트를 개발할 때 배열이 함수보다 먼저 전달되는 상황이 종종 발생하는데, 이는 또한 몇 가지 문제를 야기합니다.

예를 들어 다음과 같은 배열이 있습니다.

int array1[] = {
    
    1,2,3,4,5,6,7,8,9,10};

우리는 평균을 찾습니다:

double result;
for (int i = 0; i < 10; ++i) {
    
    
    result += array1[i];
}
result = result / 10;
cout << result << endl; //5.5

더 많은 숫자를 채우고 싶다면 어떻게 해야 할까요?

int array1[] = {
    
    1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};

계산하느라 거의 현기증이 날 것 같아요.

C 언어에서는 sizeof() 함수를 사용하여 배열의 길이를 계산할 수 있습니다.

예를 들어 다음과 같이 변경할 수 있습니다.

int array1[] = {
    
    1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
int len = sizeof(array1) / sizeof(array1[0]);
double result;
for (int i = 0; i < len; ++i) {
    
    
    result += array1[i];
}
result = result / len;
cout << result << endl;

배열의 요소 수를 자동으로 계산하는 코드를 사용하면 더 이상 수동으로 계산할 필요가 없습니다.

그런데 평균을 계산하는 코드를 독립형 함수로 표현하면 어떻게 될까요?

배열을 전달하고 평균을 반환하는 함수를 작성할 수 있습니다.



double avg1(int array[]) {
    
    
    int len = sizeof(array) / sizeof(array[0]);
    double result;
    for (int i = 0; i < len; ++i) {
    
    
        result += array[i];
    }
    result = result / len;
    return result;
}

int main() {
    
    

    int array1[] = {
    
    1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    int len = sizeof(array1) / sizeof(array1[0]);
    cout << avg1(array1) << endl;
    return 0;
}

작업 결과:

현실은 정말 더 말랐어요.

1.5

계산된 값이 올바르지 않습니다.

왜 이런 결과가 나오는 걸까요?

두 가지 함수로 다음 len의 길이를 인쇄해 보겠습니다.

double avg1(int array[]) {
    
    
    int len = sizeof(array) / sizeof(array[0]);
    cout << "avg1 len->" << len << endl; //2

    double result;
    for (int i = 0; i < len; ++i) {
    
    
        result += array[i];
    }
    result = result / len;
    return result;
}

int main() {
    
    

    int array1[] = {
    
    1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    int len = sizeof(array1) / sizeof(array1[0]);
    cout << "main len->" << len << endl; //24
    cout << avg1(array1) << endl;
    return 0;
}

작업 결과:

main len->24
avg1 len->2
1.5

전달된 배열의 결과를 계산할 수 없는 이유는 무엇입니까?

왜냐하면:

C 언어에서 배열을 전달할 때 컴파일러는 배열 []을 포인터로 변환하여 전달하므로 sizeof로 계산한 결과가 올바르지 않습니다.

컴파일할 때 다음 경고도 표시됩니다.

(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$ g++ main.cpp 
main.cpp: In function ‘double avg1(int*)’:
main.cpp:8:22: warning: ‘sizeof’ on array function parameter ‘array’ will return size of ‘int*’ [-Wsizeof-array-argument]
    8 |     int len = sizeof(array) / sizeof(array[0]);
      |                     ~^~~~~~
main.cpp:7:17: note: declared here
    7 | double avg1(int array[]) {
    
    
      |             ~~~~^~~~~~~
(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$ 

avg1을 복사하고 avg2를 다시 작성합니다.

이번에는 배열을 받아 계산 결과가 같은지 확인하기 위한 포인터로 다시 작성해 보겠습니다.

double avg2(int *array) {
    
    
    int len = sizeof(array) / sizeof(array[0]);
    cout << "avg2 len->" << len << endl; //2

    double result;
    for (int i = 0; i < len; ++i) {
    
    
        result += array[i];
    }
    result = result / len;
    return result;
}

int main() {
    
    

    int array1[] = {
    
    1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    int len = sizeof(array1) / sizeof(array1[0]);
    cout << "main len->" << len << endl; //24
    cout << "avg1:"<<  avg1(array1) << endl;
    cout << "avg2:"<<  avg2(array1) << endl;
    return 0;
}

작업 결과:

avg2(int *array) 및 avg1(int array[])의 결과는 동일하며 이는 배열이 실제로 포인터로 변환되었음을 나타냅니다.

main len->24
avg1:avg1 len->2
1.5
avg2:avg2 len->2
1.5

g++로 수동으로 컴파일할 때 avg2는 포인터를 사용하여 배열을 수신하는 구문이 정확하고 컴파일러가 이를 인식한다는 경고 메시지를 보고하지 않았다는 점을 언급할 가치가 있습니다.

C 언어에서 배열의 계산된 값 개수가 올바르지 않은 문제를 해결하는 방법은 무엇입니까?

배열을 전달할 때 배열의 요소 개수를 미리 계산해서 함께 전달하는 것이 정답이다.

avg2를 사용하여 avg3을 다시 작성합니다.

double avg3(int *array, int len) {
    
    
    cout << "avg3 len->" << len << endl; //2
    double result;
    for (int i = 0; i < len; ++i) {
    
    
        result += array[i];
    }
    result = result / len;
    return result;
}

int main() {
    
    

    int array1[] = {
    
    1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    int len = sizeof(array1) / sizeof(array1[0]);
    cout << "main len->" << len << endl; //24
    cout << "avg1:"<<  avg1(array1) << endl; //1.5
    cout << "avg2:"<<  avg2(array1) << endl; //1.5
    cout << "avg3:"<<  avg3(array1, len) << endl; //107.292
    return 0;
}

결과를 다시 실행합니다.

맞다고 볼 수 있습니다.

main len->24
avg1:avg1 len->2
1.5
avg2:avg2 len->2
1.5
avg3:avg3 len->24
107.292

C++를 사용하여 위의 문제를 해결하세요.

벡터 객체는 C++로 제공되며 포함되어야 합니다.

#include "vector"

평균 복사 평균 3 재작성 평균 4:

double avg4(vector<int> v) {
    
    
    cout << "avg4 len->" << v.size() << endl;
    double result;

    for (int i = 0; i < v.size(); ++i) {
    
    
        result += v[i];
    }
    result = result / v.size();
    return result;
}

벡터 배열은 다음과 같이 초기화됩니다.

int main() {
    
    

    int array1[] = {
    
    1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    int len = sizeof(array1) / sizeof(array1[0]);
    cout << "main len->" << len << endl; //24
    cout << "avg1:"<<  avg1(array1) << endl; //1.5
    cout << "avg2:"<<  avg2(array1) << endl; //1.5
    cout << "avg3:"<<  avg3(array1, len) << endl; //107.292

    vector<int> v{
    
    1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    cout << "avg4:"<<  avg4(v) << endl; //107.292

    return 0;
}

작업 결과:

main len->24
avg1:avg1 len->2
1.5
avg2:avg2 len->2
1.5
avg3:avg3 len->24
107.292
avg4:avg4 len->24
107.292

이를 전달하는 보다 효율적인 방법은 참조로 전달하는 것입니다.

이런 방식으로 매개변수를 전달하는 것이 더 효율적입니다.

double avg4(vector<int> &v){
    
    
...
}

반복자로 변경할 수도 있습니다.

double avg5(vector<int> &v) {
    
    
    cout << "avg4 len->" << v.size() << endl;
    double result;

    vector<int>::iterator itr = v.begin();
    for (; itr != v.end(); ++itr) {
    
    
        result += (*itr);
    }
    result = result / v.size();
    return result;
}

벡터를 사용하여 2차원 배열을 작성합니다.

double avg6(vector<vector<int>> &vv) {
    
    
    double result;

    int data_num = 0;
    for (int i = 0; i < vv.size(); ++i) {
    
    
        for (int j = 0; j < vv[i].size(); ++j) {
    
    
            result += vv[i][j];
            data_num++;
        }
    }

    result = result / data_num;
    return result;
}

int main() {
    
    
    vector<vector<int>> vv{
    
    {
    
    1,2,3},{
    
    1,2,3},{
    
    1,2,3}};
    cout << "avg6:"<<  avg6(vv) << endl; 
    return 0;
}

C++ 프로그래밍 사양이 왜 그렇게 중요한가요?

C 개발을 위한 몇 가지 사양에 대해 말하면 일부 C/C 개발자는 많은 매뉴얼을 생각할 수 있으므로 하나씩 나열하지는 않겠습니다. 제가 선호하는 것은 오픈 소스 프로젝트인 "C++ Core Guideline"입니다.

주소는 https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines 입니다.

이번 오픈소스 프로젝트는 영어로 되어 있어 국내 개발자들에게 그다지 우호적이지는 않지만, 영어를 잘하신다면 한번쯤 볼만한 가치가 있습니다.

국내 C++ 재벌들이 외국 서적을 번역했다는 소식을 듣고 중국 서적 'C++ 핵심 지침 분석'이 시판되고 있다는 소식을 듣고 바로 구매해서 읽었습니다.

책의 설명을 통해 많은 유익을 얻었으므로 여기에 몇 장의 사진이 있습니다.
이미지.png

이미지.png

도서 입구: 도서 입구로 들어가려면 여기를 클릭하세요.

点不进去,再复制到浏览器也可以:
https://union-click.jd.com/jdc?e=&p=JF8BAPsJK1olXwQEU19VCk4WBF8IHloTVAcEXW4ZVxNJXF9RXh5UHw0cSgYYXBcIWDoXSQVJQwYHVVhUCU0eHDZNRwYlD3NKUEQ0bxh0dD9LUC0RFlx8IV0ETkcbM2oIGlsUVQ4KUF1tC0oVAWgPG1kWVDYyVF9tWiXPtdnQvuoJiayNgdbKOEonA2gAGV8QWAQBUlhfDXsXC2s4Rh9JBVkBUm5tOEgnM18IK1glA2gDB1hfCRhAAgFVR1oQB1JUATBdAEMSBWwMGFwlXwcDVlxtOHtCUxNUUCZwBwZ9BB5UVAJveBtIQyx2NXtsVgYDdA5kSwtDGy9hCFZrMioNOA

공교롭게도 제가 모든 사람에게 줄 수 있는 책이 세 권 있습니다. 먼저 저를 QQ 그룹에 추가하신 후 위챗에 추가하시고 위챗에 들어가 좋아요를 눌러주시고 18일, 68일에 각각 "C++" 사본을 보내주시면 됩니다. 위챗 좋아요 128위 . 핵심지침 분석' 중국어 도서 .

개인 위챗을 사용하기가 불편해서 먼저 그룹에 가입한 후 내 비공개 위챗을 추가하면 됩니다.
이미지.png

추천

출처blog.csdn.net/qq_17623363/article/details/132727746