Có nên học C trước khi học C ++ không? [đóng cửa]


117

Hôm nay tôi đến thăm một khoa CS của trường đại học và trong chuyến tham quan phòng thí nghiệm, chúng tôi đã ngồi chơi với nhau về một vài dự án năm cuối của sinh viên đại học. Một trò chơi đặc biệt hay - một loại trò chơi FPS. Tôi quyết định xem qua srcthư mục và thấy nó đã được thực hiện bằng C ++ (hầu hết các dự án khác là ứng dụng Java 3D).

Tôi chưa làm bất kỳ C nào trước đây nhưng tôi đã xem qua một số mã C trước đây. Từ những gì tôi thấy trong mã .cpp trong trò chơi này, nó trông không khác lắm.

Tôi quan tâm đến việc học C hoặc C ++ nhưng có thể sẽ học cái khác sau này. Có lợi thế nào để tôi học cái này trước cái kia khôngnếu có thì nên học cái nào?



7
Nó không thực sự là một bản sao. Ngầm câu hỏi này cũng yêu cầu "tôi nên học OOP hoặc lập trình thủ tục đầu tiên"
bobobobo

2
Trước khi giảm xuống các câu trả lời bên dưới (IMO họ đi trong vòng tròn), hãy cho phép tôi đưa ra một số lời khuyên: ĐÚNG : C ++ không giữ lại tất cả các tính năng và thuộc tính áp dụng cho C, do đó, ngầm định ' obsoleting ' C (Điểm phần lớn các câu trả lời bên dưới thử để làm cho). TUY NHIÊN : C không phải , không phải , KHÔNG CHẾT. Mọi người dường như nắm bắt được câu chuyện ' không cần phải học cả hai ' cho cuộc sống thân yêu, nhưng trên thực tế điều này không có cơ sở. Để mượn cú pháp có nguồn gốc từ C, C ++! = C . Biết C ++ sẽ KHÔNG giúp bạn trở thành nhà phát triển C đủ điều kiện, và tương tự, biết C sẽ KHÔNG khiến bạn trở thành nhà phát triển C ++ đủ điều kiện.
Super Cat

4
RẰNG NÓI : Không có hại gì khi học C trước khi học C ++ - Bạn càng biết nhiều, bạn càng giỏi - Nhưng ngược lại, không cần phải học C nếu mục tiêu cuối cùng của bạn là học C ++ . NẾU bạn muốn tìm hiểu C ++, đi học C ++ , và nếu bạn muốn t học C, đi học C . Cả hai đều có ưu và nhược điểm (Tính đơn giản của C và -ultra về chiều sâu- các tính năng của C ++ đều là lời nguyền và phước lành theo cách riêng của chúng) và cả hai vẫn được sử dụng cho đến ngày nay (C cho các hệ thống nhúng, Unity, PHP, v.v. - C ++ cũng cho Unity, Unreal, v.v.).
Super Cat

3
LƯU Ý: Bạn muốn học C ++? Sau đó, bỏ qua C. Bạn không cần nó. Muốn học C? Vậy thì tốt, hãy học C. Nếu bạn muốn học cả hai, thì hãy học C. trước. Cả hai đều có vị trí của mình trên thế giới, vì vậy đừng nghĩ rằng cái này là đủ cho đối phương.
Super Cat

Câu trả lời:


121

Không cần phải học C trước khi học C ++.

Chúng là các ngôn ngữ khác nhau . Có một quan niệm sai lầm phổ biến rằng C ++ phụ thuộc vào C theo một cách nào đó và không phải là một ngôn ngữ được chỉ định đầy đủ của riêng nó.

Chỉ vì C ++ chia sẻ nhiều cú pháp giống nhau và nhiều ngữ nghĩa giống nhau, không có nghĩa là bạn cần phải học C trước.

