Có phải là một thói quen tốt để sử dụng biểu thức C trong mã C ++?


19

Ở trường, chúng tôi bắt đầu học C năm nay, mặc dù thực tế tôi đang đi trước lớp và tôi đã học Java, C ++ và C trong khi lớp học là cơ sở của C. Dù sao, tôi đã tự mình viết tài liệu, đọc sách, và tôi đã hỏi giáo viên của mình tại sao tôi nên học C và cô ấy nói đó là nền tảng của C ++. Khi tôi mới bắt đầu lập trình, tôi thấy C ++ dễ dàng hơn rất nhiều, sau này tôi đã học C. Nhưng trong sách bạn có thể thấy mã C hoạt động trong C ++ nhưng nó không đi ngược lại.

Câu hỏi của tôi khá đơn giản ~ Có phải là một thói quen tốt khi sử dụng biểu thức C trong C ++? Tôi sẽ cho bạn một ví dụ:

Nên mã này

#include <stdio.h>
#include <iostream>

int main() {
int x;
scanf("%d", &x);
cout << "The number you entered is " << x << "And it's double is " << x*x;
return 0;
}

Hiệu quả hơn hoặc tốt hơn bằng mọi cách hơn thế này:

#include <iostream>

int main() {
int x;
cin >> x;
cout << "The number you entered is " << x << "And it's double is " << x*x;
return 0;
}

Tôi đã thực hiện một số tài liệu dễ dàng về điều này trong một số sách cũ bụi bặm và từ những gì tôi có thể tìm thấy, sử dụng scanf thay vì cout cũng tuôn ra luồng hoặc một cái gì đó tương tự, vì vậy về cơ bản tôi sẽ hỏi liệu có nên sử dụng scanf và trong bối cảnh gì.

Điều này cũng áp dụng cho tệp IO vì tôi luôn thấy FIle IO dễ dàng hơn trong C so với C ++. Câu hỏi này dành cho khá nhiều biểu thức chung trong C được áp dụng cho C ++. Điều đáng chú ý là tôi đang sử dụng một trình biên dịch hiện đại và tuy nhiên điều này không thành vấn đề khi tôi hỏi liệu đó có phải là thói quen lập trình tốt để sử dụng các biểu thức C trong mã C ++ hay không.

Có thể có những nhược điểm và ưu điểm của việc này, nhưng tôi chỉ tìm kiếm một câu trả lời có / tại sao, không / tại sao.

Ngoài ra nếu có bất kỳ chi tiết nào tôi đã để lại bình luận.


12
Hãy thực sự cẩn thận về việc trộn stdioiostream. Có một số thứ tự và đồng bộ hóa được đảm bảo trong một gia đình không nhất thiết phải áp dụng bên ngoài nó.
David Thornley

Cảm ơn vì tiền boa, nhưng mã phế liệu đó là một ví dụ thuần túy. Dù sao cũng cảm ơn bạn.
Bugster

25
Nếu bạn đang học lập trình; Bạn phải học cách thụt lề thích hợp!
bitmask

5
scanf () không phải là một ví dụ tuyệt vời; nó rất dễ bị lỗi khi sử dụng đến mức tôi sẽ khuyên bạn nên tránh nó trong C hoặc C ++.
Russell Borogove

1
Nó có thể chỉ là mã mẫu, nhưng nhận xét của David thực sự đi vào trọng tâm của vấn đề tại sao bạn không nên sử dụng thành ngữ C khi lập trình trong C ++. Chúng là những ngôn ngữ hoàn toàn khác nhau; đừng nhầm lẫn chúng nhiều hơn bạn nhầm lẫn Java và C, hoặc C ++ và Visual Basic.
Cody Grey

Câu trả lời:


36

Không, đó là một thói quen xấu. Khi bạn làm điều này để kiếm sống, rất có thể bạn sẽ vi phạm các hướng dẫn về phong cách mà nhóm của bạn tuân thủ (hoặc ít nhất là bị đánh trong khi đánh giá mã).

Có, nó hoạt động, nhưng nếu có tương đương c ++, hãy sử dụng nó. (ví dụ: cố gắng không trộn printfsvới couts)


+1 - Ngắn gọn và chính xác. Và điều này nhấn mạnh điểm chính trong câu trả lời của tôi rằng các nguyên tắc nhóm giúp gắn kết mọi người lại với nhau và thống nhất họ để họ có thể làm việc cùng nhau.
jmort253

Nhận xét này khá nhiều câu trả lời đúng câu hỏi của tôi và mang lại một lập luận vững chắc. Cảm ơn bạn.
Bugster

