Professional Documents
Culture Documents
u = x + z*y
Nội dung
• Mở đầu.
• Các kiểu dữ liệu.
• Định danh.
• Khai báo biến (Declaration of variables).
• Các hằng.
• Khởi tạo giá trị của biến ban đầu.
• …..
Mở đầu
• Để viết được chương trình thực hiện thêm nhiệm vụ có ích.
Giới thiệu khái niệm về biến (variables).
• Hãy tưởng tượng yêu cầu bạn nhớ số 5, sau đó cũng yêu cầu
bạn nhớ số 2. Bạn chỉ việc phải lưu hai giá trị khác nhau trong
bộ nhớ của bạn (5 và 2).
• Bây giờ yêu cầu bạn cộng số 1 vào số ban đầu. Bạn nên cất giữ
số 6 (6 = 5 + 1) và số 2 trong bộ nhớ của bạn.
• Tiếp theo trừ hai giá trị đó cho nhau và được kết quả là 4.
• Toàn bộ quá trình miêu tả ở trên là một sự đơn giản những gì
máy tính có thể làm đối với hai biến. Quá trình trên có thể
được biểu diễn trong C++ bằng một tập các câu lệnh sau:
a = 5; b = 2;
a = a + 1;
ketqua = a – b; // 4
Mở đầu
• Mục đích: Biến được sử dụng để lưu trữ dữ liệu cho quá trình
tính toán. Giá trị của biến có thể thay đổi một hoặc nhiều lần
khi một chương trình chạy và được gọi là biến bởi vì ta có thể
thay đổi giá trị lưu trữ.
• Biến là vị trí lữu trữ được đặt tên, có thể lưu trữ giá trị của
một kiểu nào đó. Nói cách khác: biến có KIỂU,TÊN và GIÁ TRỊ
lưu trữ.
1. Các kiểu dữ liệu
• Máy tính lưu trữ hàng tỷ số như vậy tại cùng một thời gian.
• Mỗi biến cần một tên để định danh nó (chứng minh thư –
identifies) và dùng để phân biệt biến này với biến khác.(miễn
là định danh hợp lệ).
• Ví dụ: Chương trình sau tạo:
- Một biến gọi là value, đặt cho value một giá trị 1023.
- Và hiện lên màn hình thông báo:
Chuong trinh in gia tri Value = 1023.
• int value; // khai bao bien nguyen
value = 1023; // bien duoc gan gia tri 1023
cout<<"Chuong trinh in gia tri Value = ";
cout<<value<<endl; // hien len man hinh 1023
• Khai báo biến như thế nào? (mẫu khai báo biến)?
• Có các loại kiểu biến nào? Lưu trữ bộ nhớ như thế nào?
• Tên của biến - định danh, viết thế nào là hợp lệ?
• Khởi tạo – gán giá trị ban đầu, hoặc không gán thì như thế nào?
• Biến thay đổi – biến const.
int a; cout<<a<<endl; a = ?
... …. ...
Kiểu (type) của biến
Giống toán: N, Z, Q, R, và R
2. Định danh
2.1. Tập ký tự dùng trong ngôn ngữ C/C++ (Character set)
• Mọi ngôn ngữ được xây dựng từ một bộ ký tự nào đó. Các ký tự
nhóm lại để lập nên các từ (dãy kí tự viết liền nhau)
• Ngôn ngữ C/C++ được xây dựng trên bộ kí tự sau:
+ 26 chữ cái hoa: A, B, C,…,Z.
+ 26 chữ cái thường a, b, c,…,z.
+ 10 chữ số: 0, 1, 2, …,9.
+ Các ký tự toán học: + - * / = ().
+ Ký tự gạch nối: _ (chú ý phân biệt với dấu -)
+ Các ký tự đặc biệt: . ; : [] {} ? ! \ & | %, @,...
+ Khoảng trắng (whitespace): dấu cách, \t (tab), ký tự
xuống dòng \n.
+ Dấu cách (space): một khoảng trống dùng để tách các từ.
Ví dụ
• C++ hay bất kỳ ngôn ngữ lập trình nào khác, đều có sẵn một
số các từ khóa do người tạo ra ngôn ngữ đó định nghĩa sẵn.
• Mỗi từ khóa có một ý nghĩa riêng. C++ có khoảng 85 từ khóa
alignas, alignof, and, and_eq, asm, auto, bitand, bitor,
bool, break, case, catch, char, char16_t, char32_t, class, compl,
const, constexpr, const_cast, continue, decltype, default, delete,
do, double, dynamic_cast, else, enum, explicit, export, extern,
false, float, for, friend, goto, if, inline, int, long, mutable,
namespace, new, noexcept, not, not_eq, nullptr, operator, or,
or_eq, private, protected, public, register, reinterpret_cast,
return, short, signed, sizeof, static, static_assert, static_cast,
struct, switch, template, this, thread_local, throw, true, try,
typedef, typeid, typename, union, unsigned, using, virtual, void,
volatile, wchar_t, while, xor, xor_eq
• Định danh (Tên): là một chuỗi các ký tự, dùng để xác định các đại
lượng khác nhau trong một chương trình như: tên hằng, tên biến,
tên mảng, tên hàm, tên con trỏ, tên tệp, tên cấu trúc,…
• Định danh (Tên) được đặt theo qui tắc:
+ Tên là một dãy các ký tự : chữ, số và dấu gạch nối(_) (không
gạch ngang -)
+ Ký tự đầu tiên: phải là chữ hoặc gạch nối (_).
+ Tên không được trùng với từ khóa (keyword).
+ Không bắt đầu bằng số, không chứa ký tự có gạch chân (U)
+ Các khoảng trống, hệ thống chấm câu, và các ký hiệu
(symbol - [] {}?! \&|%...) không thuộc phần định danh.
+ Độ dài của tên mặc định là 32 ký tự. (thay đổi theo biên
trình dịch lên đến 255 ký tự).
2.3. Định danh
• CHÚ Ý với biến không có khởi tạo ban đầu tức là không có dạng
// int number = 10;
• THÌ IN ra số bất kỳ (RÁC)
int number; // khai báo nhưng không khởi tạo ban đầu
cout<<number<<endl; // in ra số bất kỳ (rác)
Ví dụ
k Bắt đầu
n
m
• k – độ cứng lò xo (N/m) k, m
• m – khối lượng của vật (kg).
int main(){
double stiffnessK, massM, omega; = sqrt(k/m)
omega = sqrt(stiffnessK/massM);
}
Bắt đầu
b) vị trí biến có thể được đặt khai báo: (3 vị trí)
Bên trong các hàm (local variable – biến cục bộ - biến địa
phương)
Trong định nghĩa các tham số hàm.(tham số hình thức – formal
parameters ) ( là các biến cục bộ nhận giá trị của đối được truyền
cho hàm)
Bên ngoài các hàm (biến toàn cục global variables)
#include<iostream>
int func (int a, int b) // Tham so hinh thuc
int count; // global variable
int main() { {
int value; // bien cuc bo
return 0;
}
* Khai báo linh hoạt hơn C: C++ cho phép trộn lẫn các khai báo dữ liệu với các hàm và chương trình
thực hiện
Thuộc tính của biến (2 thuộc tính)
a) Biến cục bộ
• Biến định nghĩa bên trong một hàm (định nghĩa bên trong
thân hàm giữa các ngoặc {} ) được gọi là biến cục bộ hoặc là
biến tự động (automatic variable).
• Phạm vi: chỉ giới hạn trong hàm đó nơi mà nó định nghĩa. Biến
cục bộ tồn tại và chỉ có thể truy cập bên trong hàm.
• Thời gian tồn tại: biến cục bộ kết thúc khi hàm kết thúc.
b) Biến toàn cục
• Biến định nghĩa bên ngoài toàn bộ hàm gọi là biến toàn cục.
• Phạm vi: là toàn bộ chương trình, nghĩa là nó có thể được sử
dụng và bị thay đổi tại bất kỳ phần nào của chương trình sau
khai báo của nó.
Thuộc tính của biến
• Tồn tại: chỉ trong một hàm, nơi khai báo (tương tự như biến
địa phương) nhưng thời gian tồn tại của nó khi hàm được gọi
và chỉ kết thúc khi chương trình kết thúc.
• Sự khác biệt giữa biến cục bộ và biến tĩnh (static) là: giá trị của
biến tĩnh tiếp tục tồn tại đến khi kết thúc chương trình.
Ví dụ sử dụng static
#include<iostream> Gia tri hien thoi cua num = 3
void count(int i); Gia tri hien thoi cua num = 7
int main() {
count(3);
count(4);
// cout<<num<<endl; khong the truy cap duoc (cuc bo)
return 0;
}
void count(int i) {
static int num = 0;
num +=i;
cout<<"Gia tri hien thoi cua num = "<<num<<endl;
}
• Khai báo static: chỉ được khởi tạo 1 lần duy nhất và tồn tại
suốt thời gian chạy của chương trình. Giá trị của biến num sẽ
được tích luỹ mỗi khi hàm count được gọi.
• Biến num là 1 biến cục bộ (local variable).
4. Hằng (literals)
• Hằng là một giá trị cụ thể (123, -456, 3.14, ‘a’, “Hello”) có thể
gán trực tiếp cho một biến; hoặc là sử dụng như một phần
của một biểu thức.
• Các đại lượng này có giá trị không thay đổi trong quá trình
tính toán.
• Ví dụ: int number = -123;
int sum = 4567;
int bigSum = 8234567890; // lỗi, giá trị này vượt qua giới hạn
int number2 = 01234// octal 1234, hệ số 10: 2322
int number3 = 0x1abc; // hexadecimal 1ABC, decimal: 15274
a) Hằng dấu phẩy động (float và double)
• Nếu giá trị vượt rải khai báo – tràn bộ nhớ trên hoặc tràn bộ
nhớ dưới.
• Khi đó: kết quả của quá trình là các giá trị nháp (rác) làm tròn
nào đó.
• C++ không đưa ra lời cảnh báo/hoặc là lỗi nào cả nhưng tạo ra
một kết quả sai.
• Do đó, người lập trình phải chịu trách nhiệm kiểm tra sự tràn
nhớ trên/dưới.
• Ví dụ: // Dai kieu int [-2147483648, 2147483648]
int i1 = 2147483647; // max int = INT_MAX
cout<<"overflow: i1 + 1 = "<< i1 + 1<<endl; //-2147483648
cout<<"Ket qua khong chinh xac: i1*i1 = "<<i1*i1<<endl; // 1
c) Hằng int hệ số 8 và hệ số 16
• Hệ octal (cơ số 8): số được đặt trước với một ký tự 0 (zero).
0c1c2…. với, ci – là số nguyên trong khoảng từ 0 đến 7.
• Hệ hexa (cơ số 16): được đặt trước bởi ký tự 0x (zero, x).
0xc1c2.
• (sử dụng 16 ký tự: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) để tránh
nhầm lẫn giữa số 11
• Ví dụ: int number2 = 071263;
• int number3 = 0xA2F7;
Ví dụ (mở rộng làm thêm – ra giấy)
75 // decimal 75 = 7101 + 5100. // he co so 10
0113 // octal 75 = 182 + 181 + 380.// he co so 8
0x4b // hexadecimal 75 = 4161 + 11160. // he co so 16
• Chương trình chuyển đổi cơ số 10 sang cơ số 8 (octal).
Xanh: phần dư
Tím: cơ số 8 (octal) 16 8
Đỏ: phần nguyên chia tiếp cho 8 16 2 8
Hướng mũi tên: Viết ngược lên.
(16)10 = (20)8 hay 020 0 0 0
Chú ý:
2
(phần dư sau gấp phần dư trước 10 lần)
+ Hằng ký tự (Character literal):
là một ký tự riêng biệt được viết trong 2 dấu nháy đơn:
Ví dụ: 'a', giá trị của 'a' là 97: theo bảng mã ASCII.
- Hằng ký tự có thể tham gia vào các phép toán như mọi số
nguyên khác:
Ví dụ: '9' - '0' = 57 – 48 = 9. (STT mã)
- Hằng ký tự còn có thể viết theo cách khác: '\c1c2c3'
Với: c1c2c3 là hệ 8 của nó = mã ASCII của ký tự cần biểu diễn:
Ví dụ: chữ a có hệ 10 là 97 mã 8 là 0141 vậy hằng ký tự a có
thể viết dưới dạng là: '\141‘ (tức là bỏ 0 (zero))
hệ cơ số 16: một ký tự x được chèn giữa dấu gạch ngang và số hệ
cơ số 16 (ví dụ chữ a trong hệ 16: \x61)
example
Ví dụ
• https://en.cppreference.com/w/cpp/header/climits
#include<cstdlib>
#include<climits>
using namespace std;
int main(){
cout<<"int max = "<<INT_MAX<<endl;
cout<<"int min = "<<INT_MIN<<endl;
return EXIT_SUCCESS;
}
Một vài hằng ký tự đặc biệt
• Ba từ khóa bằng chữ tồn tại trong C++: true, false và nullptr
true và false là hai giá trị có thể của biến kiểu bool.
bool foo = true; bool bar = false;
cout<<true<<false<<endl; // in ra 1 và 0
int* p = nullptr; // nullptr là giá trị con trỏ null.
• Lệnh khai báo biến hằng Tên hằng:
Định nghĩa bộ tiền xử lý (Preprocessor definitions) : (#define)
Cú pháp: #define identifier replacement
#define PI 3.141516 // Không có thông tin kiểu
• Ví dụ:
Ví dụ: khai báo hằng sử dụng từ khóa: const
• Giá trị không thay đổi trong quá trình chạy, sử dụng const cần
phải khởi gán trong khi khai báo.
const double PI = 3.14159;
const char newline = '\n';
int main (){
double radius = 5.0;
double circleArea;
circleArea = 2 * PI * radius;
cout << circleArea;
cout << newline;
}
OUTPUT:31.4159
• Khi các biến trong ví dụ trên được khai báo, chúng có giá trị
không xác định đến khi chúng được gán giá trị lần đầu.
• Nhưng biến có giá trị xác định tại thời điểm khai báo được
gọi là khởi tạo giá trị ban đầu của biến.
• Biến toàn cục có giá trị khởi động theo bảng sau
• Còn biến cục bộ có giá trị bất kỳ. (trừ char) vậy = ? (VNXEM)
Ví dụ
int X;
char ch;
int main() {
// bien cuc bo
int a;
char b;
cout<<"Gia tri khoi dau cua bien toan cuc X = "<<X<<endl;
cout<<"Gia tri khoi dau cua bien toan cuc char ch "<<int(ch)<<endl;
cout<<"Gia tri khoi dau cua bien cuc bo a = "<<a<<endl;
cout<<"Gia tri khoi dau cua bien cuc bo char b = "<<int(b)<<endl;
}
6. Qui tắc chuyển kiểu tự động (đối với 2 toán hạng khác nhau)
#include<iostream>
using namespace std;
int main() {
float e;
e = 15/4; // int 15/int 4 = int 3
// Biểu thức cho kết quả đúng
e = 15.0/4.0;
cout<<"Gia tri cua e = "<<e<<endl;
return 0;
}
• Chú ý: Vế phải phải phù hợp với vế trái
Một số chú ý
• Muốn có giá trị chính xác trong phép chia 2 số nguyên cần dùng phép ép kiểu.
• Ví dụ:
int a = 5;int b =2; float c;
c = a/b; // c = 2.0 chuyen sang kieu ve trai tuc la c la (int)
c = ((float)a)/b;// luc nay a chuyen thanh float 5.0, b (int) kiểu float
sau đó kết quả = 2.5 (float) và gán cho c = 2.5.
• Để đổi giá trị thực r sang giá trị nguyên, nên dùng: (int)(r+0.5)
• chú ý đến thứ tự ưu tiên: (int)1.4*10 = 1*10 = 10;
(int)(1.4*10)=(int)14.0=14. // () trước, sau (type)
• Cách viết ép kiểu sau là tương đương
int i;
float f = 3.14;
i = (int) f; // cach viet nay
i = int (f); // i = f; // i = 3;
// tuong duong cach viet tren nghia là dong ngoac khac nhau, nhung cung can than
Ví dụ
#include <iostream>
int main() {
int X = 200;
//Chuyen doi kieu theo cach cua C
long Y = (long) X;
//Chuyen doi kieu theo cach moi cua C++
long Z = long(X);
cout<< "X = "<<X<<"\n";
cout<< "Y = "<<Y<<"\n";
cout<< "Z = "<<Z<<"\n";
}
Ép kiểu
• static_cast <type-id> (expression )
Ví dụ:
• float afloat = 5.61;
• cout<<"static_cast<int>: "<<static_cast <int>(afloat)<<endl;
Toán tử - operator
• Toán tử: là một ký hiệu (symbol) nói cho compiler thực hiện
thao tác toán học hoặc logic cụ thể.
• Biểu thức: là sự kết hợp các toán tử và toán hạng (biến hoặc
giá trị hằng) có thể được ước lượng để sinh ra một giá trị của
một kiểu nào đó.
• Ví dụ: 1 + 10 *5 // = 51;
int sum, number; sum + number;
• Để đánh giá đúng một biểu thức chứa nhiều toán tử: chúng ta
phải biết mỗi toán tử trong biểu thức đó thực hiện công việc
gì, và thứ tự mà chúng thực hiện.
7. Toán tử (operator)
x = 3; y = ++x; x = 3; y = x++;
Tăng (viết tắt) //x =x+3 // x= x+3, // x = 4, y =
++ Increment (thêm điền tố - // x=4, y=4 3
hậu tố) x tăng rồi gán cho biến y y gán bằng 3 xong,
x tăng sau: x = 4.
x = 3; x = 3;
y = --x;//x =x-3 y = x--; // x= x-3
-- Decrement Giảm (viết tắt) // x=2, y=2 // x = 2, y = 3
x giảm trước rồi gán cho y gán bằng 3 xong,
biến y x gảm sau: x = 2.
Toán tử tăng/giảm (++/--)
- (âm)
* / %
Thấp nhất + -
• y = 3 +4 % 5 – 6; = 3+ (4%5)-6 = 3 + (dư) 4 – 6 = 1
• y = -4 *3 % -6/5 = (-4*3)%(-6/5) = (-12)%(-1.2)= 10 dư 0
• y = (7 + 6) % 5 / 2 = 13%5/2 = 13%2.5 = (13/2 = 6 dư 1) (int)
b) toán tử quan hệ và so sánh
operator description Ví dụ
Thấp nhất == !=
c) Toán tử logic (Logical operators ( !, &&, || ))
0 0 0 0 1
0 1 0 1 1
1 1 1 1 0
1 0 0 1 0
== != Quan hệ
&& Logic
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0
Ví dụ
• Phép dịch trái (Shl): x << i cho giá trị nhận được từ số nguyên
x sau khi dịch số đó qua trái i bit.
• Quy tắc: Muốn nhân 1 số với 2 ta dịch số đó qua trái 1 bit.
Tổng quát, muốn nhân một số nguyên với 2^i ta dịch số đó
qua trái i bit;
• x << i = x*n; (với n=2^i), (dịch phải: x>>I = x/n)
• Ví dụ:
• char x, y; // int x,y;
• x = 19; //x=00010011//
• y = x << 2; //y=01001100 = x*(22=4)=76// do là kiểu char
• cout<<y; // output L (tra bảng ASCII) (y = x>>2; = 19/(2^2) = 4
Thứ tự ưu tiên của các phép toán
Level Precedence group Operator Description Grouping
1 Scope :: scope qualifier Left-to-right
++ -- postfix increment / decrement
() functional forms
2 Postfix (unary) Left-to-right
[] subscript
. -> member access
++ -- prefix increment / decrement
~! bitwise NOT / logical NOT
+- unary prefix
3 Prefix (unary) &* reference / dereference Right-to-left
new delete allocation / deallocation
sizeof parameter pack
(type) C-style type-casting
4 Pointer-to-member .* ->* access pointer Left-to-right
5 Arithmetic: scaling */% multiply, divide, modulo Left-to-right
Tiếp
6 Arithmetic: addition +- addition, subtraction Left-to-right
7 Bitwise shift << >> shift left, shift right Left-to-right
8 Relational < > <= >= comparison operators Left-to-right
9 Equality == != equality / inequality Left-to-right
10 And & bitwise AND Left-to-right
11 Exclusive or ^ bitwise XOR Left-to-right
12 Inclusive or | bitwise OR Left-to-right
13 Conjunction && logical AND Left-to-right
14 Disjunction || logical OR Left-to-right
= *= /= %= += -= assignment / compound
Assignment-level >>= <<= &= ^= |= assignment
15 Right-to-left
expressions
?: conditional operator
16 Sequencing , comma separator Left-to-right
Giải thích
• Các phép toán trên cùng một dòng có cùng thứ tự ưu tiên, các phép
toán hàng trên có thứ tự ưu tiên cao hơn các phép toán hàng dưới.
• Các phép toán cùng mức ứu tiên thì trình tự tính toán có thể từ trái
sang phải hay ngược lại
Ví dụ: *--px = *(--px) (phải qua trái)
• Để viết biểu thức một cách chính xác nên dụng các dấu ngoặc tròn.
Khoảng trống và ngoặc
• Biểu thức có thể có dấu tab và khoảng trống để dễ đọc hơn.
• Sử dụng khoảng cách hoặc thêm các ngoặc tròn không gây lỗi và
làm chương trình chậm hơn.
x = y/3-34*temp&127 viết thành x = (y/3) – ((34*temp) & 127)
x=10/y*(127/x); có thể viết x = 10 / y * (127/x);
• Cho phép viết: x-- - --x hoặc (x--) – (--x) không cho viết x-----x
x++ + ++x hoặc (x++) + (++x) không cho viết x+++++x
Toán tử điều kiện tổ hợp bộ 3 (?) (toán tử điều kiện)
• Cú pháp: condition ? result1: result2
• Nếu điều kiện (condition) là true, toàn bộ biểu thức được gán
giá trị result1 và trái lại là result2.
• Ví dụ:
int main () {
int a,b,c;
a = 5;
b = 7;
c = (a>b) ? a : b; // (a<b) ? a : b; // ket qua = ?
cout << c << '\n';
} output: 7
Tìm min, max: của hai số
Toán tử sizeof:
• Cho kích cỡ (theo byte) của một kiểu dữ liệu.
Chương trình đưa ra kích cỡ chính xác kiểu dữ liệu trên máy tính của
bạn.
int main() {
cout << "Kich co cua char la: " << sizeof(char) << “byte”<< endl;
cout << "Kich co cua int la: " << sizeof(int) << “byte”<< endl;
cout << "Kich co cua short int la: " << sizeof(short int) << “byte”<< endl;
cout << "Kich co cua long int la: " << sizeof(long int) << “byte”<< endl;
cout << "Kich co cua float la: " << sizeof(float) << “byte” << endl;
cout << "Kich co cua double la: " << sizeof(double) << “byte” << endl;
cout << "Kich co cua wchar_t la: " << sizeof(wchar_t) << “byte” << endl;
return 0;}
Output:
Kich co cua char la: 1 byte
Kich co cua int la: 4 byte
Kich co cua short int la: 2 byte
Kich co cua long int la: 4 byte
Kich co cua float la: 4 byte
Kich co cua double la: 8 byte
Kich co cua wchar_t la: 4 byte
Giới thiệu xâu ký tự (string)
• Chú ý : chèn ký tự điều khiển endl (ends the line) (in một ký tự
xuống dòng (newline) và làm sạch stream) (Xem Tuần 5 –
celog)
• Lớp string là một kiểu kết hợp. Sử dụng giống như kiểu cơ
bản: cùng cú pháp được sử dụng để khai báo biến và khởi tạo
ban đầu.
• Một số hàm cơ bản liên quan đến string
• http://www.cplusplus.com/reference/string/string/
• example
Mở rộng: Kiểu suy diễn - auto và decltype
• Khi biến mới được khởi động, compiler sẽ chỉ ra kiểu của biến một
cách tự động bằng giá trị khởi tạo. Đối với mục đích này, để đáp
ứng nhu cầu sử dụng auto như là kiểu định biến.
int foo = 0;
auto bar = foo; // the same as: int bar = foo;
• Ở đây bar được khai báo kiểu auto, kết quả là kiểu của bar là kiểu
của giá trị được sử dụng khởi đầu của biến, trong trường hợp này
nó sử dụng kiểu của foo, kiểu int.
• Các biến không có kiểu khởi tạo ban đầu cũng có thể sử dụng kiểu
suy diễn với khai báo decltype
int foo = 0;
decltype(foo) bar; // the same as: int bar;
• Ở đây bar được khai báo có kiểu giống như foo.
Mở rộng: Kiểu suy diễn - auto và decltype
• auto và decltype là: một thuộc tính mạnh gần đây được thêm
vào ngôn ngữ. Nhưng thuộc tính suy diễn kiểu chúng giới
thiệu phương pháp sử dụng trong trường hợp nâng cao khả
năng dễ đọc và trong trường hợp kiểu không thể nhận được
bằng phương pháp khác.
auto decltype
int foo = 0; int foo = 0;
// the same as: int bar = foo; // the same as: int bar;
auto bar = foo; decltype(foo) bar;
Bảng mã ASCII
• Output: a
• 97
Bảng mã ASCII