Có ổn không nếu tôi không biết C nhưng tôi tốt với C ++? [đóng cửa]


23

Tôi có một câu hỏi mà tôi nghĩ có thể được trả lời tốt nhất ở đây.

Tôi khá giỏi C++, tốt vì tôi cảm thấy thoải mái với ngôn ngữ, tôi đã đọc Accelerated C++và thực hiện gần như tất cả các bài tập.

Tuy nhiên, tôi có một vấn đề lớn. Tôi có cần học Ckhông? Tôi chưa bao giờ làm Ctrong đời. Tôi chỉ bắt đầu với C++khi tôi bắt đầu với lập trình. Có lẽ vì tôi luôn quan tâm đến việc tại sao mọi người gọi ngôn ngữ này quá phức tạp. Bây giờ mặc dù tôi biết câu trả lời cho câu hỏi đó;)

Tôi đặc biệt quan tâm đến việc liệu tôi có thể sống sót mà không biết Ctrong thế giới ngày nay. Giống như nếu tôi trả lời phỏng vấn trong một công ty, nếu tôi nói với họ rằng tôi không biết C- liệu họ có đồng ý không? Hai ngôn ngữ tôi hợp với là Python và C ++. Tôi đang hỏi nguyên nhân này Tôi đã nghe nói rằng các công ty yêu cầu cấu trúc dữ liệu trong các cuộc phỏng vấn. Vì vậy, nếu họ yêu cầu tôi thực hiện nó, và nếu tôi làm điều đó trong C ++, điều đó có được chấp nhận không?

Và những người nói 'làm sao bạn không thể biết C khi bạn C ++', xin đừng trả lời :) Không xúc phạm, nhưng tôi không hiểu tại sao học C là điều kiện tiên quyết.



1
Bài báo được trích dẫn bởi DumbCoder là về sự phổ biến của C trong lập trình nhúng.
ChrisW

2
@ChrisW - Đúng, nhưng nó vẫn cho thấy C không dễ làm chủ, không phải C ++ dễ làm chủ.
DumbCoder

@DumbCoder: Oh noes, lập trình nhúng. Có bao nhiêu công việc được nhúng so với máy tính để bàn?
DeadMG

@DeadMG - Nắm vững một ngôn ngữ không liên quan gì đến việc có bao nhiêu công việc có sẵn cho ngôn ngữ đó. Và bạn lấy ý tưởng rằng C chỉ được sử dụng trong lập trình nhúng ở đâu?
DumbCoder

Câu trả lời:


36

Nếu bạn biết C ++, tôi sẽ không học C chỉ vì lợi ích của nó. Bạn không nên thấy quá khó để học nếu và khi nào bạn cần.

Tôi thà gặp một người tuyên bố họ biết C ++ chứ không phải C hơn ai đó tuyên bố họ biết C / C ++.


Ồ vâng. Đây là danh sách vật phẩm đầu tiên trong câu hỏi SO về huyền thoại đô thị C ++: stackoverflow.com/questions/2245196/c-urban-myths

4
+1. Nếu bạn biết C ++, để bắt đầu, việc học C, và thứ hai, nó thực sự không quan trọng.
DeadMG

6
@DeadMG Có thể dễ dàng học cú pháp, vì đó chỉ là biết những phần nào của C ++, nhưng học các thành ngữ phổ biến thì khó hơn, và được cho là phần quan trọng nhất. Tôi sẽ không học C trừ khi cần.
KeithB

6
@chubsdad ý bạn là tôi không nên đặt "Tôi biết Java / Javascript" vào CV của mình?
Ẩn danh

@ user257493: Không có thứ gì như Java / Javascript
John Dibling

23