Nếu bạn học C ++, cuối cùng bạn sẽ học hầu hết C với một số khác biệt giữa các ngôn ngữ mà bạn sẽ học theo thời gian. Trên thực tế, nó là một điều rất khó để viết C ++ phù hợp bởi vì các lập trình viên C ++ trung cấp có xu hướng viết C / C ++. Điều đó đúng cho dù bạn bắt đầu với C hay bắt đầu với C ++.

Nếu bạn biết C trước, thì đó là điểm cộng tốt cho việc học C ++. Bạn sẽ bắt đầu với việc biết một chút ngôn ngữ. Nếu bạn không biết C trước thì không có ích gì khi tập trung vào một ngôn ngữ khác. Có rất nhiều sách và hướng dẫn hay có sẵn giúp bạn bắt đầu từ việc không biết gì và sẽ đề cập đến bất cứ điều gì bạn sẽ học từ C, áp dụng cho cả C ++.

Vui lòng xem thêm lý do trong câu trả lời này .


33
Tôi không thể không đồng ý hơn. Việc học C ++ trước hết tạo ra một trải nghiệm rất khó khăn khi "quay lại" với C. C là một ngôn ngữ hệ thống cơ bản, cơ bản. C ++ là một trò chơi hoàn toàn mới, cách tiếp cận bất kỳ vấn đề nào bằng cả hai ngôn ngữ sẽ rất khác nhau. Tôi đủ may mắn để mày mò C trước khi nhảy vào công việc C ++. Sau đó, tôi có thể tinh thần "bóc tách" cú pháp mà C ++ cung cấp và có thể giải quyết các vấn đề với một trong hai ngôn ngữ. Tôi rất dễ xác định C là phần "thực hiện" của cặp ngôn ngữ. Học C ++ đầu tiên sẽ khiến các lập trình viên bị nhầm lẫn và hiểu sai.
Matt Joiner

24
@Matt: Tôi đã học C ++ đầu tiên và tôi không phải là một lập trình viên sai lầm. Vì vậy, yêu cầu của bạn là không đúng, bằng chứng bằng ví dụ phản chứng Và vâng, tôi cũng có một huy hiệu vàng ở C. Sự thật của vấn đề là chúng là 2 ngôn ngữ riêng biệt và khác nhau. Bạn không cần một ngôn ngữ làm phụ thuộc để học ngôn ngữ kia. Đó chỉ là một quan niệm sai lầm ngớ ngẩn.
Brian R. Bondy

8
@Matt: Cũng từ bài viết được liên kết của tôi: Bạn nên học C ++ trước, không phải vì học C trước sẽ làm hại bạn, không phải vì bạn sẽ phải bỏ học bất cứ thứ gì (bạn sẽ không), mà bởi vì học C trước tiên chẳng có lợi gì. Dù sao thì cuối cùng bạn cũng sẽ tìm hiểu mọi thứ về C vì nó ít nhiều được chứa trong C ++.
Brian R. Bondy

11
@Matt: Tôi xin lỗi bạn vẫn chưa hiểu. Vẽ biểu đồ Venn của C và C ++ và nhìn vào các phần giao nhau. C ++ bao gồm toàn bộ vòng tròn C ++ mà bạn vẽ, không chỉ các phần không giao nhau. Nếu bạn biết C trước, tốt cho bạn, bạn có thể học C ++ nhanh hơn. Nếu bạn không tình cờ biết C trước, không có lý do gì để học nó trước. Bạn có giả định rằng mọi cuốn sách về C ++ sẽ không đề cập đến con trỏ và quản lý bộ nhớ, và các ký tự chuỗi, v.v.? Tôi sẽ ngừng thảo luận bây giờ nhưng hãy để lại ý kiến ​​đóng góp của bạn.
Brian R. Bondy

11
@Matt: làm thế nào để C dẫn đến sự hiểu biết tốt hơn về C ++? Thông thường, các lập trình viên C học C ++ cuối cùng viết mã kiểu "C với các lớp" xấu xí và dễ gặp lỗi. Tôi không nói điều này luôn xảy ra, nhưng đó là sự tiến triển tự nhiên nhất khi bắt đầu với C, bởi vì C gần với phong cách kinh khủng đó của C ++ hơn là C ++ "hiện đại".
jalf

