2011-01-30 43 views
9

Trải nghiệm hiện tại của tôi với lập trình bị hạn chế để hack cùng một số tập lệnh shell và một số assembly trong quá khứ. Tuy nhiên, tôi đã học được cú pháp cơ bản của mã C trong trường đại học.Làm cách nào để tìm hiểu cách viết mã C hiệu quả và duy trì?

Tôi muốn tìm hiểu cách viết mã C hiệu quả, tôi bối rối khi bắt đầu với K & R hoặc Lập trình C: Phương pháp tiếp cận hiện đại. Ngoài ra tôi nên nghiên cứu một số cuốn sách thuật toán cùng với vì vậy mà tôi không kết thúc bằng văn bản mã không hiệu quả ngay từ đầu?

+0

cũng xem xét nền tảng: hiệu quả trong nền tảng nào đó không phải là nền tảng khác ... –

+4

@Felice: Các chủ đề * sách thuật toán * bao gồm các loại giúp mã có thể mở rộng hơn trên mọi triển khai *. Không phải loại điều cung cấp cho +/- 10 ns tùy thuộc vào phần cứng hoặc trình biên dịch. – delnan

+0

@ delnan, bạn đúng nhưng các sách thuật toán nói chung không cần thiết phải nói về một ngôn ngữ duy nhất. –

Trả lời

12

Đừng lo lắng quá nhiều về hiệu quả mã ở giai đoạn này. Quan tâm hơn với mã rõ ràng và dễ đọc hơn.

Theo quy tắc, hãy giữ các chức năng nhỏ, thực hiện một tác vụ. Nếu cần quá nhiều câu để mô tả chức năng của một chức năng thì có thể cần phải chia nhỏ thành các hàm nhỏ hơn.

Sử dụng tên mô tả biến, thay vì chỉ x và n, vv

Bắt đầu bằng cách viết các chương trình bạn sẽ được thưởng thức phát triển, chứ không phải là "bài tập nhàm chán rằng cuốn sách sẽ cho bạn biết phải làm gì." Tuy nhiên, hãy làm theo lời khuyên và hướng dẫn của cuốn sách.

Mọi người đều có phong cách riêng của họ, đừng lo lắng nếu phong cách của bạn không hoàn toàn phù hợp với người tiếp theo.

Trên tất cả, hãy tận hưởng! Nếu bạn thấy một thứ hơi nhàm chán, hãy chuyển sang thứ gì đó khác, luôn có nhiều thứ để học.

EDIT: Ngoài ra, đừng cố gắng chạy trước khi bạn có thể đi bộ - Tôi đang suy nghĩ cụ thể về a) con trỏ và b) phân bổ bộ nhớ động. Không cần phải sử dụng một trong số họ ở giai đoạn đầu này cho đến khi bạn cảm thấy thoải mái.

+4

Cũng xem xét mã rõ ràng, đơn giản cũng có thể * mã * nhanh hơn. arr [i] [j] ') chậm hơn so với sử dụng số học con trỏ (' * (* (a + i) + j) '). Bật ra trên ít nhất một nền tảng (gcc/linux/x86), điều đó không đúng Hình thức thứ hai chậm hơn tới 20%, các trình biên dịch khá thông minh, và biết cách tạo mã hiệu quả cho các hoạt động phổ biến –

0

Bạn có thể mô phỏng lập trình hướng đối tượng.

Xác định đối tượng bằng cách xác định tệp chứa cấu trúc và chức năng hoạt động trên các cấu trúc này. Đánh dấu các chức năng không cần xem bên ngoài là tĩnh. Điều này sẽ giữ cho chúng ẩn, vì vậy bạn gây ô nhiễm ít không gian tên hơn. Tạo một cấu trúc mới với hàm new trả về một con trỏ tới cấu trúc atit malloc() mới và một lần xóa thực hiện free(). Xác định các thành viên đơn giản hoạt động trên dữ liệu cấu trúc, chấp nhận một con trỏ đến cấu trúc luôn là đối số đầu tiên.

Tôi khuyên bạn nên tìm hiểu một số OOP với python và áp dụng cùng một khái niệm.

+8

OP không hỏi cách học OOP với C (trong trường hợp đó câu trả lời đúng sẽ là "don" 't', btw) OP hỏi làm thế nào để học (tốt) C - và emulati ng OOP không phải là khôn ngoan cũng không thành ngữ C. (Ngoài ra, bạn hoàn toàn chú ý đến thành phần chính của OOP - công văn động, mà phải được mô phỏng bởi các con trỏ hàm trong các cấu trúc). – delnan

+1

@delnan: OP hỏi làm thế nào để viết mã duy trì trong C, và từ kinh nghiệm cá nhân và trực tiếp của tôi, mã hóa OOP giống như là một cách để tạo mã duy trì trong C. –

+0

