cách thực hành để học C? [đóng cửa]


10

Tôi muốn đào sâu vào C và thông thường khi tôi muốn học một ngôn ngữ mới, tôi nghĩ đến một mục tiêu dự án đơn giản / có thể đạt được có mục đích thực tế (sử dụng api, tự động hóa một nhiệm vụ, v.v ...)

Tôi đang gặp khó khăn hơn khi tìm đến C cho C chủ yếu vì mọi thứ tôi đọc đều chỉ ra thực tế rằng việc sử dụng chính của C hiện tại là trong các hệ thống nhúng và các dự án phần mềm phức tạp hơn như hệ điều hành.

Điều này cho tôi thấy thực tế là tôi không cần phải học nó hay tôi chỉ cần thêm một chút bối rối trong chiến lược học tập của mình?

Tài liệu tham khảo tài nguyên học tập thực tế? (hướng dẫn / cách tạo ra kết quả cuối cùng có mục đích / lợi ích nào đó)


3
Bạn sẽ nhận được câu trả lời hợp lý hơn nếu bạn có thể cho chúng tôi biết TẠI SAO bạn muốn học C?
zvrba

2
Tôi đồng ý với zvrba. C là tuyệt vời cho các công cụ cấp thấp, nhanh chóng và mã trình điều khiển. Nếu bạn đang viết mã cho các trò chơi, điều đó cũng thật tuyệt (mặc dù, có lẽ bạn sẽ làm việc với các lập trình viên C ++, những người sẽ phàn nàn với bạn vì đã viết mã "không chuẩn"). Mặc dù vậy, tôi cảm thấy rằng Hội và C giống với tiếng Latin (trong ngôn ngữ nói), họ không phải là người đầu tiên, nhưng hầu hết những người đến sau họ đã sử dụng các ý tưởng và cấu trúc từ họ để tạo ra ngôn ngữ của họ. Do đó, học C MIGHT cho bạn hiểu rõ hơn về các ngôn ngữ cấp cao hơn
Jamie Taylor

Bạn đã xem Zed Shaw's Learn C The Hard Way . Về thực tế như người ta có thể nhận được, và khá miễn phí.
Wyatt Barnett

Người Python của Hard Way hiện có sách cho các ngôn ngữ khác bao gồm phiên bản alpha cho C, tôi sẽ bắt đầu từ đó. C là cấp độ cao, một sự khác biệt lớn đối với asm, tôi ghét việc so sánh với asm vì nó là sai. Tương đối chắc chắn rằng nó cho phép bạn làm những gì các ngôn ngữ khác sẽ không. Không quan trọng bạn muốn làm bất kỳ ứng dụng nào bạn có thể viết bằng C, không có lý do gì để nhắm mục tiêu ứng dụng vào ngôn ngữ.
old_timer

Câu trả lời:


27

Tôi chỉ khuyên bạn nên chọn một bản sao của Ngôn ngữ lập trình C của Kernighan và Ritchie (Phiên bản 2) . Nó có một số bài tập ở cuối mỗi chương mà bạn có thể làm, cùng với việc cung cấp một giới thiệu rất tốt về ngôn ngữ C. Nó sẽ không làm cho bạn thành thạo ngôn ngữ, nhưng bạn nên nắm bắt đủ tốt ở cuối cuốn sách và các bài tập để có thể tìm thấy một dự án nguồn mở được viết bằng C mà bạn có thể đọc nguồn và có thể đóng góp đến.

Nếu bạn muốn xem các dự án thực tế trong thế giới thực với mã C trong đó. Nó đang trở nên khó khăn hơn - nhiều dự án sử dụng ngôn ngữ "cấp độ cao hơn", nhưng C vẫn còn sống và đá. Nếu bạn muốn học C, đừng ngại phát minh lại bánh xe để đạt được việc học. Nó không phải là một ý tưởng tốt để phát minh lại các giải pháp trên đồng hồ, nhưng nó hoàn toàn tốt để làm như một bài tập học thuật.


1
Thêm Câu hỏi thường gặp từ comp.lang.c vào đó. c-faq.com
Mike Sherrill 'Nhớ lại mèo'

3
+1 cho việc không phát minh lại các giải pháp để tìm hiểu.
một CVn

