programing

C++에 모든 것이 포함되어 있기 때문에 C를 배울 필요가 없다는 것이 사실입니까?

subpage 2023. 6. 13. 22:18
반응형

C++에 모든 것이 포함되어 있기 때문에 C를 배울 필요가 없다는 것이 사실입니까?

저는 C++ 프로그래밍 수업을 듣고 있는데 교수님께서 C++에는 C+ 객체 지향 기능이 모두 포함되어 있기 때문에 C를 배울 필요가 없다고 말씀하셨습니다.하지만, 몇몇 다른 사람들은 이것이 반드시 사실이 아니라고 저에게 말했습니다.누가 이것을 밝혀줄 수 있습니까?

개요:

C++가 C의 상위 집합이라는 것은 거의 사실이며, C를 따로 배울 필요가 없다는 점에서 교수님의 말씀이 맞습니다.

C++은 전체 객체 지향적인 측면, 일반적인 프로그래밍 측면뿐만 아니라 규칙(각 함수의 맨 위에 선언해야 하는 변수와 같은)이 덜 엄격합니다.C++는 구조체와 같은 C의 일부 용어의 정의를 변경하지만, 여전히 초집합 방식입니다.

엄격한 슈퍼셋이 아닌 이유의 예:

이 위키백과 기사에는 이러한 차이점에 대한 몇 가지 좋은 예가 있습니다.

한 가지 일반적인 차이점은 C가 void*에서 다른 포인터 유형으로 암시적 변환을 허용하지만 C++은 그렇지 않다는 것입니다.다음은 유효한 C 코드입니다.

int *i = malloc(sizeof(int) * 5);  

그러나 C와 C++ 모두에서 작동하려면 명시적 캐스트를 사용해야 합니다.

int *i = (int *) malloc(sizeof(int) * 5)

또 다른 일반적인 휴대성 문제는 C++가 C 프로그램에서 식별자(예: 변수 이름)로 사용될 수 있는 new 및 class와 같은 많은 새로운 키워드를 정의한다는 것입니다.

이 위키백과 문서에는 다음과 같은 차이점도 있습니다.

C++ 컴파일러는 다음 C99 코드에서처럼 goto가 초기화를 건너는 것을 금지합니다.

 void fn(void)
 {
  goto flack;
  int i = 1;
 flack:
   ;
 }

무엇을 먼저 배워야 합니까?

C++를 먼저 배워야 합니다. C를 먼저 배우는 것이 여러분에게 해가 될 것이기 때문이 아니라, 여러분이 무엇이든 배워야 할 것이기 때문입니다(여러분은 그렇게 하지 않을 것입니다). C를 먼저 배우는 것에 아무런 이득이 없기 때문입니다.C++에 어느 정도 포함되어 있기 때문에 결국 C에 대한 모든 것을 알게 될 것입니다.

C++이 C와 상당한 수준의 호환성을 유지하도록 설계된 것은 사실이며 C++에서 학습한 내용의 하위 집합은 C에 적용될 것이지만 사고방식은 완전히 다릅니다.Boost 또는 STL을 사용하여 C++을 프로그래밍하는 것은 C에서 프로그래밍하는 것과는 매우 다른 경험입니다.

C++을 더 나은 C로 사용하는 예술 용어가 있었습니다.이것은 C 프로그래밍을 더 쉽게 하기 위해 일부 C++ 언어 기능과 도구를 사용하는 것을 의미합니다(예: for 문 안에서 for 루프의 인덱스 변수 선언).그러나 현재 현대의 C++ 개발은 구문의 상당 부분을 제외하고는 C와 매우 다른 것으로 보이며 이러한 경우 C 레거시는 종종 이점이라기보다는 부담으로 보입니다.

C++의 구문을 알고 있다면 C의 구문을 배울 필요가 없지만 C의 코딩 관행이 C++과 어떻게 다른지에 대해 배울 필요가 있다는 것은 사실일 수 있습니다.

교수님이 100% 옳았던 건 아니군요
C에서는 코드를 논리 모듈로 정렬할 클래스가 없고 C++ 다형성이 없습니다.하지만 여러분은 여전히 어떻게든 이러한 목표를 달성해야 합니다.
C의 구문이 어느 정도는 C++의 하위 집합이지만, C의 프로그래밍은 C++의 하위 집합이 아닙니다. 그것은 완전히 다릅니다.

한마디로 이야기할 수 없군요.

다른 사람들이 이미 대답했듯이, C++ 언어는 C 언어의 상위 집합이며, 예를 들어 ('x')의 크기가 다른 값을 제공하는 등의 일부 작은 예외는 다른 값을 제공합니다.

하지만 제가 생각하기에 이 두 언어의 사용에 관한 한 C++은 초집합이 아니라 오히려 다르다는 것입니다.C++에는 화면에 쓰기와 같은 기본적인 작업을 수행하는 새로운 방법이 포함되어 있습니다.오래된 C 방식은 여전히 존재하지만 일반적으로 새로운 방식을 사용합니다.이것은 간단한 "헬로 월드" 프로그램이 C와 C++에서 다르게 보인다는 것을 의미합니다.따라서 간단한 것들이 C와 C++에서 동일하고, C++에서 객체 지향 프로그래밍 지원과 같은 더 진보된 것들을 추가하는 것은 사실이 아닙니다.

따라서 C++를 배웠다면 C에서 프로그래밍하기 전에 꽤 많은 것을 다시 배워야 할 것입니다. (글쎄요, 여전히 iosstream과 new 대신 printf와 malloc를 사용하고 클래스와 다른 C++를 추가하면서 C++을 사용하는 방법은 일반적으로 무시됩니다.)