Một câu trả lời đa phần. Ý kiến ​​của tôi thôi.

  1. Kinh nghiệm của tôi (25 năm học đại học) là C ++, trong khi ngày càng không phổ biến, sẽ tiếp tục là yếu tố sống còn đối với các hệ thống thú vị trong tương lai gần. Vì vậy, tôi gắn bó với điều đó như là lĩnh vực chuyên môn chính của tôi. Công việc khó khăn, thú vị và quan trọng.

  2. Các lập trình viên C ++ nói chung có giá trị chính xác bởi vì họ không lớn lên trên các ngôn ngữ được quản lý và do đó có nhiều khả năng hiểu những gì đang diễn ra dưới vỏ bọc. Việc chuyển đổi từ C ++ sang C # / Java dễ dàng hơn ngược lại vì thanh cho mục nhập cao hơn.

  3. Vì vậy, theo quan điểm của tôi, không cần thiết phải hiểu C để lập trình thành thạo C ++, phát triển sự hiểu biết tại sao C ++ tồn tại trong bối cảnh của C - những hạn chế và điểm mạnh của nó và cách chúng được giải quyết hay không trong C ++ - sẽ là vô giá với bạn theo thời gian.

May mắn nhất.


Điều gì khiến bạn nói rằng C ++ ngày càng không phổ biến? Theo kinh nghiệm của bạn, điều gì đang thay thế nó?
Praxeolitic


13

Đây là những gì Bjarne nói:

Biết C là điều kiện tiên quyết để học C ++, phải không?

Sai rồi. Tập hợp con phổ biến của C và C ++ dễ học hơn C. Sẽ có ít lỗi loại hơn để bắt bằng tay (hệ thống loại C ++ chặt chẽ hơn và biểu cảm hơn), ít thủ thuật hơn để học (C ++ cho phép bạn diễn đạt nhiều thứ hơn mà không cần cắt ngang) và các thư viện tốt hơn có sẵn. Tập hợp con ban đầu tốt nhất của C ++ để học không phải là "tất cả của C".


4

Chỉ là ý kiến ​​cá nhân của tôi: nếu bạn biết C ++, bạn có thể viết bằng C. Một số kinh nghiệm sẽ rất hay, nhưng đây không phải là vấn đề. Điều ngược lại là không đúng: Kiến thức C không cho phép viết bằng C ++, mà không cần học thêm. Tôi chưa bao giờ học C, và sử dụng nó khi cần thiết, không có vấn đề gì.


3
@Alex Farber - "Nếu bạn biết C ++, bạn có thể viết bằng C". Tôi rất nghi ngờ điều đó :)
DumbCoder

4
Không đồng ý. IME, các lập trình viên học C ++ trước tiên có xu hướng không nhận ra những tính năng C ++ mà C không có. Các lập trình viên học C trước có thể dễ dàng viết bằng C ++, nhưng bắt đầu không thành ngữ.
dan04

1
Điều này dựa trên kinh nghiệm cá nhân của tôi. Tôi đã học C ++ và thực hiện hầu hết công việc của mình trong C ++. Nhưng tôi sử dụng C khi cần thiết, không có vấn đề gì.

Đặc biệt là tất cả các lib lớp dễ thương không có sẵn trong C. Imo phần thắng của các ngôn ngữ như C ++ và Java là các lib, không phải là các tính năng ngôn ngữ vốn có.

8
Các lập trình viên C ++ cố gắng hack theo cách của họ thông qua C viết mã xấu vì cùng lý do tại sao các lập trình viên C cố gắng hack theo cách của họ thông qua C ++ viết mã xấu. Những người C sử dụng C ++ là "C với các lớp" trong khi những người C ++ sử dụng C là "C ++ không có lớp".
John Dibling

4

Được rồi, điều đầu tiên trước tiên - không, biết C không phải là điều kiện tiên quyết để học C ++. Thật vậy, nó có thể là một trở ngại.

Thứ hai, điều này là hoàn toàn tình huống. Việc bạn có cần biết C hay không hoàn toàn phụ thuộc vào việc công việc có yêu cầu hay không. Nếu bạn muốn trở thành một anh chàng hệ thống nhúng thì có, học C sẽ giúp ích. Mặt khác, hầu hết các công việc không yêu cầu nó. Nếu một công việc cần C thì nên nói như vậy. Nếu nó không nói như vậy, có lẽ nó không cần nó. Liên quan đến các cấu trúc dữ liệu, một lần nữa nó đến với công ty. Thông thường một công ty sẽ nói "Chúng tôi lập trình bằng các ngôn ngữ này, viết cho chúng tôi cấu trúc dữ liệu này. Sử dụng ngôn ngữ bạn chọn từ danh sách trên." Nếu họ yêu cầu bạn viết nó bằng C, bạn chỉ cần nói "Tôi không biết C - nó không nói trong lý lịch của tôi rằng tôi biết C, công việc này không dành cho tôi."