4
K & R thật kinh khủng khi học phong cách lập trình tốt nói chung và kinh khủng trong việc dạy các thực hành lập trình C an toàn / lành mạnh nói riêng. Tất cả các đoạn mã bên trong nó đều bị xáo trộn tốt nhất, hầu hết thời gian họ dạy những thói quen nguy hiểm hoàn toàn. Đó là một cuốn sách lỗi thời, tôi sẽ không giới thiệu nó cho bất cứ điều gì ngoài nỗi nhớ. Nó đặc biệt không phù hợp cho các lập trình viên mới bắt đầu.

2
@Thomas Có phiên bản thứ 2. Bạn có thể trích dẫn khá nhiều đoạn mã từ nó và tôi có thể chỉ ra 2-3 trường hợp thực hành nguy hiểm / kém trong đó. Tôi sẽ mở cuốn sách ngay bây giờ và chọn một số ví dụ ngẫu nhiên. Ok ở đây chúng tôi đi, p119: gán các điều kiện bên trong, sử dụng các kiểu dữ liệu nguyên thủy gốc, sử dụng int ẩn (không dấu), đánh máy kết quả của malloc (rất tệ!), Đánh máy tham số để tự do vô hiệu * (tại sao ??? ), nhiều trả về (còn gọi là spaghetti), sử dụng NULL mà không có #include thích hợp, nếu không có {}.

2
+ 1 cho KnR C. Đây là phần giới thiệu tốt nhất (và ngắn gọn nhất) để lập trình bằng một ngôn ngữ cụ thể mà tôi từng đọc. Như những người khác đã chỉ ra, nó có thể hơi mơ hồ ở những nơi - một lời khuyên mà tôi đưa ra là: nếu có một hướng dẫn lập trình yêu cầu bạn phải đọc những lời quảng cáo xung quanh, thì đây chính là nó. Thông thường, những người khác bạn có thể tìm ra từ khối mã, nhưng cuốn sách này yêu cầu bạn phải đọc nó từ trang bìa, ít nhất là một lần.
Jamie Taylor

1

Bạn sẽ phải thực sự hiểu phân bổ bộ nhớ. Bạn có vẻ như bạn đã sử dụng các ngôn ngữ khác trước đây, nhưng rất có thể những ngôn ngữ khác đó đã che giấu các chi tiết cơ bản về quản lý bộ nhớ từ bạn. Trong C, việc quản lý bộ nhớ luôn rõ ràng. Có một số lợi thế cho việc này, nhưng điều đó có nghĩa là bạn phải cẩn thận để làm cho đúng hoặc tất cả Địa ngục sẽ vỡ ra.

Sử dụng bất cứ phương tiện gỡ lỗi bộ nhớ nào có sẵn cho nền tảng bạn sử dụng. Đối với Linux có Hàng rào điện, trên Mac OS X có Guard Malloc. Ngoài ra còn có Valgrind hỗ trợ một số hệ điều hành.

Nếu bạn không giải phóng bộ nhớ cần giải phóng, bạn sẽ bị rò rỉ bộ nhớ. Tiếp tục làm điều đó và bạn sẽ hết bộ nhớ. Ngay cả với cửa hàng sao lưu (cái mà hầu hết mọi người gọi là bộ nhớ ảo), bạn có thể khiến hệ thống trang quá mức hoặc thậm chí hết dung lượng trao đổi.

Nếu bạn giải phóng bộ nhớ đã được giải phóng, bạn sẽ bị hỏng heap và sụp đổ, nhưng có lẽ không phải ngay lập tức. Bạn cũng sẽ làm hỏng heap nếu bạn tràn bộ đệm. Các công cụ gỡ lỗi bộ nhớ sẽ giúp với tất cả những điều này.

Kiểm tra đơn vị cũng giúp.


0

Tôi đồng ý với hầu hết mọi người ở đây rằng các ngôn ngữ ngày nay được xác định bởi nhiệm vụ trong tầm tay. Đã có lúc bạn có sự lựa chọn hạn chế trong vấn đề này. Ngày nay, C chủ yếu được sử dụng trong miền lập trình nhúng / hệ thống, nơi cần tối ưu hóa mã. Bạn cần phải viết mã chính xác để có được mức tối đa bởi vì nếu bạn bắt đầu sử dụng sự trừu tượng đó, thì những thứ cơ bản phải rất mạnh mẽ. Tôi muốn nói rằng bạn cố gắng thực hiện một số dự án GNU nguồn mở như chính Linux hoặc thứ gì đó cần các nhà phát triển C. Hãy thử sức mình với những dự án đó thay vì viết một cái gì đó không rõ ràng trong C. Đây có lẽ là cách tốt hơn để viết mã và học một ngôn ngữ.