어떤 C++도 실제로 C의 초집합은 아닙니다.관심이 있는 경우 이 기사에서 더 광범위한 차이점 목록을 확인할 수 있습니다. http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

완전히 사실은 아닙니다.

가장 큰 "gotcha"는 타이핑입니다. C++은 C보다 훨씬 더 강력하게 타이핑되어 있으며, C++에서 이를 해결하기 위한 선호되는 방법은 C에서는 사용할 수 없습니다.즉, C(특히 포인터 유형)의 유형 간에 자동으로 캐스트할 수 있지만 C++에서는 할 수 없습니다.C++에서는 이러한 문제를 해결하기 위해 static_cast/reinterpret_cast/const_cast 방법을 사용할 것을 강력히 권장합니다.

더 중요한 것은, 만약 당신이 C++ 구문과 매너리즘을 배운다면, 당신은 아마도 C를 다루기 어렵다는 것을 알게 될 것입니다. (어떤 사람들은 이것이 좋다고 말할지도 모릅니다; 그리고 저는 C++을 선호하지만, 때때로 그것은 옵션이 아니거나, 당신은 C++이 아닌 레거시 코드를 다루어야 합니다.)다시 말씀드리지만, 가장 가능성이 높은 문제는 포인터를 다루는 것입니다(특히 char* 및 일반 배열 사용, C++에서는 std::string 및 std::vector 또는 기타 컬렉션을 사용하는 것이 더 좋습니다).

C++를 배운 다음 C와 C++의 차이점을 배우고 두 가지 모두에서 프로그래밍할 수 있습니다.하지만 그 차이는 단지 피부 깊이 이상입니다.

대부분의 목적에서 C++은 C가 하는 모든 것을 포함하고 있는 것이 사실입니다.언어 변호사들은 유효한 C이지만 유효한 C++이 아닌 매우 특별한 에지 사례가 있다는 것을 빠르게 지적할 것입니다.

그러한 예 중 하나는 C 선언일 수 있습니다.

int virtual;

즉, "가상"이라는 정수를 선언합니다."가상"은 C++의 키워드이기 때문에, 이것은 유효한 C++이 아닙니다.

C(특히 C89)와 C++의 큰 공통 코어가 있지만, C와 C++ 사이에는 분명히 차이가 있는 영역이 있습니다.분명히, C++에는 C가 가지고 있지 않은 모든 객체 지향 기능, 일반 프로그래밍, 예외 및 네임스페이스가 있습니다.그러나 C++에는 없는 C의 기능도 있습니다. 예를 들어 함수를 선언하고 정의하기 위한 (고대에 가까운) 비프로토타입 표기법을 지원합니다.특히, 다음 함수 선언의 의미는 C와 C++에서 다릅니다.

extern void function();

C++에서 이것은 값을 반환하지 않고 매개 변수를 사용하지 않는 함수입니다(따라서 부작용이 무엇이든 간에).C에서, 그것은 값을 반환하지 않지만 인수 목록에 대한 정보가 없는 함수입니다.C는 여전히 함수가 호출되기 전에 범위 내의 선언을 요구하지 않습니다(일반적으로, 함수가 변수 인수 목록을 사용하는 경우 범위 내의 선언을 가지고 있어야 하므로 다음과 같은 것이 중요합니다.#include <stdio.h>사용하기 전에printf()등).

또한 다음과 같은 차이점도 있습니다.

sizeof('c')

C++에서 답은 1입니다. C에서 답은 일반적으로 4개(8비트 문자가 포함된 32비트 시스템) 또는 심지어 8개(64비트 int가 포함된 64비트 시스템)입니다.

일반적으로 C와 C++ 컴파일러에서 컴파일되는 코드를 큰 어려움 없이 작성할 수 있습니다. 제 코드의 대부분은 항상 그렇게 합니다.예외는 제 입장에서 부주의로 인한 것이거나, 지정 이니셜라이저 등 C++ 98에 없는 C99의 좋은 기능을 의식적으로 악용했기 때문이거나,long long.

Stroust는 먼저 C를 배우는 것에 반대하는 조언을 합니다.그러나 다시, 그는 (그리고 그의 세대의 많은 다른 사람들은) C에서 시작하여 C++ 구루가 될 수 있었습니다.

저는 개인적으로 교수님의 의견에 동의하지 않습니다.

일반적으로 C++는 C를 기반으로 하며 "의미"에서 C를 포함하고 확장합니다.

하지만, 전통적으로 사람들이 C를 배웠기 때문에, C++를 올바르게 사용하려면 C 기원을 마스터해야 하기 때문에 교수님의 진술은 부정확합니다.당신에게 무언가를 가르칠 때, 당신의 교수나 교과서가 구체적으로 어떤 언어에서 왔는지에 대해 언급하지 않을 가능성이는 가능성이 있습니다.

또한 유사성에도 불구하고 모든 C 프로그램이 C++에서 동일한 방식으로 실행되는 것은 아니라는 점을 이해하는 것이 중요합니다.예를 들어, C 구조는 C++ 컴파일러에 의해 (모든 공용 클래스로) 다르게 해석됩니다.

가르칠 때는 C core를 먼저 가르치고 C++로 갑니다.

수업에 참여한 학생 중에 임베디드 소프트웨어 엔지니어가 되고 싶은 학생이 있다면 C로 프로그래밍할 수밖에 없을 것입니다( 질문과 다른 질문 참조).

물론, C++를 배운 것은 그들에게 처음부터 시작하는 것보다 덜 전환일 수도 있지만, 여전히 교수님의 진술을 거짓으로 만듭니다!

언급URL : https://stackoverflow.com/questions/145096/is-it-true-that-there-is-no-need-to-learn-c-because-c-contains-everything

반응형