Tại sao biết C là một trở ngại cho việc học C ++? Tôi không nói rằng tôi không đồng ý nhất thiết, nhưng đây là một tuyên bố táo bạo.
Casey Patton

3

Giống như nếu tôi trả lời phỏng vấn trong một công ty, nếu tôi nói với họ rằng tôi không biết C - liệu họ có đồng ý không?

Hỏi xem họ có cần C không (và có sẵn sàng học nó hay không nếu họ làm).

Vì vậy, nếu họ yêu cầu tôi thực hiện nó, và nếu tôi làm điều đó trong C ++, điều đó có được chấp nhận không?

Tôi sẽ mong đợi như vậy, nếu họ đang phỏng vấn / thuê bạn làm việc trong C ++.

Nếu đó là câu hỏi về "cấu trúc dữ liệu", bạn có thể hỏi họ xem họ có muốn bạn chứng minh bằng cách sử dụng bộ chứa STL không, hoặc liệu (vì đó là một cuộc phỏng vấn) họ muốn bạn thực hiện cấu trúc dữ liệu từ đầu.


2

C gần như là một tập con thích hợp của C ++. Nếu bạn không biết C, thì bạn không biết một tập hợp con lớn và quan trọng của C ++. Bạn phải học tập con này không? Không. C ++ là một ngôn ngữ lớn một cách lố bịch và hầu hết mọi người chọn một tập hợp con và chương trình với điều đó. Bạn không cần phải biết tập hợp con đó là C. Đặc biệt, việc biết thư viện chuẩn C không quan trọng lắm. Tuy nhiên, tôi sẽ đưa ra một con mắt rất đáng nghi đối với bất kỳ ai không hiểu các khái niệm C cốt lõi như con trỏ, mảng và bit twiddling.


2

Tôi có cần học C không?

Không, bạn không cần. Giai đoạn.

Nhưng học bất kỳ ngôn ngữ lập trình mới nào cũng có lợi về lâu dài. Học ngôn ngữ dựa trên các mô hình lập trình khác nhau thậm chí còn có lợi hơn. Cho dù đó là ngôn ngữ OOP (Smalltalk hay C ++), ngôn ngữ động (Lisp, Clojure, Python), chức năng (Lisp, Haskell, Erlang), đồng thời (Erlang, Go, Algol 68, Smalltalk) hoặc bất cứ điều gì (Fortran 03, Perl, Forth) răng nanh mới khác mô hình tấn công ưa thích của bạn; học các ngôn ngữ khác nhau giúp bạn tiếp xúc với nhiều dòng suy nghĩ, mỗi dòng có điểm mạnh và điểm yếu riêng để giải quyết công việc trong tay.

Fortran vẫn chiếm ưu thế trong điện toán số, COBOL vẫn là trụ cột tại các công ty bảo hiểm lớn, Unix, BSD và Linux vẫn chủ yếu dựa vào C. Mã cũ không mất giá trị theo tuổi bởi vì nó không nhất thiết bị hao mòn giống như các thiết bị cơ khí cần được thay thế theo thời gian. Vì vậy, ngôn ngữ cũ hơn có thể có giá trị về khả năng tuyển dụng so với yếu tố tuyệt vời của ngôn ngữ mới hơn .

Giống như việc học để trở thành đa ngôn ngữ trong ngôn ngữ tự nhiên (con người) có thể cải thiện khả năng thể hiện bản thân của bạn , cùng một loại tiền thưởng cho ngôn ngữ máy tính.