1
@ThePlan cảm ơn. mọi người đã có câu trả lời tuyệt vời cho câu hỏi này
jglouie

1
Lưu ý: sử dụng printfnhất quán sẽ hoạt động tốt như sử dụng coutnhất quán. Vấn đề duy nhất là trộn chúng lại với nhau, và phong cách.
dùng253751

Bạn có thể cho một ví dụ về một tính năng trong C không có tương đương C ++ không?
klutt

20

Nhìn chung, C và C ++ được xem như thể chúng là hai ngôn ngữ hoàn toàn riêng biệt. Do đó, nó có thể được coi là hình thức xấu để sử dụng cú pháp C trong chương trình C ++.

Bạn nói đúng; tuy nhiên, mã C sẽ biên dịch tốt. Nó thực sự phụ thuộc vào mức độ linh hoạt của công ty bạn về các tiêu chuẩn sau. Nếu tôi từng được hỏi câu hỏi trong một cuộc phỏng vấn, tôi chắc chắn sẽ cho người phỏng vấn biết rằng C hoạt động trong C ++, nhưng C và C ++ là hai ngôn ngữ riêng biệt và có lẽ không nên trộn lẫn trừ khi có rất, rất lý do tốt để làm như vậy.

Một điều khác cần xem xét là các tiêu chuẩn giúp tạo ra một nền tảng nơi nhiều người có thể dễ dàng làm việc với mã. Trong khi bạn may mắn có một giáo viên khuyến khích bạn học C, không phải ai cũng có thể may mắn như vậy. Do đó, việc trộn C trong chương trình C ++ có thể gây nhầm lẫn cho người chưa từng học C.

Tóm lại, chỉ vì bạn có thể làm điều gì đó không có nghĩa là bạn nên và chỉ vì bạn không nên làm điều gì đó không có nghĩa là bạn không thể :)


Tôi hiểu rồi. Còn về chức năng, có trường hợp cụ thể nào khi cú pháp C tốt hơn cú pháp C ++ không?
Bugster

10

C ++ tương thích ngược với C theo thiết kế, do đó, thông thường mã C sẽ được biên dịch bởi trình biên dịch C ++ tốt ( thường là do có các từ dành riêng trong C ++ không có trong C và có thể được sử dụng trong mã C phá vỡ quá trình biên dịch).

Tuy nhiên, tôi thấy nó là mã trộn thực hành xấu. Nếu bạn sử dụng scanf- sử dụng printf, nếu bạn đang sử dụng operator >>- sử dụng operator <<. Lý do là các toán tử C ++ bị quá tải có thể đóng gói chức năng mà bạn không biết và việc không khớp chúng sẽ khiến chương trình của bạn làm những việc mà bạn không muốn nó làm.

Không có lý do cụ thể nào để thích cú pháp C trong mã C ++, đây là các ngôn ngữ khác nhau và khi sử dụng cú pháp C trong mã C ++ - bạn vẫn đang viết mã C ++ , chỉ không sử dụng nhiều công cụ mạnh mẽ của nó.


5
Sự không tương thích giữa C và C ++ không chỉ là từ khóa. Hệ thống gõ thay đổi và có những tính năng tồn tại trong C (đặc biệt là C99), không tồn tại trong C ++. (Ví dụ, mảng có độ dài thay đổi).
Arafangion

9