76

Tôi thích câu hỏi này - nó giống như hỏi "tôi nên học gì trước, trượt ván hay trượt tuyết"? Tôi nghĩ nó phụ thuộc vào việc bạn muốn trượt tuyết hay trượt tuyết. Nếu bạn muốn làm cả hai, bạn phải học cả hai.

Trong cả hai môn thể thao, bạn trượt xuống một ngọn đồi trên tuyết bằng cách sử dụng các thiết bị đủ tương tự để kích động câu hỏi này. Tuy nhiên, chúng cũng đủ khác nhau để việc học cái này không giúp bạn nhiều bằng cái kia. Điều tương tự với C và C ++. Mặc dù chúng có vẻ là các ngôn ngữ đủ giống nhau về cú pháp, nhưng bộ tư duy mà bạn cần để viết mã OO và mã thủ tục là đủ khác nhau để bạn phải bắt đầu lại từ đầu, bất kể ngôn ngữ nào bạn học thứ hai.


70

Tôi đã học C trước và tôi đã tham gia một khóa học về cấu trúc dữ liệu sử dụng C, trước khi tôi học C ++. Điều này đã làm việc tốt cho tôi. Một khóa học về cấu trúc dữ liệu bằng C đã giúp tôi hiểu rõ hơn về con trỏ và quản lý bộ nhớ. Nó cũng cho thấy rõ ràng những lợi ích của mô hình hướng đối tượng, một khi tôi đã biết nó là gì.

Mặt khác, bằng cách học C trước, tôi đã phát triển một số thói quen ban đầu khiến tôi viết mã C ++ kém, chẳng hạn như sử dụng quá nhiều con trỏ (khi tham chiếu C ++ sẽ làm) và bộ tiền xử lý.

C ++ thực sự là một ngôn ngữ rất phức tạp với rất nhiều tính năng. Tuy nhiên, nó không thực sự là một tập hợp siêu của C. Thay vào đó, có một tập hợp con của C ++ bao gồm các cấu trúc lập trình thủ tục cơ bản (vòng lặp, ifs và hàm), rất giống với C. Trong trường hợp của bạn, tôi sẽ bắt đầu với điều đó, và sau đó làm việc theo cách của tôi đến các khái niệm nâng cao hơn như các lớp và mẫu.

Điều quan trọng nhất, IMHO, là được tiếp xúc với các mô hình lập trình khác nhau, như thủ tục, hướng đối tượng, chức năng và logic, ngay từ sớm, trước khi não của bạn đóng băng vào một cách nhìn thế giới. Nhân tiện, tôi cũng thực sự khuyên bạn nên học một ngôn ngữ lập trình chức năng, như Scheme. Nó thực sự sẽ mở rộng tầm nhìn của bạn.


18

Nếu bạn quyết định học cả hai (và như những người khác đã đề cập, không cần phải học rõ ràng cả hai), hãy học C trước. Đi từ C sang C ++ giống như một sự tiến triển tự nhiên; đi theo hướng khác có cảm giác như cố tình trói một tay sau lưng. :-)


13

Tôi nghĩ bạn nên học C trước, vì tôi đã học C trước. C đã cho tôi hiểu rõ về cú pháp và hiểu biết về những thứ như con trỏ, tất cả đều chảy vào C ++.

Tôi nghĩ rằng C ++ giúp bạn dễ dàng tổng hợp tất cả các gotchas đó (cần một mảng không bị tràn khi bạn sử dụng toán tử [] và một chỉ số tinh ranh? Chắc chắn, hãy tạo một lớp mảng có kiểm tra giới hạn) nhưng bạn cần biết những gì và bị chúng cắn trước khi bạn hiểu tại sao mọi thứ được thực hiện theo những cách nhất định.