Vì vậy, trong khi tôi nghĩ điều quan trọng (theo thời gian) là học để trở nên thông thạo không chỉ bằng nhiều ngôn ngữ, mà điều quan trọng hơn là phải thông thạo nhiều mô hình lập trình.

Tôi khá giỏi với C ++, tốt vì tôi cảm thấy thoải mái với ngôn ngữ này, tôi đã đọc Tăng tốc C ++ và thực hiện hầu hết tất cả các bài tập

Tôi sẽ sao lưu và nói rằng C ++ là một ngôn ngữ phong phú và phức tạp, sẽ phải mất nhiều năm tiếp xúc và thực hành liên tục để trở nên thực sự thông thạo tất cả các phần phụ (hoặc xấu) của nó.

Hãy dành thời gian của bạn, và tiếp tục học hỏi là lời khuyên quan trọng nhất tôi có thể cung cấp cho bạn. Đối với người khác đảm nhận, tôi khuyến khích bạn đọc Lập trình tự dạy của Peter Norvig trong mười năm .


1

Một câu trả lời rất ngắn cho câu hỏi của bạn là: nó phụ thuộc nhiều vào nhu cầu của bạn. Một số công ty chủ yếu dựa vào C, đôi khi là một di tích (nếu C đã được sử dụng trong nhiều năm ở đó). Các công ty khác không liên quan gì đến C. C là ngôn ngữ cấp thấp hơn so với Python hay Java và nhiều chương trình ứng dụng có thể không yêu cầu bất kỳ kiến ​​thức nào về C. Không giống như các ngôn ngữ OOP, C yêu cầu một khung suy nghĩ khác Tôi có nghĩa là các chương trình được cấu trúc và tổ chức khác nhau, và một số khía cạnh sắc thái hơn phải được xem xét. Nói chung là có ích khi học thành ngữ đó, thậm chí chỉ đơn giản là để mở rộng tâm trí của bạn, để nói. Nhưng một lần nữa, liệu các công ty sẽ quan tâm phụ thuộc vào nhu cầu của họ. Một số có thể cung cấp cho bạn một sự lựa chọn về ngôn ngữ, một số có thể yêu cầu Java, một số khác là C ++, một số khác vẫn là C, v.v. Bạn có thể tồn tại không? Vâng - hôm nay ' Thế giới có rất nhiều lĩnh vực lập trình khác nhau mà bạn thậm chí không bao giờ vượt qua được bằng mã C. Bạn có nên học C không? Tôi muốn nói - có, bất kể sử dụng sau này.


1

Một số người có thể không cảm thấy thoải mái khi lập trình trong C khi biết C ++.

Có một cấu trúc "bảo vệ" xung quanh C ++, góp phần thúc đẩy không chỉ cấu trúc mà còn cả các thuật toán của một chương trình. Ví dụ, sự trợ giúp của cấu trúc và thuật toán STL, cách tiếp cận lập trình hướng đối tượng rõ ràng, con / hàm hủy, lớp trừu tượng được thêm vào đến từ các mẫu ...

Trong khi C - nói - đơn giản hơn, nó buộc người lập trình phải tự mình đưa một cấu trúc và thuật toán vào mô hình hóa vấn đề. Đây là một sự gia tăng mạnh mẽ của tự do lập trình.
Nhưng nó có chi phí, vì một số người cần cấu trúc áp đặt nhiều hơn và xây dựng một chương trình có xu hướng khó duy trì theo cấp số nhân hơn khi nó lớn hơn. Tôi thường nói rằng vấn đề không phải là ngôn ngữ (C) mà là những gì người ta làm với nó.

Điều này được nói, với tư cách là một nhà tuyển dụng, tôi rất vui khi được phỏng vấn ai đó có kỹ năng C ++ mạnh mẽ, nhưng sẽ nhiệt tình hơn nữa nếu cô ấy có đủ tự chủ ngôn ngữ để phát triển toàn bộ dự án C.

Ngoài ra, một chương trình C tốt bao hàm các kỹ năng hệ thống của nhà phát triển tốt, vì ngôn ngữ đòi hỏi (thường) một sự hiểu biết công bằng về các thành phần hệ thống để xây dựng một chương trình hiệu quả.