Trên thực tế, tôi nghi ngờ việc nhảy đầu vào một dự án đã thành lập, ngay cả khi nhỏ, là một cách tốt để bắt đầu học một ngôn ngữ từ đầu. Bạn đang có khả năng để có được trong cách trên đầu của bạn, và cũng sẽ có những gánh nặng thêm chỉ đơn giản là cố gắng để di chuyển mã, ngay cả khi tất cả các bạn đặt ra để làm là tìm hiểu cách thức hoạt động mã. Một hạt nhân hệ điều hành nói riêng là một phần mềm cực kỳ phức tạp.
một CVn

Có, nhưng tôi cho rằng người hỏi đã thực sự trải qua cuốn sách K & R hoặc một cái gì đó tương tự. Tôi đã được đề xuất phương pháp này khi tôi hỏi trong kênh Python. Nó sẽ là differnt trong C?
Nishant

Nói một cách chính xác, tôi không biết liệu nó có khác nhiều không, nhưng trong C, bạn cần chú ý nhiều hơn đến các chi tiết khó chịu hơn so với ngôn ngữ cấp cao như Python. Quản lý bộ nhớ, chỉ đề cập đến một điều. Nhảy vào một dự án lớn, có tiềm năng khi bạn mới bắt đầu với một ngôn ngữ có thể không phải là cách tốt nhất để làm điều đó.
một CVn

0

Bạn sẽ muốn làm một cái gì đó có thể làm việc từ dòng lệnh. Lập trình GUI trong C là một nỗi đau lớn ở mông, ngay cả với khung GUI tốt .

Đề xuất thông thường của tôi cho trải nghiệm học tập C thực tế là một danh sách liên lạc hoặc ứng dụng quản lý dữ liệu đơn giản khác. Điều đó sẽ bao gồm hầu hết các bit quan trọng (I / O, quản lý bộ nhớ, xử lý văn bản, v.v.) và bạn sẽ không phải sử dụng bất cứ thứ gì bên ngoài thư viện C tiêu chuẩn để thực hiện nó. C không có bất kỳ sự hỗ trợ tích hợp nào cho đồ họa, mạng, âm thanh hoặc nhiều thứ khác 1 , vì vậy, lần đầu tiên bạn bước vào lập trình C, tốt nhất là tránh mọi thứ liên quan đến những thứ đó.

C có thể được sử dụng cho lập trình mục đích chung; bạn chỉ cần giảm bớt phần nào sự mong đợi của mình (hãy tưởng tượng đó là năm 1983 và bạn đang ngồi trước một chiếc VT52 được gắn vào VAX 11/750, và bạn sẽ có suy nghĩ đúng đắn).

Chỉ cần nhớ rằng, C không có người bảo vệ lưỡi kiếm, và sẽ không ngăn bạn làm điều gì đó ngu ngốc. Định nghĩa ngôn ngữ hơi lỏng lẻo ở một số nơi và có một số hoạt động không bất hợp pháp như vậy, nhưng cũng không được xác định rõ.


1 - Bản sửa đổi mới nhất (2011) của tiêu chuẩn ngôn ngữ đã thêm hỗ trợ luồng tích hợp


0

Tôi đề nghị Project Euler . Tôi đã sử dụng nó để cải thiện C ++ của mình và nó thật tuyệt vời. Thật tuyệt vời vì mỗi vấn đề là một nhiệm vụ nhỏ có thể mất ít hơn một giờ để hoàn thành (ít nhất là những vấn đề đầu tiên).

Bạn sẽ cần một hồ sơ và một cuốn sách về tối ưu hóa mã cho tốc độ. Hãy chắc chắn tuân thủ quy tắc 1 phút: Bạn phải nhận được câu trả lời trong vòng 1 phút.


0

Nếu bạn C ALNG là một lập trình viên, và CHỈ cần học C, và đừng bận tâm đến việc học một phiên bản cũ hơn của ngôn ngữ (cốt lõi vẫn khá giống nhau), thì "C for Lập trình viên" của Leendert Ammeraal không thể đánh bại . Làm việc thông qua nó, bắt đầu để kết thúc.

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.