@Stefano: Ngay cả giả định * là * một giải pháp hợp lệ trong Hầu hết các trường hợp (tôi nghi ngờ nó có lợi thế cho hầu hết các chương trình hệ thống, và đó là nơi bạn nên sử dụng C - nó có thể hữu ích cho các ứng dụng, nhưng ai trong tâm trí của họ viết các ứng dụng trong C?), nó bổ sung thêm rất nhiều cruft và uốn cong ngôn ngữ. Học C (ví dụ, không rò rỉ bộ nhớ hoặc gọi UB) có thể đủ cứng, không cần thêm rắc rối khi xây dựng một hệ thống OOP toàn bộ gần như từ đầu. – delnan

6

Đầu tiên bị ướt với những điều cơ bản. Tìm hiểu các gotchas, tìm hiểu một phong cách C tốt. Bạn không thể học cách viết mã C hiệu quả trong một lần chạy, do đó, bạn có thể mắc lỗi ngay từ đầu.

Tôi đã tìm ra cách tốt nhất để tìm hiểu cách viết mã hiệu quả là tìm hiểu cách tránh rò rỉ bộ nhớ. Mã C có thể bảo trì yêu cầu tài liệu và nhận xét tốt trong nguồn. Ngoài ra, nó đòi hỏi phải viết mã chống lại sự thay đổi.

Ví dụ:

xấu dụ:

int* ptr = malloc(5 * 4); //4 here being size of int. 
... do something with ptr here... //<-- this is wrong! 

Tại sao xấu? int có thể không phải lúc nào cũng được 4. Ngoài ra, trong dòng thứ hai bạn đang làm một cái gì đó với ptr (có lẽ chuyển nhượng) mà không kiểm tra nếu nó là NULL.Ví dụ

tốt hơn:

int* ptr = malloc(5*sizeof(int)); // better, always allocate with respect to int size 
if (ptr) ..do something.. 

Tại sao tốt hơn? Đầu tiên bạn được phân bổ liên quan đến kích thước của int, vì vậy ngay cả khi trong một kích thước của kiến ​​trúc int khác nhau, bạn là tốt. Bạn cũng kiểm tra xem ptr là NULL trước khi sử dụng

dụ xuất sắc nhất:

int* ptr = malloc(5* sizeof(*ptr)); 
if (ptr) .. do something. 
free(ptr); // done with ptr 

Tại sao điều này là cách tốt nhất? Trước tiên, bạn đã liên kết kích thước phân bổ không với kích thước của int, nhưng trực tiếp với kiểu của ptr. Bây giờ nếu ai đó vì bất kỳ lý do nào thay đổi từ lâu trong tuyên bố của ptr (đặc biệt là nếu nó được tuyên bố ở nơi khác) mà không thay đổi đối số dài của bên trong malloc; phân bổ của bạn vẫn sẽ chính xác vì nó phân bổ trực tiếp theo bất kỳ loại ptr nào.

Chúng tôi cũng tự do ptr sau khi được thực hiện với nó, để ngăn chặn rò rỉ bộ nhớ.

+2

Truyền giá trị trả về 'malloc' là C++, chứ không phải C;) – delnan

+0

Có, bạn đã đúng. Ngoại trừ nếu nó là một con trỏ hàm, tất nhiên. – Orca

+0

Tôi nghĩ rằng bạn có nghĩa là 'sizeof (* ptr)' bên trong malloc ... hoặc không có dấu ngoặc đơn ... 'sizeof * ptr', giống như không có dấu ngoặc đơn trong' return (NULL); ':) – pmg

1

Bạn nên thử đọc "Viết mã rắn" từ Steve Maguire, đó là một cuốn sách cũ, nhưng nó có thể dạy cho bạn những gì bạn cần.

1

Đầu tiên và quan trọng nhất, chăm sóc cho xách tay lập trình. Có một tiêu chuẩn C (ISO 9899: 1999 aka C99 và: 2011 aka C11 - bạn cần phải đầu tư ~ 20 đô la) và một "Unix" Tiêu chuẩn, được gọi là POSIX (tự do truy cập). Đọc chúng, sống chúng. Tránh xa mọi chương trình Windows và đồ họa cho đến khi bạn không còn là một châu chấu nữa.

Là người thông thái nói: Người mới lập trình máy của anh ấy. Các chuyên gia chương trình một bộ máy. Các chương trình guru không có máy cụ thể.

Đó là bản chất của tính di động và nó sẽ giúp bạn tiết kiệm được rất nhiều câu hỏi trong biểu mẫu Nó được biên dịch/chạy dưới FOO-OS với trình biên dịch ma thuật Frobozz, nhưng không theo BAR-OS, WTF?

0

Để thêm vào với những gì người khác đã nói, tôi khuyên bạn nên viết rất nhiều mã. Thường thì tôi thấy rằng những người trong lĩnh vực này chờ đợi quá lâu để thực sự viết mã và dành quá nhiều thời gian để đọc.

Các vấn đề liên quan