C++ Các biến và kiểu: Int, Char, Float, Double, Chuỗi & Bool
Các biến trong C++
A C++ biến cung cấp cho chúng ta khả năng lưu trữ được đặt tên. Nó cho phép lập trình viên thao tác dữ liệu theo nhu cầu. Mỗi biến có một kiểu C++Kiểu biến giúp xác định kích thước và bố cục của bản đồ bộ nhớ biến, phạm vi giá trị có thể được lưu trữ trong bộ nhớ đó và tập hợp các hoạt động có thể được áp dụng cho biến đó.
Các loại biến cơ bản trong C++
Sau đây là các loại cơ bản C++ biến:
số nguyên:
Số nguyên là một chữ số (được liên kết với các số) không có bất kỳ phần phân số hoặc hàm mũ nào. Ví dụ. 120, -90, v.v.
Double:
Đây là giá trị dấu phẩy động độ chính xác kép. Ví dụ: 11.22, 2.345
Biểu đồ:
Ký tự chữ được tạo bằng cách đặt một ký tự đơn bên trong dấu ngoặc đơn. Ví dụ: 'a', 'm', 'F', 'P', '}', v.v.
Phao nổi:
Chữ có dấu phẩy động là chữ số có dạng phân số hoặc dạng số mũ. Ví dụ: 1.3, 2.6
Chuỗi chữ:
Một chuỗi ký tự là một chuỗi các ký tự được đặt trong dấu ngoặc kép. Ví dụ: “Bạn khỏe không?”
Bool:
Nó giữ giá trị Boolean đúng hoặc sai.
Quy tắc khai báo biến trong C++
Dưới đây là một số quy tắc chung để đặt tên biến:
- A C++ tên biến chỉ có thể có chữ cái, số và dấu gạch dưới.
- A C++ tên biến không được bắt đầu bằng số.
- Tên biến không được bắt đầu bằng ký tự viết hoa.
- Tên biến được sử dụng trong C++ không thể là một từ khóa. Ví dụ: int là từ khóa được sử dụng để biểu thị số nguyên.
- A C++ tên biến có thể bắt đầu bằng dấu gạch dưới. Tuy nhiên, nó không được coi là một thực hành tốt.
C++ Các kiểu dữ liệu biến
C++ định nghĩa toàn bộ các kiểu nguyên thủy
làm mất hiệu lực type không có giá trị liên kết với nó và chỉ có thể được sử dụng trong một số trường hợp. Thông thường nhất là kiểu trả về của hàm không trả về giá trị.
các kiểu số học bao gồm các ký tự, số nguyên, giá trị Boolean và số dấu phẩy động. Loại số học nếu chia tiếp thành 2 loại
- Các loại dấu phẩy động. Kiểu float (hoặc kiểu float) biểu diễn số thập phân. Chuẩn IEEE chỉ định số lượng chữ số có nghĩa tối thiểu. Hầu hết các trình biên dịch thường cung cấp độ chính xác cao hơn mức tối thiểu được chỉ định. Thông thường, float được biểu diễn bằng 32 bit, double bằng 64 bit và long double bằng 96 hoặc 128 bit.
- Các loại tích phân (bao gồm ký tự, số nguyên và kiểu Boolean). Các Boolean type chỉ có hai loại giá trị: Đúng hoặc Sai. Có một số xe tăng hầu hết đều tồn tại để hỗ trợ quốc tế hóa. Kiểu ký tự cơ bản nhất là char. Một char có cùng kích thước với một byte máy đơn nghĩa là một byte đơn.
Các loại tích phân có thể được ký hoặc không được ký.
Loại đã ký: Chúng đại diện cho số âm hoặc số dương (kể cả số 8). Trong loại có dấu, phạm vi phải được chia đều giữa các giá trị +ve và -ve. Do đó, một char có dấu 127 bit sẽ giữ các giá trị từ –127 đến XNUMX.
Loại không dấu: Trong loại không dấu, tất cả các giá trị đều >= 0. Một char không dấu 8 bit có thể chứa 0 đến 255 (bao gồm cả hai).
Tên biến hoặc số nhận dạng
Mã định danh có thể bao gồm một số chữ cái, chữ số và ký tự gạch dưới hoặc sự kết hợp nào đó của chúng. Không có giới hạn nào được áp đặt cho độ dài tên.
Mã định danh phải
- bắt đầu bằng một chữ cái hoặc dấu gạch dưới ('_').
- Và phân biệt chữ hoa chữ thường; chữ hoa và chữ thường khác nhau:
// định nghĩa bốn biến int khác nhau
int guru99, gurU99, GuRu99, GURU99;
C++ ngôn ngữ đã dành một số tên cho việc sử dụng nó.
Có nhiều quy ước được chấp nhận để đặt tên biến trong các ngôn ngữ lập trình khác nhau. Việc tuân theo các quy ước này có thể cải thiện khả năng đọc của chương trình.
- Một mã định danh ít nhất phải đưa ra một số dấu hiệu về ý nghĩa của nó.
- Tên biến thường là chữ thường—guru99, không phải Guru99 hoặc GURU99.
- Các lớp chúng ta định nghĩa thường bắt đầu bằng một chữ cái viết hoa.
- Mã định danh chứa nhiều từ sẽ phân biệt trực quan từng từ. Ví dụ: guru99_website không phải guru99website.
C++ Khai báo và định nghĩa biến
Việc khai báo một biến sẽ làm cho chương trình biết tên trong phạm vi mà nó được xác định. Ví dụ:
int a=5; int b; char c='A';
int a,b; a=b=1000;
List initialization int a(5); int b{5};
Vòng loại Const ở C++
Giả sử có một biến buffsize cho biết số lượng đầu vào được lấy từ người dùng. Ở đây, chúng tôi không muốn thay đổi giá trị buffsize trong suốt chương trình. Chúng tôi muốn xác định một biến có giá trị mà chúng tôi biết sẽ không thay đổi.
Trong trường hợp đó, hãy sử dụng từ khóa const
const int bufSize = 512; // input buffer size
Điều này định nghĩa bufSize là một hằng số. Mọi nỗ lực gán hoặc thay đổi bufSize đều gây ra lỗi.
Ở đây, chúng ta không thể thay đổi giá trị của đối tượng const sau khi tạo nó, nó phải được khai báo và khởi tạo bắt buộc. Nếu không, trình biên dịch sẽ báo lỗi.
const int i = get_size(); // ok: initialized at run time const int j = 42; // ok: initialized at compile time const int k; // error: k is uninitialized const int i = 42; const int ci = i; // ok: the value in i is copied into ci
Phạm vi của các biến trong C++
Phạm vi là một phạm vi của chương trình trong đó một biến có ý nghĩa. Hầu hết cùng một tên có thể được sử dụng để chỉ các thực thể khác nhau trong các phạm vi khác nhau. Các biến được hiển thị từ thời điểm chúng được khai báo cho đến hết phạm vi mà khai báo của chúng xuất hiện.
#include <iostream> int main() { int sum = 0; // sum values from 1 through 10 inclusive for (int val = 1; val <= 10; ++val) sum += val; // equivalent to sum = sum + val cout << "Sum of 1 to 10 inclusive is "<< sum <<endl; return 0; }
Chương trình này định nghĩa 3 tên, tức là main, sum và val. Nó sử dụng tên không gian tên std, cùng với hai tên khác từ không gian tên đó—cout và endl.
- Tên hàm “main” được xác định bên ngoài dấu ngoặc nhọn. Tên hàm main—giống như hầu hết các tên khác được xác định bên ngoài hàm—có phạm vi toàn cục. Điều đó có nghĩa là một khi đã được khai báo, những cái tên ở vị trí phạm vi toàn cầu có thể truy cập được trong suốt chương trình.
- Biến sum được xác định trong phạm vi của khối là phần thân của hàm chính. Nó có thể được truy cập từ điểm khai báo của nó và xuyên suốt phần còn lại của phần thân hàm chính. Tuy nhiên, không nằm ngoài nó. Điều này có nghĩa là tổng biến có phạm vi khối.
- Biến val được xác định trong phạm vi của câu lệnh for for. Nó có thể dễ dàng được sử dụng trong câu lệnh đó nhưng không được sử dụng ở nơi khác trong hàm chính. Nó có phạm vi địa phương.
Phạm vi lồng nhau
Phạm vi có thể chứa các phạm vi khác. Phạm vi chứa (hoặc lồng nhau) được gọi là phạm vi bên trong. Phạm vi chứa là phạm vi bên ngoài.
#include <iostream> using namespace std; // Program for illustration purposes only: It is bad style for a function // to use a global variable and also define a local variable with the same name int reused = 42; // reused has global scope int main() { int unique = 0; // unique has block scope // output #1: uses global reused; prints 42 0 cout << reused << " " << unique << endl; int reused = 0; // new, local object named reused hides global reused // output #2: uses local reused; prints 0 0 cout << reused << " " << unique << endl; // output #3: explicitly requests the global reused; prints 42 0 cout << ::reused << " " << unique << endl; return 0; }
Đầu ra số 1 xuất hiện trước định nghĩa cục bộ về tái sử dụng. Vì vậy, đầu ra này
câu lệnh là câu lệnh sử dụng tên được sử dụng lại được xác định trong phạm vi toàn cầu. Tuyên bố này xuất ra
42 0
Đầu ra số 2 xảy ra sau định nghĩa cục bộ về việc sử dụng lại. Bây giờ nó nằm trong phạm vi. Do đó, câu lệnh đầu ra thứ hai này chỉ đơn giản sử dụng đối tượng cục bộ có tên được tái sử dụng thay vì đối tượng toàn cục và kết quả đầu ra
0 0
Đầu ra số 3 ghi đè các quy tắc phạm vi mặc định bằng cách sử dụng toán tử phạm vi. Phạm vi toàn cầu không có tên. Do đó, khi toán tử phạm vi(::) có phía bên trái trống. Nó diễn giải nó như một yêu cầu lấy tên ở phía bên phải của phạm vi toàn cục. Do đó, biểu thức sử dụng kết quả đầu ra và tái sử dụng toàn cục
42 0
Chuyển đổi loại biến
Một biến thuộc loại này có thể được chuyển đổi thành loại khác. Nó được gọi là "Chuyển đổi loại". Hãy xem các quy tắc chuyển đổi khác nhau C++ các loại biến:
Việc gán giá trị không phải bool cho một biến bool sẽ trả về false nếu giá trị là 0 và true nếu ngược lại.
bool b = 42; // b is true
Việc gán bool cho một trong các loại số học khác mang lại kết quả 1 nếu bool đúng và 0 nếu bool sai.
bool b = true; int i = b; // i has value 1
Việc gán một giá trị dấu phẩy động cho một biến kiểu int sẽ mang lại giá trị bị cắt bớt. Giá trị được lưu trữ là phần trước dấu thập phân.
int i = 3.14; // i has value 3
Việc gán giá trị int cho một biến kiểu float dẫn đến phần phân số trở thành 0. Độ chính xác thường bị mất nếu số nguyên có nhiều bit hơn biến số thực có thể chứa.
Int i=3; double pi = i; // pi has value 3.0
Nếu chúng ta cố gắng gán một giá trị ngoài phạm vi cho một biến có kiểu không dấu thì kết quả là phần còn lại của giá trị %(modulo)
Ví dụ: loại char không dấu 8 bit có thể chứa các giá trị từ 0 đến 255. Việc gán một giá trị ngoài phạm vi này sẽ dẫn đến việc trình biên dịch gán phần còn lại của giá trị đó theo modulo 256. Do đó, theo logic ở trên, việc gán –1 cho một char không dấu 8 bit sẽ mang lại cho đối tượng đó giá trị 255.
unsigned char c = -1; // assuming 8-bit chars, c has value 255
Nếu chúng ta cố gắng gán một giá trị ngoài phạm vi cho một đối tượng thuộc loại đã ký thì kết quả là không thể đoán trước được. Nó không được xác định. Chương trình có thể hoạt động ở bên ngoài hoặc có thể bị lỗi hoặc có thể tạo ra các giá trị rác.
signed char c2 = 256; // assuming 8-bit chars, the value of c2 is undefined
Trình biên dịch áp dụng cùng loại chuyển đổi này khi chúng ta sử dụng giá trị của một loại trong đó giá trị của loại khác được mong đợi.
int i = 42; if (i) // condition will evaluate as true i = 0;
Nếu giá trị này = 0 thì điều kiện là sai; tất cả các giá trị khác (khác 0) đều mang lại giá trị đúng. Theo khái niệm tương tự, khi chúng ta sử dụng bool trong biểu thức số học, giá trị của nó luôn được chuyển đổi thành 1 hoặc XNUMX. Kết quả là, việc sử dụng bool trong biểu thức số học thường gần như chắc chắn là không chính xác.
Thận trọng: Không trộn lẫn các loại đã ký và chưa ký
Các biểu thức trộn lẫn có dấu và không dấu có thể mang lại kết quả sai và đáng ngạc nhiên khi giá trị có dấu âm. Như đã thảo luận ở trên, các giá trị đã ký sẽ tự động được chuyển đổi thành không dấu.
Ví dụ: trong một biểu thức số học như
x* y
Nếu x là -1 và y là 1, đồng thời nếu cả x và y đều là số nguyên thì giá trị như mong đợi là -1.
Nếu x là int và y không dấu thì giá trị của biểu thức này phụ thuộc vào số bit của một số nguyên trên máy biên dịch. Trên máy của chúng tôi, biểu thức này mang lại 4294967295.
Đăng ký biến
Các biến đăng ký được truy cập nhanh hơn so với các biến bộ nhớ. Vì vậy, các biến thường được sử dụng trong C++ chương trình có thể được đưa vào sổ đăng ký bằng cách sử dụng ghi danh từ khóa. Từ khóa register yêu cầu trình biên dịch lưu trữ biến đã cho vào sổ đăng ký. Việc đưa nó vào sổ đăng ký hay không là lựa chọn của người biên dịch. Nói chung, bản thân các trình biên dịch thực hiện nhiều tối ưu hóa khác nhau bao gồm việc đưa một số biến vào sổ đăng ký. Không có giới hạn về số lượng biến đăng ký trong một C++ chương trình. Nhưng trình biên dịch có thể không lưu trữ biến trong sổ đăng ký. Điều này là do bộ nhớ thanh ghi rất hạn chế và được hệ điều hành sử dụng phổ biến nhất.
Định nghĩa:
register int i;
Nhận xét
Chú thích là những phần của mã bị trình biên dịch bỏ qua. Nó cho phép người lập trình ghi chú vào các phần liên quan của mã nguồn/chương trình. Nhận xét ở dạng khối hoặc dòng đơn. Các bình luận của chương trình là những câu giải thích. Nó có thể được bao gồm trong C++ mã giúp mọi người đọc mã nguồn của nó. Tất cả các ngôn ngữ lập trình đều cho phép một số dạng bình luận. C++ hỗ trợ cả bình luận một dòng và nhiều dòng.
- Nhận xét một dòng là những cái bắt đầu bằng // và tiếp tục cho đến cuối dòng. Nếu ký tự cuối cùng trong dòng chú thích là \ thì chú thích sẽ tiếp tục ở dòng tiếp theo.
- Bình luận nhiều dòng là những cái bắt đầu bằng /* và kết thúc bằng */.
/* This is a comment */ /* C++ comments can also * span multiple lines */
Trình tự thoát
Một số ký tự, chẳng hạn như ký tự xóa lùi và ký tự điều khiển, không có hình ảnh hiển thị. Những ký tự như vậy được gọi là ký tự không in được. Các ký tự khác (dấu ngoặc kép đơn và kép, dấu chấm hỏi và dấu gạch chéo ngược) có ý nghĩa đặc biệt trong nhiều ngôn ngữ lập trình.
Các chương trình của chúng tôi không thể sử dụng trực tiếp bất kỳ ký tự nào trong số này. Thay vào đó, chúng ta có thể sử dụng chuỗi thoát để biểu diễn char đó. Chuỗi thoát bắt đầu bằng dấu gạch chéo ngược.
C++ ngôn ngữ lập trình định nghĩa một số chuỗi thoát:
Nó làm gì? | Nhân vật |
---|---|
Dòng mới | \n |
Tab dọc | \v |
Dấu gạch chéo ngược | \\ |
Vận chuyển trở lại | \r |
Tab ngang | \t |
Backspace | \b |
Dấu chấm hỏi | \? |
Thức ăn dạng | \f |
Cảnh báo (chuông) | \a |
Double trích dẫn | \ ” |
Trích dẫn duy nhất | \ ' |
Chúng tôi sử dụng chuỗi thoát như thể nó là một ký tự đơn:
cout << '\n'; // prints a newline cout << "\tguru99!\n"; // prints a tab followed by "guru99!" and a newline
Chúng ta cũng có thể viết các chuỗi thoát tổng quát \x theo sau là một hoặc nhiều chữ số thập lục phân. Hoặc chúng ta sử dụng \ theo sau là một, hai hoặc ba chữ số bát phân. Chuỗi thoát tổng quát biểu thị giá trị số của ký tự. Một số ví dụ (giả sử bộ char Latin-1):
\7 (bell) \12 (newline) \40 (blank) \0 (null) \115 ('M') \x4d ('M')
Chúng ta có thể sử dụng các chuỗi thoát được xác định trước, giống như chúng ta đang sử dụng bất kỳ ký tự nào khác.
cout << "Hi \x4dO\115!\n"; // prints Hi MOM! followed by a newline cout << '\115' << '\n'; // prints M followed by a newline
Tổng kết
- A C++ biến cung cấp cho chúng ta khả năng lưu trữ được đặt tên.
- C++ các kiểu biến: int, double, xe tăng, float, chuỗi, bool, v.v.
- Phạm vi chứa (hoặc lồng nhau) được gọi là phạm vi bên trong và phạm vi chứa là phạm vi bên ngoài.
- Một biến thuộc loại này có thể được chuyển đổi thành loại khác. Nó được gọi là "Chuyển đổi loại".
- Các biến đăng ký được truy cập nhanh hơn so với các biến bộ nhớ.
- Chú thích là những phần của mã bị trình biên dịch bỏ qua.
- Một số ký tự, chẳng hạn như ký tự lùi và ký tự điều khiển, không có hình ảnh hiển thị.