Tôi sẽ không nói rằng nó làm tăng sự tự do của lập trình viên - bạn luôn có thể viết cấu trúc và thuật toán của riêng bạn trong C ++.
DeadMG

0

Nếu bạn cảm thấy thoải mái với C ++, tôi sẽ không lo lắng về việc học C. C ++ có nhiều cải tiến so với C (khả năng hỗ trợ RAII với các hàm tạo / hàm hủy, các đường cơ sở, luồng và chuỗi là lớn).

Tuy nhiên tôi sẽ đề nghị tìm hiểu printfscanfchuỗi các hàm để bạn có thể ĐỌC mã sử dụng chúng. Chúng khá phổ biến trong C ++ vì vậy biết cách chúng được sử dụng là hữu ích. Tôi không đề xuất sử dụng chúng trong mã của riêng bạn mà không có lý do rất cụ thể.


0

Lần duy nhất bạn cần biết C là nếu bạn dự kiến ​​sẽ tạo mã C. Nếu không, thì không có vấn đề gì.

Tôi đã không viết C chuyên nghiệp trong 6 năm qua hoặc lâu hơn; có rất nhiều miền ứng dụng được phục vụ tốt hơn bởi các ngôn ngữ khác (ít nhất là từ quan điểm năng suất, nếu không phải là hiệu suất) như Java hoặc C # hoặc Python. Bạn chắc chắn có thể tồn tại và thậm chí phát triển như một nhà phát triển phần mềm mà không cần chạm vào C.

Nếu bạn muốn học C để giải trí, điều đó tốt thôi. Tùy thuộc vào cách bạn học C ++ và mức độ tin cậy của bạn đối với C ++ - các tính năng cụ thể (mẫu, kiểu tham chiếu, STL, quá tải), bạn có thể bỏ qua một chút khi bạn nhận ra rằng 90% công cụ giúp lập trình có thể chấp nhận được không còn nữa. Những thứ như quản lý bộ nhớ trong C rất tốn công và tẻ nhạt so với C ++ hoặc Java. Cũng có một số điểm không tương thích giữa C và C ++, và với mỗi phiên bản ngôn ngữ mới, khoảng cách sẽ ngày càng lớn.

Vẫn có các miền ứng dụng trong đó C là công cụ phù hợp cho công việc: nhỏ, nhanh, không có nhiều phép thuật, và nó không phải là lắp ráp. Nhưng để phát triển ứng dụng chung (đặc biệt là các ứng dụng máy tính để bàn điều khiển GUI), có sẵn các công cụ tốt hơn nhiều.


-1

Tôi nghĩ rằng nếu bạn cảm thấy thoải mái với C ++, bạn cũng sẽ như vậy với C.

Sự khác biệt chính giữa cả hai là C ++ sạch sẽ - hướng đối tượng - C không :)


1
Tôi là một fan hâm mộ lớn của C ++, nhưng tôi sẽ không gọi nó là sạch. Và C ++ là đa mô hình, có nghĩa là mã C ++ tốt không nhất thiết phải hướng đối tượng.
KeithB

-1

Biết C sẽ cung cấp cho bạn cái nhìn sâu sắc hơn về quản lý bộ nhớ, v.v. Đó là tất cả về mức độ bạn muốn đạt được, và liệu việc hiểu mọi thứ ở mức thấp hơn có giúp bạn hay không. Bạn có thể tiến thêm một bước và học ngôn ngữ lắp ráp, nhưng tất cả phụ thuộc vào giá trị của nó đối với bạn.

Nó cũng phụ thuộc vào việc bạn có muốn lập trình bằng C hay không. :)


-1

Được, nó ổn...

IMHO, vì bạn giỏi C++, thực sự là đủ ...

Tôi cá là có những ngành đang tìm kiếm lập trình viên C ++ ... Nhưng một khi bạn đã tham gia vào nó, tất cả phụ thuộc vào nhu cầu dự án của bạn .. Bất cứ điều gì nó đòi hỏi bạn có thể phải học .. Đó có thể là Java, .Net hoặc thậm chí C .. Nếu công ty sẵn sàng trả tiền cho bạn, chỉ cần tìm hiểu ...