Khi tất cả được nói và làm xong, cách C ++ thường được dạy là "C ++ là C với các đối tượng, đây là C với các đối tượng và đây là cách tất cả những thứ OO này hoạt động", vì vậy bạn có thể học C cơ bản trước bất kỳ C ++ thực nào nếu bạn theo hầu hết các văn bản.


Tôi không đồng ý. Bất kỳ thành C ++ lập trình cuốn sách trị giá muối của nó sẽ bao gồm ít nhất một số các "gotchas", chẳng hạn như làm thế nào các mảng công việc (và làm thế nào để ngăn chặn tràn)
moonman239

11

Tôi sẽ không đồng ý với đa số ở đây. Tôi nghĩ bạn nên học C trước khi học C ++. Nó chắc chắn là không cần thiết, nhưng tôi nghĩ nó làm cho việc học C ++ dễ dàng hơn rất nhiều. C là trung tâm của C ++. Bất cứ điều gì bạn học về C đều có thể áp dụng cho C ++, nhưng C nhỏ hơn và dễ học hơn rất nhiều.

Chọn K&R và đọc qua đó. Nó ngắn gọn và sẽ cung cấp cho bạn cảm giác đầy đủ về ngôn ngữ. Khi bạn đã nắm được thông tin cơ bản về con trỏ và lệnh gọi hàm, bạn có thể chuyển sang C ++ dễ dàng hơn một chút.


15
Sai lầm. Khá nhiều thứ mà C dạy bạn là một thực hành không tốt trong C ++. C không phải là trung tâm của C ++, nó chỉ xảy ra để chia sẻ rất nhiều cú pháp. Xin thưa, thế giới đã có quá đủ các lập trình viên "C with class" rồi. Học C hoặc C ++. Nhưng đừng giả vờ rằng C là một C ++ lite.
jalf

13
Tôi đứng trước lời nói của tôi. C ++ được xây dựng dựa trên C và do đó C là trung tâm của nó. Các thành ngữ được sử dụng trong C ++ khác nhiều so với các thành ngữ được sử dụng trong C, nhưng cú pháp thì giống nhau. Người ta có thể học cách lập trình C ++ phù hợp bắt đầu bằng C. Nhìn vào C ++ Primer. Về cơ bản nó làm được điều đó.
Steve Rowe

6
+1. C là một ngôn ngữ nhỏ hơn, do đó dễ học hơn. Việc cố gắng tương thích ngược với C là một trong những vấn đề chính của C ++, một nguyên nhân khác là hệ thống khuôn mẫu quá phức tạp đối với 90% lập trình viên C ++ sử dụng.
hillu

1
Sự hiểu biết về các biến, kiểu [bao gồm con trỏ và trình độ], phạm vi, chức năng, bộ tiền xử lý và liên kết là điều cần thiết cho cả C và C ++. Tôi có thể nói học những khái niệm này với C sẽ dễ dàng hơn để bạn không còn phải đối phó với các lớp biết, một ý nghĩa của static, các mẫu (và các lỗi mẫu ridiculously đáng sợ rằng trình biên dịch phát ra) vv
dreamlax

1
Bạn có lý. Trên thực tế, có thể tốt khi học C để sau đó bạn có thể chuyển sang C ++ với kiến ​​thức tốt hơn về gốc rễ của nó.
Daniel Daranas

10

Trong quá trình học C ++, bạn cũng sẽ học hầu hết C. Nhưng hãy nhớ rằng rất nhiều mã C ++ không hợp lệ C. C ++ được thiết kế để tương thích với mã C, vì vậy tôi muốn nói rằng hãy học C ++ trước. Brian đã viết một câu trả lời tuyệt vời về điều này.


8

Học C buộc bạn phải suy nghĩ nhiều hơn về một số vấn đề như quản lý bộ nhớ rõ ràng và ẩn hoặc kích thước lưu trữ của các kiểu dữ liệu cơ bản tại thời điểm bạn viết mã của mình.