Nếu chúng ta bỏ qua phong cách mã hóa và các vấn đề thẩm mỹ, thì cũng có những vấn đề kỹ thuật khác nhau mà bạn gặp phải khi sử dụng C trong mã C ++:

  • C là gì? C90, C99 hay C11? Có thể có nhiều vấn đề tương thích khác nhau tùy thuộc vào tiêu chuẩn C bạn đang sử dụng. Loại Boolean, // nhận xét, các tính năng C99 như VLAs, bộ khởi tạo được chỉ định, v.v.

  • C ++ có kiểu gõ chặt chẽ hơn C. Để biên dịch mã C trong C ++, rất có thể bạn phải thêm các kiểu chữ khác nhau để có được loại dự kiến. Điều này có nghĩa là bạn có thể phải viết lại mã C hoàn hảo, chất lượng sản xuất để nó hoạt động trong C ++.

  • Các kiểu chữ được bao bọc bởi cách gõ chặt chẽ hơn thường chỉ là một điều tốt, nhưng trong một số trường hợp, chúng có thể giới thiệu hoặc ẩn đi các lỗi. Lấy diễn viên khét tiếng về kết quả từ malloc () làm ví dụ. Điều này nên được đánh máy trong C ++, nhưng không bao giờ bằng C. (1)

  • Trộn chức năng C và C ++ có thể dẫn đến lỗi và hành vi không xác định. Ví dụ, nó sẽ không hoạt động để phân bổ với malloc () và giải phóng với xóa . (2)

  • Vấn đề an toàn chủ đề. Thư viện chuẩn C không phải là chủ đề an toàn. Thư viện C ++ tiêu chuẩn có thể hoặc không an toàn cho luồng, nếu có, sau đó thêm chức năng thư viện C gọi vào mã của bạn sẽ phá hủy điều đó.

    Là một sidenote cho các lập trình viên Windows: trình biên dịch Visual C ++ đã có một lỗi rò rỉ trong một thời gian khá lâu, khi chức năng Windows API CreatThread () được sử dụng trong cùng một chương trình với thư viện C. (3, 4)

  • Quy ước gọi có thể là một vấn đề trên một số trình biên dịch, buộc người ta phải sử dụng extern "C"để nói rõ ràng các chức năng nào cần được liên kết với "quy ước gọi C".

  • Chi tiết gây phiền nhiễu. Toán tử dấu phẩy hành xử khác nhau. Dấu phẩy dấu phẩy trong khai báo struct / enum được cho phép trong C99 / C11 nhưng không được C ++. Phạm vi của các loại biến và chức năng được xử lý khác nhau. Vân vân.

Có nhiều khả năng thậm chí nhiều trường hợp.


Tài liệu tham khảo:

  1. http://c-faq.com/malloc/cast.html
  2. http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.3
  3. http://www.flounder.com/badprogram.htmlm#CreateThread
  4. http://msdn.microsoft.com/en-us/l Library / windows / desktop / ms682453% 28v = vs85% 29.aspx

7

Lý do tại sao C ++ có thể biên dịch C chỉ để "tương thích ngược" (tránh viết lại mã làm việc hiện có).

Nhưng C ++ có một triết lý khác đối với c. Trộn chúng lên không làm một dịch vụ tốt cho cả hai.

Cách C và C ++ quản lý i / o có thể dựa vào một cách khác để quản lý trạng thái bên trong i / o. Vì vậy, ít nhất - sử dụng đầu vào và đầu ra một cách nhất quán.

Và trong các chương trình C ++, tôn trọng phong cách C ++ (trừ khi được yêu cầu cụ thể ở nơi khác)


5

Tôi muốn nói rằng học C trước tiên là, IMHO, một ý tưởng tốt. Bằng cách này, mọi người bắt đầu hiểu phần cứng họ viết phần mềm cho.

Trộn hai ngôn ngữ này không phải là ý tưởng tốt mặc dù. Bởi vì bạn có được sự phức tạp điên rồ của C ++ cùng với việc sử dụng bit thô đôi với C.

Như bạn có thể thấy, trong ví dụ đơn giản như của bạn, có một vấn đề đồng bộ hóa với các loại luồng khác nhau và bộ đệm nội bộ. Nhưng ngoài ra, phương pháp C & C ++ không linh hoạt hơn bằng bất kỳ phương tiện nào. Chuyển sang lớp x và không có toán tử để sử dụng truyền phát và công cụ.

Nó phức tạp lắm...

Tôi thực sự nghĩ rằng lập trình viên C ++ giỏi nên biết cách bit bị lật sau mỗi cấu trúc và các hành vi ẩn là gì.

Nhưng học C ++, ít nhất là hơn 50% trong số đó, phải mất hơn 5 năm mã hóa chuyên nghiệp và bạn không thể quản lý được điều đó trong chương trình học kéo dài 6 tháng với 20 giờ kinh nghiệm.

Nếu tôi sử dụng các cấu trúc C ++ trong C, tôi sẽ không sử dụng các luồng, chúng đơn giản từ chế độ xem mắt chim và khiến mọi người tin rằng phát triển phần mềm là dễ dàng, nhưng ẩn giấu sự phức tạp thêm mà không có nhiều lợi ích trong nhiều tình huống.

Các lớp trình bao bọc RAII, các mẫu, quá tải, tính chính xác và các lớp trừu tượng thuần túy cho các giao diện phổ biến (không sử dụng cách Java f-ng ở đây XIN VUI LÒNG!) Là những ứng cử viên tốt. Bởi vì chúng thêm an toàn, chung chung và dễ sử dụng, điều này rất quan trọng đối với các dự án thực tế. Hãy nhớ ghi nhớ về những thứ như phá hủy ảo, bản chất bùng nổ của cấu trúc sao chép mặc định, chi phí thời gian chạy, tính chính xác, v.v.

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.