Bạn đang xem bài viết Sự Khác Biệt Giữa #Define Và Const Trong C Là Gì? được cập nhật mới nhất tháng 10 năm 2023 trên website Channuoithuy.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất.
Sự khác biệt giữa #define và const trong C là gì?Một số khác biệt quan trọng:
Một cách khó hiểu là một định nghĩa vĩ mô, thì không có gì khó hiểu, đó là một từ khóa, # 1 trong khi biên dịch phải sử dụng trong quá trình tiền xử lý, một cách dễ dàng trong quá trình biên dịch Cũng có thể được sử dụng để khai báo các phương thức, chỉ có thể sử dụng các giá trị, các ứng dụng có thể có phạm vi toàn cầu hoặc phụ thuộc vào phạm vi toàn cầu, nghĩa là có thể có phạm vi toàn cầu hoặc cục bộ tùy theo tuyên bố của họ không thể xác định được bằng cách sử dụng chỉ thị của #
Jason
Một #define là một sự thay thế văn bản được thực hiện bởi bộ tiền xử lý TRƯỚC KHI tệp được biên dịch, mọi lần xuất hiện của macro sẽ được mở rộng thành tệp nguồn. Một #define có thể là các trang của mã nguồn và trong một số trường hợp được sử dụng như một cách tạo các mẫu nguyên thủy trong C.
Const là một vòng loại được sử dụng để báo cho trình biên dịch rằng giá trị sẽ không bị thay đổi. Nó có thể được sử dụng với bất kỳ loại dữ liệu nào ngoài void, tuy nhiên con trỏ void có thể là const.
Xem hướng dẫn tuyệt vời này: Sự khác biệt giữa const và #define trong ngôn ngữ lập trình C, C ++
Tóm lại, #define là một chỉ thị tiền xử lý được sử dụng để xác định các macro, trông giống như các hằng hoặc hàm. Các macro được thay thế trong quá trình tiền xử lý bằng cách sử dụng thay thế văn bản. Một const là một từ khóa được trình biên dịch hiểu để biến một cái gì đó thành hằng số, ví dụ, trong C, một biến được đánh dấu là const là một biến có giá trị không thể thay đổi.
N.B., macro dễ vỡ hơn nhiều so với các hằng số và hàm thích hợp. Ví dụ,
#define THÊM (x, y) x + y int chính (int argc, char * argv []) { int a; a = THÊM (1,2) * 3; }Được chuyển thành
#define THÊM (x, y) x + y int chính (int argc, char * argv []) { int a; a = 1 + 2 * 3; }Đó là, a được đặt thành 7, trong khi
#define THÊM (x, y) x + y int thêm (int a, int b) { trả về a + b; } int chính (int argc, char * argv []) { int a; a = thêm (1,2) * 3; }mang lại một bằng 9
Ngôn ngữ C có một lịch sử kỳ lạ là ngôn ngữ cấp cao / cấp thấp. C tổng hợp có hai bước chính.
Bộ tiền xử lý hoạt động trên các chỉ thị # – ký hiệu, như #define Trình biên dịch C thực sự đọc mã được sửa đổi để tạo mã máy
Sự khác biệt giữa #define và const trong C là gì?
Bước tiền xử lý thay thế giá trị macro #define trong mã nguồn C. Điều này có nghĩa là #define MAXVAL (38) thực sự đặt 38 vào nguồn; nó không phải là một biến và không chiếm các ô nhớ trong chương trình.
Vòng loại const áp dụng cho các biến được khai báo là hằng số. const int var = 38; là một ô nhớ không đổi cụ thể. Sử dụng const để đảm bảo các tham số được truyền cho một hàm don Thay đổi trong trình gọi.
svcministry.org © 2023
Sự Khác Biệt Giữa Biến Tĩnh Và Biến Toàn Cục Trong C / C ++ Là Gì?
Sự khác biệt giữa biến tĩnh và biến toàn cục trong C / C ++ là gì?
Sự khác biệt giữa điều này là trong phạm vi. Một biến toàn cầu thực sự có phạm vi toàn cầu và có thể nhìn thấy ở mọi nơi trong chương trình của bạn, tức là
#incolee int my_global_var = 0; intmain (void) {printf (“% d n”, my_global_var); trả về 0;}
my_global_var
là thực sự toàn cầu và hiển thị rõ ràng cho mọi thứ trong chương trình của bạn, mặc dù để hiển thị nó trong các mô-đun khác, bạn cần một
extern int my_global_var;
trong các tệp C khác nếu bạn có dự án nhiều tệp. Một biến toàn cục được khởi tạo khi chương trình bắt đầu về 0 mà không cần khởi tạo rõ ràng.
Một biến tĩnh có thể có phạm vi cục bộ, nhưng không được phân bổ trên
cây rơm
. Nó có thể có ít hơn phạm vi toàn cầu, mặc dù – giống như các biến toàn cục – nó nằm trong
.bs
phân đoạn thực thi của bạn (và giống như tất cả các biến bss, được khởi tạo thành 0 theo tiêu chuẩn C nếu thiếu khởi tạo rõ ràng, mặc dù tôi muốn khởi tạo chúng một cách rõ ràng cho mục đích tài liệu). Một biến tĩnh trong một hàm sẽ giữ giá trị của nó trên các yêu cầu của hàm, tức là
#incolee intmyfunc (int val) {static int my_static_var = 0; my_static_var + = val; return my_static_var;} intmain (void) {int myval; myval = myfunc (1); printf (“cuộc gọi đầu tiên% d n”, myval); myval = myfunc (10); printf (“cuộc gọi thứ hai% d n”, myval); return 0;} [hết mã] $ ./a.outfirst cuộc gọi 1 giây thứ hai 11
Lưu ý rằng việc khởi tạo
my_static_var
phía trong
myfunc ()
xảy ra tại thời gian biên dịch và không xảy ra ở mọi lần gọi hàm. Điều này có thể gây nhầm lẫn nếu bạn chưa từng thấy điều này trước đây.
Bạn cũng có thể có một biến tĩnh cấp cao nhất. Đây là các tệp cục bộ trong tệp mà chúng được khai báo, như được đề cập bởi
, vì vậy họ thực sự có “phạm vi tập tin”.
Tất cả các đối tượng có thời lượng lưu trữ tĩnh phải được khởi tạo (được đặt thành giá trị ban đầu của chúng) trước khi bắt đầu thực hiện hàm main (). Vì vậy, một giá trị không được biết tại thời điểm dịch không thể được sử dụng để khởi tạo các biến tĩnh.
Biến tĩnh và toàn cầu khác nhau rất nhiều trong hành vi của họ đối với cuộc sống và phạm vi. Đầu tiên, hãy để tôi phân biệt giữa cuộc sống và phạm vi. Tuổi thọ của một đối tượng xác định xem đối tượng có còn trong bộ nhớ (của quá trình) hay không trong khi phạm vi của đối tượng là liệu tôi có thể biết biến đó bằng tên của nó tại vị trí này hay không. Có thể đối tượng đang sống, nhưng không nhìn thấy (không phải trong phạm vi) nhưng không phải đối tượng đó không tồn tại mà là trong phạm vi (ngoại trừ các đối tượng được phân bổ động trong đó bạn tham chiếu đối tượng qua con trỏ).
Các biến tĩnh là cục bộ trong phạm vi cho mô-đun của chúng trong đó chúng được xác định, nhưng cuộc sống là trong suốt chương trình. Nói cho một biến tĩnh bên trong một hàm không thể được gọi từ bên ngoài hàm (vì nó không nằm trong phạm vi) nhưng vẫn tồn tại và tồn tại trong bộ nhớ. Lần sau khi hàm này được nhập (trong cùng một chương trình), cùng một bộ nhớ sẽ được truy cập, giữ lại các biến cũ và không có bộ nhớ mới nào được phân bổ lần này cho biến này giống như các biến khác trong hàm (biến tự động). Vì vậy, về cơ bản các biến vẫn tồn tại trong suốt chương trình. Tương tự nếu một biến tĩnh được xác định trong một không gian toàn cục (giả sử ở đầu tệp) thì biến này sẽ chỉ có thể truy cập được trong tệp này (phạm vi tệp).
Mặt khác, các biến toàn cục phải được xác định trên toàn cầu, vẫn tồn tại (cuộc sống) trong suốt chương trình, phạm vi cũng trong toàn bộ chương trình. Điều này có nghĩa là các biến như vậy có thể được truy cập từ bất kỳ chức năng, bất kỳ tệp nào của chương trình.
Vì vậy, nếu bạn có một biến toàn cục và bạn phân phối các tệp ur dưới dạng thư viện và bạn muốn người khác không truy cập vào biến toàn cục của mình, bạn có thể làm cho nó tĩnh bằng cách chỉ bắt đầu từ khóa tĩnh (tất nhiên nếu không yêu cầu biến đó trong các tệp khác của bạn ).
Nó hoàn toàn rõ ràng nếu bạn đọc qua tiêu chuẩn C.
Tiêu chuẩn C99 đề cập rõ ràng,
6.2.2 Liên kết của định danh
1) Nếu khai báo một định danh phạm vi tệp cho một đối tượng hoặc một hàm chứa định danh lớp lưu trữ tĩnh, thì định danh có liên kết bên trong.
2) Nếu khai báo một mã định danh cho hàm không có bộ xác định lớp lưu trữ, thì mối liên kết của nó được xác định chính xác như thể nó được khai báo với bên ngoài của bộ xác định lớp lưu trữ. Nếu khai báo một mã định danh cho một đối tượng có phạm vi tệp và không có trình xác định lớp lưu trữ, thì liên kết của nó là bên ngoài.
Điều đó có nghĩa là các biến tĩnh có
liên kết nội bộ
.
Biến toàn cầu có thể là tĩnh hoặc bên ngoài. Nếu biến toàn cục không có bộ xác định lớp lưu trữ, thì nó được coi là extern. Biến ngoài có
liên kết bên ngoài
.
Khi bạn sử dụng các biến tĩnh, chúng bị giới hạn ở tệp được xác định. Nó không thể được sử dụng bên ngoài tệp đó. Vì vậy, nếu bạn có nhiều tệp, bạn không thể chia sẻ biến đó trên bất kỳ tệp nào.
Nhưng khi bạn sử dụng các biến ngoài, bây giờ bạn có thể sử dụng chúng trên bất kỳ tệp nguồn nào của mình, miễn là bạn khai báo biến trong tất cả các tệp mà bạn cần sử dụng chúng.
Các biến tĩnh được khởi tạo khi phạm vi chúng được khai báo được nhập trước tiên. Điều này làm cho chúng hữu ích cho các mẫu như Singleton.Example:
SlowInitObject & ConstructSlowInitObjectOnce () {static SlowInitObject created_late; return created_late;}
Nếu `SlowInitObject created_late` là toàn cầu, ‘main ()’ sẽ không bắt đầu thực thi cho đến khi quá trình tạo của nó hoàn tất.
Các biến tĩnh không được liên kết bên ngoài. Ví dụ:
// source1.cppint a = 1;
// source2.cppint a = 2;
Hai cái này sẽ không liên kết với nhau, vì `a` vi phạm Quy tắc Một định nghĩa. Với` static`, mỗi mô-đun liên kết sẽ thấy` a` của riêng nó, hai mô-đun sẽ không lan truyền bên ngoài các mô-đun` source1` và` source2` tương ứng của chúng và chúng tôi tốt để đi.
Tất cả các biến toàn cục là tĩnh, nhưng tất cả các biến tĩnh không nhất thiết phải là toàn cục.
Điều mà tất cả các biến tĩnh (bao gồm toàn cầu) có điểm chung là chúng có thời gian tồn tại kéo dài thời gian của chương trình. Chúng được khởi tạo chỉ một lần, khi chương trình bắt đầu.
Các biến cục bộ cũng có thể được khai báo tĩnh, trong trường hợp đó chúng hoạt động giống như các biến toàn cục nhưng có khả năng hiển thị giới hạn ở hàm được khai báo. Hãy nhớ rằng một tĩnh cục bộ giống như một toàn cục ở chỗ nó chỉ được khởi tạo một lần. Ví dụ:
void foo_bar () {static int lượt truy cập = 1; std :: cout << lượt truy cập << endl;}
Hàm này sẽ in số lần nó được gọi kể từ khi chương trình bắt đầu. Lưu ý rằng biến số lượt truy cập vào lượt xem chỉ hiển thị trong hàm này.
Phạm vi biến trong C
Biến cục bộ
#incolee void test () {/ * biến cục bộ của hàm kiểm tra * / int x = 10; printf (“% d n”, x);} int main () {/ * biến cục bộ của hàm main * / int x = 100; {/ * biến cục bộ của khối này * / int x = 1; printf (“% d n”, x); } printf (“% d n”, x); kiểm tra();}
Đầu ra:
Sau đó, biến chỉ có thể được truy cập
trong
khối chức năng, trong trường hợp đó biến là một
biến cục bộ
và các biến như vậy có một
phạm vi địa phương
.
Tương tự như vậy trong mã mẫu ở trên, giá trị của biến ‘x’ là 1 trong khối mã ({}) được xác định bên trong hàm ‘chính’ và giá trị của biến này ‘x’ trong hàm ‘chính’ bên ngoài khối mã ({}) là 100. Giá trị của biến này ‘x’ là 10 trong hàm ‘test’.
Biến toàn cầu
Những biến được định nghĩa
ở ngoài
của tất cả các chức năng được gọi là
biến toàn cầu
. Sau khi khai báo, các biến này có thể được truy cập bởi bất kỳ chức năng nào trong chương trình đó. Do đó, các biến như vậy được cho là có một
phạm vi toàn cầu
#incolee / * Biến toàn cục * / int x = 1000; void test2 () {/ * biến cục bộ cùng tên * / int x = 100; printf (“% d n”, x);} int main () {printf (“% d n”, x); test2 ();}
Đầu ra:
Ở đây, bạn có thể thấy rằng giá trị của biến cục bộ ‘x’ được ưu tiên bên trong hàm ‘test2’ so với biến toàn cục có cùng tên ‘x’.
Đó là nó.
Một biến tĩnh chỉ hiển thị trong tệp nguồn hoặc khối {} được khai báo, nhưng tồn tại và giữ giá trị của nó cho vòng đời của chương trình trong bộ nhớ chung. Một biến toàn cục là giống nhau nhưng có thể nhìn thấy ở bất cứ đâu.
Các tệp và macro được bao gồm cũng có thể truy cập một biến tĩnh khi được sử dụng ở nơi nó đã hiển thị.
Một con trỏ toàn cầu đến một biến tĩnh là hoàn toàn an toàn vì cả hai đều tồn tại trên toàn cầu cho vòng đời của chương trình. Một con trỏ cục bộ đến một biến toàn cục hoặc tĩnh cũng an toàn.
Các
biến
khai báo bên trong một hàm hoặc khối được gọi là biến cục bộ. Các biến được khai báo bên ngoài hàm gọi là biến toàn cục.
#incolee int a = 1;
Đầu ra: -a = 1b = 2c = 3d = 4e = 5
Trong các chỉ định lớp Storage, biến được khai báo sẽ là,
Tự động
: – chỉ biến cục bộ
Đăng ký
: – chỉ biến cục bộ
tĩnh
: – Cả biến cục bộ và toàn cầu
bên ngoài
: – chỉ biến toàn cục
Phạm vi của các biến
Các lớp lưu trữ trong C
svcministry.org © 2023
Sự Khác Nhau Giữa C Và C++ Là Gì?
Việc nắm rõ sự khác nhau giữa C và C++ là rất quan trọng để bắt đầu học lập trình. Do đó, bài viết này sẽ giúp bạn làm rõ sự khác nhau giữa 2 ngôn ngữ C và C++, phân tích sự khác nhau đó. Qua đó sẽ giúp bạn đọc biết mình phải học như thế nào!
Ngôn ngữ lập trình C là gì?Ngôn ngữ C là một ngôn ngữ lập trình hướng cấu trúc được phát triển bởi Dennis Ritchie đầu thập niên 1970. Ngôn ngữ C là một ngôn ngữ lập trìnhbậc trung do nó có tồn tại cả những đặc trưng của ngôn ngữ lập trình bậc thấp và ngôn ngữ lập trình bậc cao.
C có thể coi là ngôn ngữ lập trình cổ điển cấp cao cho phép bạn phát triển các ứng dụng lõi của sản phẩm, phần mềm hệ thống. Và đó cũng là lý do và ngôn ngữ này được sinh ra và tồn tại bền vững cho tới ngày hôm nay.
Ngôn ngữ lập trình C++ là gì?Ngôn ngữ C++ là ngôn ngữ lập trình hướng đối tượng đầu tiên được phát triển bởi Bjarne Stroustrup. C++ (C plus plus) là phiên bản kế thừa và phát triển từ ngôn ngữ lập trình C.
Do kế thừa từ C nên C++ có tất cả những gì của ngôn ngữ C và bổ sung 1 khái niệm mới là Hướng đối tượng (class và object). Qua thời gian, C++ có được những cải tiến, mở rộng rất đáng kể mà chúng ta sẽ làm rõ ở phần tiếp theo. Và lưu ý rằng, C++ vẫn là một ngôn ngữ lập trình bậc trung.
Để có cái nhìn chi tiết hơn về C++, bạn có thể tiếp tục đọc bài viết sau:
Sự khác nhau giữa C và C++
C là ngôn ngữ lập trình hướng thủ tục, trong khi C++ là ngôn ngữ lập trình hướng đối tượng.
C chỉ hỗ trợ con trỏ, trong khi C++ hỗ trợ cả con trỏ và tham chiếu.
C không có nạp chồng hàm (function overloading), trong khi C++ hỗ trợ tính năng này.
C sử dụng nhập (scanf), xuất (printf) trong khi C++ sử dụng cin và cout dễ dùng hơn.
C không có kiểu (string, bool) trong khi C++ có 2 kiểu dữ liệu này.
Đuôi mở rộng của C là .c, còn đuôi mở rộng của C++ là .cpp
So sánh C và C++Phần trên mình chỉ nêu ra các điểm khác biệt nổi bật giữa C và C++ để các bạn nhanh chóng nắm được các điểm khác biệt chính. Còn phần này mình sẽ đi vào chi tiết, so sánh sự khác nhau giữa C và C++ trên các khía cạnh khác nhau một cách đầy đủ nhất.
Lưu ý: Ngôn ngữ C++ có tất cả những gì mà ngôn ngữ C có.
Nên học ngôn ngữ C hay C++?Câu này mình sẽ để các bạn tự trả lời bản thân. Mình sẽ chỉ đưa ra một số lời khuyên sau đây:
Việc học C++ khi đã nắm được ngôn ngữ C là rất nhanh.
Học C sẽ giúp bạn biết về con trỏ, cách mà máy tính quản lý và cấp phát bộ nhớ cho các chương trình.
Tụi cheat game sử dụng kiến thức “con trỏ” để sửa đổi các giá trị có trong game.
Trường đại học của bạn lựa chọn ngôn ngữ nào để dạy sinh viên? Theo giáo trình sẽ giúp bạn học hành thuận lợi hơn đó.
Tham khảo ngay nếu bạn đang muốn học C/C++:
Học phải đi đôi với hành chứ, luyện tư duy lập trình nào:
Sáng lập cộng đồng Lập Trình Không Khó với mong muốn giúp đỡ các bạn trẻ trên con đường trở thành những lập trình viên tương lai. Tất cả những gì tôi viết ra đây chỉ đơn giản là sở thích ghi lại các kiến thức mà tôi tích lũy được.
Sự Khác Biệt Giữa Const Và Constexpr
Nhắc lại về const
Từ khóa const (constant – hằng) là từ khóa để chỉ định một biến hay đối tượng là hằng, tức là không thay đổi được giá trị, mọi hành động thay đổi giá trị của hằng đều được compiler báo lỗi. Mục đích của const để tăng ràng buộc khi 1 biến thay đổi sẽ gây ra các hiệu ứng phụ cho chương trình.
Ví dụ khi truyền tham số dạng tham chiếu đường dẫn file vào hàm lấy nội dung của file, mục đích của hàm này chỉ sử dụng nội dung từ đường dẫn để lấy được nội dung file, nếu không ràng buộc const có thể dẫn đến các sơ sót do vô ý thay đổi giá trị đường dẫn và có thể trong chương trình có 1 đoạn mã cần sử dụng lại giá trị này nhưng không còn đúng nữa.
const được dùng trong các trường hợp đối tượng là biến tham trị, biến tham chiếu và tham số của hàm.
int main() { const int x = 7; int y = 8; const int &A = y; int z = 9; int *const p = &x; return 0; } void printName(const char * ID) { }Bài viết không đi sâu vào phân tích const, nếu cần chi tiết hơn có thể xem bài Thao Tác Với Constant trong C++.
Khái niệm constexprconstexpr được giới thiệu ở C++11 có chức năng yêu cầu trình biên dịch tính toán hàm hoặc biến tại thời điểm biên dịch. Các biến và hàm này được quy đổi thành 1 giá trị cố định khi biên dịch nên giảm được thời gian thực thi.
constexpr variableKhi khai báo một biến constexpr và const cũng được hiểu là không thể thay đổi giá trị, nhưng khác là constexpr phải đủ điều kiện để tính toán được trong thời điểm biên dịch, còn const sẽ thuộc thời gian thực thi. Muốn sử dụng constexpr cần phải tuân theo những quy định sau:
Kiểu của biến được thể hiện phải là LiteralType.
Nó cần được khởi tạo ngay tại thời điểm định nghĩa biến.
constexpr int a = 2; constexpr functionKhi khai báo 1 hàm là constexpr function, hàm này phải thỏa các điều kiện:
Nó không phải là virtual function.
Kiểu trả về của hàm phải là LiteralType.
Các biến tham số của hàm phải là LiteralType.
constexpr int add(int a, int b) { return a + b; } constexpr và thời gian biên dịchĐiều quan trọng nhất của constexpr là biểu thức được tính tại thời gian biên dịch:
{ return a.size() + b.size(); }
Như đã làm với hàm add phía trên, chuyển hàm add_vectors_size về dạng constexpr:
{ return a.size() + b.size(); }
Tuy nhiên, cách làm này là không chính xác, vì tại thời điểm biên dịch, tham số truyền vào là 2 vector, trình biên dịch sẽ không biết kích thước của 2 vector đó, vậy nên hàm này không tính trước được.
Đối với một ví dụ khác:
{ return a.size() + b.size(); }
Hàm này lại có thể hoàn toàn thực hiện được, do tại thời điểm biên dịch, trình biên dịch biết được kích thước của hai mảng a và b.
Lời kếtTrong lịch sử phát triển của C++, những lập trình viên hỗ trợ xây dựng lên C++ ngày càng hoàn thiện hơn, cải tiến tốc độ biên dịch là yếu tố rất được quan tâm đến. Từ đó qua các thế hệ C++ tiêu biểu như C++98, C++11, C++14 và tiếp đến là C++17, xuất hiện nhiều hơn các từ khóa mới, khái niệm mới nhầm tối ưu hóa tốc độ và bộ nhớ song song với khả năng phát triển phần mềm tiện lợi, việc của lập trình viên là tiếp tục cập nhật những cải tiến này.
C++ — Sự Khác Biệt Giữa Float Và Double Là Gì?
Sự khác biệt lớn.
Như tên của nó, a double có độ chính xác gấp 2 lần float[1]. Nói chung, một double có 15 chữ số thập phân có độ chính xác, trong khi float có 7.
Đây là cách tính số chữ số:
double có 52 bit mantissa + 1 bit ẩn: log (253) Log (10) = 15,95 chữ số
float có 23 bit mantissa + 1 bit ẩn: log (224) Log (10) = 7,22 chữ số
Mất chính xác này có thể dẫn đến các lỗi cắt ngắn dễ dàng hơn nhiều để nổi lên, ví dụ:.
float a = 1.f / 81; float b = 0; for (int i = 0; i < 729; ++ i) b += a; printf("%.7gn", b);trong khi
double a = 1.0 / 81; double b = 0; for (int i = 0; i < 729; ++ i) b += a; printf("%.15gn", b);Ngoài ra, giá trị nổi tối đa là khoảng 3e38, nhưng gấp đôi là về 1.7e308, do đó, sử dụng float có thể đạt “vô cực” (nghĩa là một số dấu phẩy động đặc biệt) dễ dàng hơn nhiều so với double cho một thứ đơn giản, ví dụ: tính toán giai thừa của 60.
Trong quá trình thử nghiệm, có thể một vài trường hợp thử nghiệm chứa những con số khổng lồ này, điều này có thể khiến các chương trình của bạn bị lỗi nếu bạn sử dụng phao.
Tất nhiên, đôi khi, thậm chí double không đủ chính xác, do đó đôi khi chúng ta có long double[1] (ví dụ trên cung cấp 9.000000000000000066 trên máy Mac), nhưng tất cả các loại dấu phẩy động đều bị lỗi làm tròn, vì vậy nếu độ chính xác là rất quan trọng (ví dụ: xử lý tiền), bạn nên sử dụng int hoặc một lớp phân số.
Hơn nữa, không sử dụng += để tổng hợp nhiều số dấu phẩy động, vì các lỗi tích lũy nhanh chóng. Nếu bạn đang sử dụng Python, hãy sử dụng fsum. Nếu không, hãy thử thực hiện thuật toán tổng hợp Kahan .
[1]: Các tiêu chuẩn C và C++ không chỉ định biểu diễn của float, double và long double. Có thể là cả ba đều được triển khai dưới dạng chính xác kép của IEEE. Tuy nhiên, đối với hầu hết các kiến trúc (gcc, MSVC; x86, x64, ARM) floatis thực sự là một số dấu phẩy động chính xác duy nhất của IEEE (binary32) và doubleis a IEEE double- số dấu phẩy động chính xác (binary64).
Khai Báo Define Trong C/C++
Bài viết này mình sẽ hướng dẫn các bạn cách khai báo define trong c/c++ và cách sử dụng của nó.
Cách khai báo và sử dụng define Cách khai báo define trong C/C++#define là tiền sử lý trong ngôn ngữ C/C++ cho phép bạn đặt tên cho một hằng số nguyên hay hằng số thực. Trước khi biên dịch, trình biên dịch sẽ thay thế những tên hằng bạn đang sử dụng bằng chính giá trị của chúng. Quá trình thay thế này được gọi là quá trình tiền biên dịch (pre-compile).
Cú pháp khai báo
Ví dụ:
Trước khi chạy biên dịch chương trình sẽ thay PI bằng giá trị 3.14.
Cách sử dụng define trong c/c++Trong quá trình sử dụng chúng ta cần tránh đặt các tên define giống các tên biến.
Quá trình trên sẽ biên dịch bị lỗi, lý do là trước khi biên dịch chương trình sẽ thay PI bằng giá trị 3.14. Nên sau khi biên dịch trình biên dịch sẽ gặp câu lệnh 3.14 = 3.14159; dẫn đến bị lỗi biên dịch.
Vì vậy, bạn nên hạn chế tối đa việc sử dụng #define để khai báo hằng số khi không cần thiết. Bạn có thể sử dụng cách khai báo sau để thay thế: const float PI= 3.4;
Ngoài cách dùng như một hằng số ta có thể sử dụng define một cách mền dẻo hơn.
Hoặc bạn cũng có thể sử dụng define để định nghĩa một hàm:
Cách khai báo và sử dụng typedef Cách sử dụng typedefNgôn ngữ chương trình C/C++ cung cấp một từ khóa typedef, mà bạn có thể sử dụng để cung cấp kiểu cho một tên mới.
Ví dụ:
Sự khác nhau giữa typedef và define
typedef được giới hạn chỉ cung cấp các tên viết tắt cho các kiểu, trong khi đó #define có thể được sử dụng để định nghĩa tên hiệu cho cả các giá trị, như bạn có thể định nghĩa pi là 3.14, ….
Sự phiên dịch typedef được thực hiện bởi bộ biên dịch, trong khi lệnh #define được xử lý bởi bộ tiền xử lý.
Bài viết của mình đến đây là kết thúc. Cám ơn các bạn đã theo dõi !
Chia sẻ kiến thức lập trình là sở thích và đam mê của mình!
Cập nhật thông tin chi tiết về Sự Khác Biệt Giữa #Define Và Const Trong C Là Gì? trên website Channuoithuy.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!