Khi bạn đã đạt đến điểm mà bạn cảm thấy thoải mái về các tính năng và lỗi sai của C , bạn có thể sẽ ít gặp khó khăn hơn khi học và viết bằng C ++.

Hoàn toàn có thể là mã C ++ bạn đã thấy trông không khác nhiều so với C tiêu chuẩn, nhưng đó cũng có thể là do nó không hướng đối tượng và không sử dụng các ngoại lệ, hướng đối tượng, mẫu hoặc các tính năng nâng cao khác.


8

Không.

Nói chung, sẽ hữu ích hơn khi học C ++ vì nó gần với các ngôn ngữ dựa trên OO hiện đại nhất, như Eiffel hoặc C #.

Nếu mục tiêu của bạn là học C ++, hãy học C ++ chuẩn, hiện đại ngay từ đầu. Để các mallocs sang một bên.


Nhưng Steve Rowe có lý ...


C ++ ngày nay không gần với các ngôn ngữ OO như C # hay Eifel.
einpoklum

7

Giống như câu trả lời cho nhiều câu hỏi khác trong cuộc sống, nó phụ thuộc. Nó phụ thuộc vào sở thích và mục tiêu lập trình của bạn là gì. Nếu bạn muốn lập trình các ứng dụng máy tính để bàn, có lẽ với GUI, thì C ++ (và OOP) có lẽ là cách tốt hơn để thực hiện. Nếu bạn quan tâm đến việc lập trình phần cứng trên một thứ khác ngoài chipset x86, thì C thường là lựa chọn tốt hơn, thường là vì tốc độ của nó. Nếu bạn muốn tạo trình phát đa phương tiện mới hoặc viết ứng dụng kinh doanh, tôi sẽ chọn C ++. Nếu bạn muốn thực hiện các mô phỏng khoa học về va chạm thiên hà hoặc động lực học chất lỏng, hãy xem sức mạnh của C.


4
Trong nhiều kịch bản tính toán hiệu suất cao, vài trăm chu kỳ đồng hồ đó thực sự quan trọng.
Scottie T

1
@ScottieT: Cho rằng ngoài mã restrictđịnh nghĩa C không có cấu trúc cú pháp / ngữ nghĩa nào khác liên quan đến hiệu suất hơn C ++, vậy tại sao bạn lại nghĩ chính xác mã C ++, với cú pháp phong phú hơn và ví dụ như lập trình meta sẽ mang lại mã chậm hơn? Bạn có biết các mẫu biểu thức không?
Sebastian Mach

1
@phresnel: Mức độ liên quan. C ++ là một ngôn ngữ cực kỳ phức tạp với các tính năng thường không đáng để mua. Theo nguyên tắc chung, C mang lại cơ hội hiệu suất tương tự như C ++ với chi phí phức tạp nhỏ hơn đáng kể.
Matt Joiner

1
@MattJoiner: Khả năng duy trì / Khả năng mở rộng cũng là các yếu tố hiệu suất, mặc dù tôi nhận ra rằng mã khoa học thường là một lần. Tuy nhiên, lặp lại đối số biểu thức-mẫu-(làm ví dụ), tôi nói rằng C ++ có nhiều cơ hội tối ưu hóa hơn, (cũng bởi vì nó dễ viết mã biểu thức-mẫu hơn mã nội tại), với một ngoại lệ ( restricttuy nhiên tất cả các trình biên dịch C ++ chính đều cung cấp dưới dạng phần mở rộng). Và bạn có thực sự nghĩ rằng, với cùng một đoạn mã, sẽ có bất kỳ sự khác biệt nào về hiệu suất giữa C ++ và C, với cùng một trình biên dịch? [...]
Sebastian Mach