Nếu bạn đang ở giai đoạn đầu của sự nghiệp, những người phỏng vấn IME có xu hướng nhìn vào thái độ của bạn và sự hiểu biết về ngôn ngữ mà bạn cảm thấy thoải mái ..

Thay vì học Cvì lợi ích, hãy tìm hiểu C ++ một chút kỹ lưỡng .. Cải thiện những gì bạn giỏi .. Tôi chắc chắn bạn có thể phải học rất nhiều ... Đối với tôi, luôn có điều gì đó trong C ++ để học ..: )


-1

Tôi nghĩ rằng những điều quan trọng nhất để bạn biết về C là sự khác biệt giữa C và C ++. Bạn có thể sẽ thấy một số mã có một số phong cách C trong đó tại một số điểm, và bạn không nên nhầm lẫn khi bạn nhìn thấy những thứ như malloc, free, printf, fopen, hoặc fclose. Bạn cũng nên biết chúng giống nhau như thế nào cũng như chúng khác với các đối tác C ++ của chúng như thế nào.

Bạn cũng nên biết rằng <<>>là toán tử dịch chuyển trái và phải, không phải toán tử chèn. Trong C ++, nơi bạn có thể quá tải toán tử, chúng đã bị quá tải để thực hiện chèn luồng và những thứ tương tự, nhưng chúng vẫn được sử dụng để thay đổi số nguyên.

Hãy chắc chắn rằng bạn hiểu tất cả các tính năng cơ bản mà C ++ không có trong C. Nếu bạn đọc stackoverflow.com đủ, bạn sẽ thấy nhiều câu hỏi liên quan đến sự khác biệt trong ngôn ngữ và sự hiểu lầm của mọi người về chúng.

Bạn cũng nên tự làm quen với bộ tiền xử lý C, gần giống với (và thường là cùng một chương trình với) bộ tiền xử lý C ++. Biết cách sử dụng nó sẽ giúp bạn trong C ++, nhưng nó phụ thuộc rất nhiều vào C.

Một điều lớn khó giải quyết trong C mà C ++ có là các hàm hủy. Những thứ đó có thể được gọi ở khắp mọi nơi, đảm nhiệm việc giải phóng tài nguyên, nhưng trong C, bạn phải làm tất cả những điều đó rõ ràng hơn. Điều này là dễ dàng cho các lập trình viên C ++ để quên làm.

Theo như các cuộc phỏng vấn, nếu ai đó yêu cầu bạn viết mã cho một số thuật toán chung trong C và bạn làm một cái gì đó như:

struct foo {
       int a;
       void * b;
};
foo x;  // in C++ this would work, but in C it would fail because struct names aren't in the
        // type name table unless you put them there with typedef

Tôi không nghĩ rằng họ sẽ quyết định rằng bạn không biết bạn đang làm gì vì bạn đã không làm:

struct foo x;

Và họ thực sự không quan tâm nếu bạn sử dụng couttrừ khi những gì họ đang cố gắng để bạn giới thiệu là khả năng xử lý đầu vào và đầu ra của bạn, điều này giúp C ++ dễ dàng hơn cho các trường hợp phổ biến.

Nếu bạn thấy mình ở vị trí được phỏng vấn cho một công việc yêu cầu C, bạn nên thẳng thắn về sự thiếu hiểu biết về C bên ngoài sự chồng chéo của nó với C ++. Họ có thể sẽ hiểu rằng một lập trình viên giỏi sẽ có thể thực hiện quá trình chuyển đổi sang C từ C ++ khá nhanh.

Tất cả điều đó đang được nói, C không phải là một ngôn ngữ lớn. Thư viện tiêu chuẩn nhỏ hơn nhiều so với C ++ và việc làm quen với những phần phổ biến nhất của nó không phải là vấn đề lớn, vì vậy việc tìm hiểu nó thực sự không hại gì.

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.