1
@MattJoiner: [...], và khi đọc những câu như "tôi không thích C ++" cho phép tôi xây dựng giả định rằng bạn hơi thiên vị trong cuộc thảo luận này. Chính xác thì bạn nghĩ điều gì khiến mã C ++ hoạt động kém hơn? Nếu C có các cơ hội hiệu suất như nhau , thì các mẫu biểu thức, mẫu nói chung, các phép tính thời gian biên dịch trên các kiểu dữ liệu không nội tại, các hàm tương đương là gì? Và thêm yếu tố chi phí / khả năng bảo trì: RAII, quá tải toán tử / hàm, vùng chứa tiêu chuẩn chung, luồng tiêu chuẩn, thuật toán tiêu chuẩn chung, tài liệu tham khảo?
Sebastian Mach

7

Tôi nghĩ học C trước là một ý kiến ​​hay.

Có một lý do tại sao các khóa học khoa học kỹ thuật vẫn sử dụng C.

Theo ý kiến ​​của tôi, nó để tránh tất cả sự "đông đúc" của đối tượng mà nghĩa vụ yêu cầu OOP thực hiện.

Tôi nghĩ rằng lập trình thủ tục là cách tự nhiên nhất để học lập trình đầu tiên. Tôi nghĩ điều đó đúng bởi vì vào cuối ngày đó là những gì bạn có: các dòng mã thực thi nối tiếp nhau.

Nhiều văn bản ngày nay đang thúc đẩy phương pháp tiếp cận "đối tượng trước tiên" và bắt đầu nói về ô tô và sang số trước khi chúng giới thiệu mảng.


4
Có vẻ như nhiều khóa học comp sci ngày nay sử dụng Java, điều này làm trầm trọng thêm vấn đề bạn đang đề cập.
Dima 13/07/09

2
Bạn rất có lý. Ngoài việc quá phức tạp đối với một ngôn ngữ thứ nhất, phần lớn C ++ khuyến khích việc che giấu sự tương tác ở mức độ thấp với hệ điều hành và bộ nhớ là yếu tố quan trọng đối với học phí khoa học máy tính tốt. Mảng nên được dạy trước các đối tượng rất lâu.
Matt Joiner

1
Mặt khác, nếu bạn không giỏi toán, lập trình hàm có thể tự nhiên hơn, vì nó trông giống và cảm thấy và hoạt động quen thuộc hơn.
Sebastian Mach

2
"Có một lý do tại sao các khóa học khoa học kỹ thuật vẫn sử dụng C." Vâng, bởi vì hầu hết các khóa học khoa học tổng hợp được giảng dạy kém.
Lightness Races in Orbit,

6

Sau khi quan sát mọi người, những người đã học Java đầu tiên, vật lộn với các khái niệm về con trỏ và quản lý bộ nhớ trong C ++, tôi muốn nói rằng học C trước là một ý tưởng hay, để nắm được hai khái niệm này, tách biệt khỏi sự phức tạp của các C ++ khác đặc trưng.


5

Theo quan điểm của tôi:

Tôi khuyên bạn nên học C trước, bởi vì:

  • nó là một ngôn ngữ cơ bản - rất nhiều ngôn ngữ bắt nguồn từ C
  • nhiều nền tảng hỗ trợ trình biên dịch C hơn C ++, - có thể là hệ thống nhúng, chip GPU, v.v.
  • theo TIOBE chỉ số C vẫn phổ biến hơn C ++ khoảng 2 lần.

3

Tôi nghĩ c là một ngôn ngữ lập trình rất hay, nó nhỏ gọn và dễ học. nhưng nếu bạn chỉ muốn học c ++, hãy bắt đầu với c ++. nhưng tôi khuyên bạn nên học cả hai. và nếu bạn muốn làm điều đó; tôi nghĩ tốt hơn là nên bắt đầu bằng c. như đã nói trước đây: nó nhỏ và hơi dễ học. có thể là một bước tiến tốt đẹp cho một ngôn ngữ lập trình phức tạp hơn như c ++. (vì c cung cấp cho bạn một số điều cơ bản)

chúc may mắn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.