Xin chào và chào mừng.
Trong bài giảng này, tôi muốn nói về một vài toán tử hơi lạ theo nghĩa mà
bạn không nhất thiết nghĩ chúng là toán tử.
Bởi vì tất cả các toán tử mà chúng tôi đã học cho đến thời điểm này thực sự chỉ cho bạn biết loại
sử dụng ký hiệu để thực hiện các phép tính trên các con số.
Và các toán tử này thực sự giống như các hàm.
Vì vậy, hãy nói về ép kiểu trong toán tử sizeof.
Trước tiên, để nói về toán tử ép kiểu, tôi
phải cho bạn biết một chút về chuyển đổi kiểu, cách dữ liệu được chuyển đổi.
Chúng tôi đã tìm hiểu tất cả về các kiểu dữ liệu và các kiểu dữ liệu khác nhau ở đó.
Nhưng nếu bạn thực sự đang cố gắng gán dữ liệu cho các kiểu khác nhau,
thì sẽ có một số chuyển đổi ngầm diễn ra trong ngôn ngữ lập trình c.
Vì vậy việc chuyển đổi dữ liệu giữa các kiểu khác nhau có thể diễn ra tự
động và điều này được gọi là chuyển đổi ngầm
định bởi ngôn ngữ hoặc một cách rõ ràng bởi chương trình bởi chương trình hoặc.
Bản thân lập trình viên, nhà phát triển có thể làm điều gì đó.
Về cơ bản, họ có thể sử dụng toán tử ép kiểu để thực hiện chuyển đổi.
Dữ liệu đang được chuyển đổi ngầm thực sự quan trọng
vì bạn phải hiểu điều này bởi vì hầu hết các chương trình c
mà bạn sẽ phát triển để phát triển chúng một cách hiệu quả, bạn phải hiểu các
quy tắc này cho những chuyển đổi này.
Bởi vì bạn sẽ thường có số nguyên và số dấu phẩy
động, số thập phân và số nguyên.
Và đôi khi bạn sẽ sử dụng chúng trộn lẫn chúng.
Và khi bạn làm vậy, bạn phải biết mọi thứ đang được chuyển đổi như thế nào.
Bây giờ bạn nên cố gắng tránh điều đó nhiều nhất có thể bằng cách sử dụng toán tử ép kiểu.
Nhưng khi bạn không sử dụng toán tử ép kiểu, hãy hiểu điều gì đang xảy ra.
Và điều gì đang xảy ra ở đây khi bạn gán dữ liệu cho
các loại float và double khác nhau,
dữ liệu sẽ bị cắt bớt hoặc sẽ được thăng cấp.
Đây là hai thuật ngữ mà bạn sẽ nghe.
Các phương tiện bị cắt ngắn trở nên kém chính xác
hơn và được quảng bá có nghĩa là nó trở nên chính xác hơn.
Vì vậy, cố gắng không trộn những loại này nhưng chúng có thể hữu ích.
Điều chính cần hiểu là chúng ta biết từ các bài giảng trước đó rằng c rất linh hoạt.
Và đó là một quyết định có ý thức của các nhà thiết kế ngôn ngữ.
Khi họ muốn nó linh hoạt nhưng lại là một sự đánh đổi, vì sự tự do
bổ sung này được trao cho bạn, bạn
có thể lạm dụng nó. Và vì vậy đừng lạm
dụng ý tưởng pha trộn các loại này.
Cố gắng sử dụng các loại tương tự khi bạn có thể, số nguyên với số nguyên, số nổi với số nổi.
Nhưng khi bạn không
thể, hãy hiểu các chuyển đổi ngầm định hoặc thực hiện các chuyển đổi
rõ ràng bằng cách sử dụng toán tử truyền.
Vì vậy, một lần nữa, một vấn đề
khác hoặc một khái niệm khác trong đó c là linh hoạt, nhưng bạn không nên lạm dụng nó.
Vì vậy, bất cứ khi nào một giá trị dấu phẩy động được gán cho một
biến số nguyên trong c, vì vậy bạn có int x,
float y, x bằng y.
Phần thập phân của số sẽ bị cắt bớt.
Vì vậy, nếu bạn có một số int x bằng 0,
float f bằng 12. 125 và bạn gán
f cho x, giá trị của x sẽ là 12.
Bạn sẽ mất độ chính xác đó. Giá trị sẽ bị cắt bớt vì
bạn đang gán một số float cho một số int. Một int chỉ biết cách lưu trữ một số nguyên.
Vì vậy, nó sẽ tự động được chuyển đổi bởi ngôn ngữ lập trình, bởi trình biên dịch thành 12.
Chỉ nhập sẽ được lưu trữ.
Bây giờ nếu bạn gán một biến số nguyên cho một biến dấu phẩy động, điều này ngược lại, nó không
gây ra bất kỳ thay đổi nào về giá trị của số.
Giá trị được chuyển đổi bởi hệ thống và được lưu trữ trong biến động.
Vì vậy, bạn không thực sự phải lo lắng về việc gán nó thành một luồng.
Nếu bạn gán 12 cho một luồng, nó vẫn sẽ là 12, chỉ là 12. 0.
Khi bạn thực hiện số học trên các số nguyên và vì
vậy điều này khác với việc chỉ gán các giá trị gán nó vào float hoặc float cho int, đây là khi
bạn có một biểu thức, bạn đang thực
hiện một số phép cộng một số phép trừ, bất kể trường hợp nào xảy ra.
Khi bạn đang thực hiện một phép trừ hoặc một phép cộng, bạn có hai toán hạng.
Và vì vậy một toán tử có thể là int, một toán hạng có thể là float.
Bạn phải biết chuyển đổi đang diễn ra như thế nào.
Vì vậy, nếu bạn có hai toán hạng trong một biểu thức và chúng đều là
số nguyên, thì bất kỳ phần thập phân nào sinh ra từ phép toán chia đều bị loại bỏ.
Vì vậy, nếu bạn làm nếu bạn có một số nguyên x, đó là 20.
Bạn có một số nguyên y, nó là 12. Và bạn chia 20 cho 12.
Bạn sẽ không nhận được 1 điểm một cái gì đó một cái gì đó. Bạn sẽ chỉ nhận được 1.
Nó sẽ loại bỏ tất cả các kết quả và đặt nó một kết quả mới bởi vì một lần nữa, một int chỉ lưu trữ một số nguyên.
Vì vậy, hai số là số nguyên và chúng đang thực hiện phép chia.
Bạn sẽ không nhận được một số dấu phẩy động. Bạn sẽ không nhận được một số thập phân.
Bây giờ nếu một toán tử là int và toán tử kia là float, thì hoạt động sẽ
được hình thành như một phép toán dấu phẩy động. Vì vậy, nếu bạn có float f là 20. 0, float a là 10, int,
sau đó nếu bạn thực hiện phép chia ở đó
hoặc 12, tôi xin lỗi vì điều đó sẽ áp dụng hơn, khi đó kết
quả sẽ là số dấu phẩy động và kết quả sẽ
là 1 điểm 8888 hoặc bất cứ điều gì đó là 1 điểm, bất kể
trường hợp nào xảy ra.
Bạn không gán dữ liệu này cho bất kỳ thứ gì. Đây là một biểu thức mà nó sẽ trả về.
Vì vậy, hai số nguyên trong một phép chia, nó sẽ là một số nguyên.
Một int và double hoặc float, nó sẽ luôn là một float, nó sẽ luôn là một phép
toán dấu phẩy động số thập phân.
Và đây là sự chuyển đổi ngầm. Đó thực sự là những gì bạn cần hiểu
những gì đang xảy ra và chương trình sẽ thực hiện cho bạn nếu bạn không làm gì cả.
Tuy nhiên, bạn nên thử thực hiện một số
chuyển đổi rõ ràng, điều này bạn có thể làm với toán tử truyền.
Và điều này chỉ được gọi là đúc nhiều hơn hoặc ít hơn.
Và bạn thấy truyền ở nhiều ngôn ngữ khi bạn muốn chuyển đổi.
Và tất cả những gì bạn đang thực hiện chuyển
đổi rõ ràng, bạn đang nói những gì bạn muốn dữ liệu.
Vì vậy, bạn muốn làm điều này nếu có thể vì nếu
không dữ liệu có thể bị giảm hạng, nó có thể bị mất.
Nếu bạn thực hiện hai int và bạn đang thực hiện phép
chia và chúng không được chia đều, bạn sẽ mất tất cả dữ liệu đó.
Vì vậy, bạn có thể yêu cầu chuyển đổi loại chính xác mà bạn muốn
bằng cách chỉ định rõ ràng nó.
Điều này được gọi là ép kiểu và nó bao gồm số
lượng đứng trước tên của loại mong muốn trong ngoặc đơn.
Vì vậy, dấu ngoặc và
tên kiểu được tạo thành toán
tử cap.
Bạn thực hiện một dấu ngoặc trái và sau đó bạn chỉ định kiểu dữ liệu và sau đó viết dấu ngoặc.
Và đó là sẽ chuyển đổi bất cứ thứ gì ở bên phải của
nó, bất kể biểu thức nào ở bên phải của nó hoặc thậm chí nếu nó chỉ là một biến duy nhất,
nó sẽ chuyển đổi nó thành những gì từng có bên trong dấu ngoặc đơn.
Vì vậy, loại thực tế được mong muốn chẳng hạn như dài, nó được thay thế cho loại từ đó.
Vì vậy, toán tử kiểu được truyền có mức độ ưu tiên cao hơn tất cả các toán tử số học ngoại trừ
phép trừ đơn nhất và cộng hợp nhất. Chúng tôi vẫn chưa tìm hiểu về mức độ ưu tiên.
Chúng ta sẽ nói trong bài giảng tiếp theo. Mức độ ưu tiên về cơ bản là
những gì sẽ xảy ra, thứ tự của các hoạt động được thực hiện.
Vì vậy, chúng tôi sẽ cung cấp một số ví dụ về điều đó. Tất cả những gì bạn phải hiểu tại thời điểm này
là toán tử typecast được ưu tiên hơn mọi toán tử khác, ngoại trừ hai phép trừ một bậc và cộng một bậc.
Vì vậy, ví dụ ở đây, chúng ta có một số 21. 51 và chúng ta có toán tử
ép kiểu vì chúng ta biết đó là toán tử ép kiểu vì nó nằm
trong ngoặc đơn và nó có một kiểu. Và những gì chúng ta đang nói về
cơ bản là lấy 21. 51 chuyển đổi nó thành một int.
Nếu bạn lấy một số dấu phẩy động chuyển
đổi sang nó, nó chỉ trở thành số nguyên, 21.
Nó tương tự như vậy ở phía bên phải, nó đang chuyển đổi 26. 99 đến một số nguyên.
Vì vậy, điều gì sẽ thực sự xảy ra ở đây nếu bạn thực hiện biểu thức này trong một câu lệnh, nó
sẽ được đánh giá là 21 cộng với 26. Nó sẽ cắt bớt dữ
liệu từ 0. 51 đến một số nguyên và giống với 0. 99.
Và đó là toán tử ép kiểu, bất kỳ thứ gì bên trong dấu ngoặc đơn có chứa kiểu dữ liệu.
Bạn sẽ thấy điều này rất nhiều.
Nếu bạn nói 21 cộng với 26 và bạn chuyển nó thành phao, nó sẽ chỉ
thêm một dấu chấm 0.
Thông thường, bạn không truyền đến một loại chính xác hơn vì bạn
sẽ không chính xác hơn.
Bạn truyền từ loại chính xác hơn sang loại kém chính xác hơn.
Vì vậy, giống như một phao đối với một số nguyên.
Vì vậy, thỉnh thoảng bạn sẽ thấy điều này trong một số chương trình khi bạn
đang sử dụng các loại khác nhau. Bạn nên cố gắng tránh sử dụng các loại
khác nhau nếu bạn đang làm số học. Nhưng nếu bạn làm vậy, bạn sẽ thấy điều này.
Kích thước của toán tử, một toán tử khác khá lạ,
không giống với nhiều toán tử khác. Và điều này thực sự trông giống như một hàm.
Nhưng sizeof là một toán tử. Nó thực hiện một hành động.
Nó không làm bất cứ điều gì theo định hướng chức năng.
Những gì nó đang làm là nó cho bạn biết có bao nhiêu byte bị chiếm dụng trong
bộ nhớ bởi một loại nhất định. Vì vậy, nó trông giống như một hàm vì nó nhận một đối số.
Và chúng tôi sẽ đưa ra một ví dụ về điều đó nhưng nó sẽ trả về số byte trong bộ nhớ. Hãy nhớ rằng tùy thuộc vào hệ
thống mà bạn đang chạy, nền tảng bạn
đang chạy, hệ điều hành, kiến trúc của máy tính, phần cứng, các loại
dữ liệu khác nhau sẽ được biểu thị bộ nhớ với các kích thước khác nhau.
Ví dụ, một int có thể là 4 byte trên 1 hệ thống 8 trong hệ thống khác.
Vì vậy, những gì bạn có thể làm là bạn có thể sử dụng toán tử sizeof như một từ khóa đặc biệt, một toán tử trong c và bạn
có thể chuyển vào một kiểu dữ liệu và nó sẽ cho bạn biết nó đang sử dụng bao nhiêu byte trong bộ nhớ.
Vì vậy, sizeof thực sự là một toán tử, nó không phải là một hàm.
Nó được đánh giá tại thời điểm biên dịch và không phải trong thời gian chạy trừ khi một mảng có độ dài thay đổi được sử dụng trong đối số của nó.
Và vì vậy chúng tôi sẽ đề cập đến điều đó. Về cơ bản, điều này nói lên rằng nếu bạn
có một biến nằm bên trong kích thước của một
mảng, thì biến đó sẽ không được giải quyết tại thời điểm biên dịch trong thời gian chạy, vì vậy
bạn không cần biết điều đó.
Đối số cho toán tử sizeof có thể là một biến, một tên mảng, tên
của kiểu dữ liệu cơ bản, chẳng hạn như int
float, tên của kiểu dữ liệu dẫn xuất bất kỳ thứ gì hoặc một biểu thức.
Vì vậy, bạn có thể nói kích thước của x cộng với y.
Và về cơ bản đó sẽ chỉ nói kích thước của x cộng
với kích thước của y hoặc các con số kết quả. Nếu x là int, y là int thì nó có kích thước là 16,
nó sẽ nói rằng đây là một inch 4 byte.
Nếu int một là một float và kết quả là số học dấu phẩy động, thì
nó sẽ là float là 8 byte hoặc gì đó.
Nhưng bạn có thể sử dụng nó cho nhiều việc, và bạn nên sử dụng nó cho nhiều việc. Ví dụ, sizeof int sẽ dẫn
đến số byte bị chiếm bởi một biến kiểu int.
Vì vậy, điều này sẽ trả về 4 hoặc 8 tùy thuộc vào hệ thống của bạn.
Bạn cũng có thể áp dụng toán tử sizeof cho một biểu thức, như tôi đã đề
cập, kết quả là kích thước của giá trị.
Đó là kết quả từ biểu thức diện tích. Vì vậy, nếu hai int cùng nhau, chúng vẫn sẽ là một int.
Vì vậy, nó vẫn sẽ là một kích thước. Nhưng bạn sẽ thấy toán tử sizeof cũng được sử dụng khi chúng ta nói về con trỏ.
Tôi muốn nói về điều này ngay bây giờ vì đó là một nhà điều hành.
Nhưng chúng tôi sẽ cung cấp thêm nhiều ví dụ về điều này và truyền trong cả lớp khi chúng
tôi nói về nhiều khái niệm hơn.
Cụ thể, toán tử sizeof phát huy tác dụng nhiều hơn khi
chúng ta nói về con trỏ vì
khi bạn đang tính toán lượng bộ nhớ cần phân bổ, đó là con trỏ là gì,
bạn sử dụng sizeof vì bạn muốn chính xác.
Nhưng bạn cũng có thể sử dụng nó cho những việc khác.
Vì vậy, hãy sử dụng toán tử sizeof bất cứ khi nào có thể để tránh việc tính toán kích thước mã
cứng vào chương trình của bạn.
Kích thước mã cứng các con số ma thuật không phải là một điều tốt vì một lần
nữa nếu bạn ở một hệ thống khác, nếu bạn mã cứng hệ thống 4
trên 1 cho một int, trên hệ thống khác có thể là 8, vì vậy hãy sử dụng
sizeof càng nhiều bạn có thể và chúng ta sẽ thấy điều này trở nên tương đối hơn
nhiều khi chúng ta nói về con trỏ.
Các toán tử khác
hơi lạ là toán tử dấu hoa thị.
Bạn có thể đã nói với chính mình dấu hoa thị, chúng ta đã nói về điều này trong phép nhân.
Nhưng dấu hoa thị đó có hai toán hạng, một ở bên trái một ở bên phải.
Nếu bạn áp dụng toán tử dấu sao cho
một biến và bạn chỉ nói tên biến dấu sao với chỉ một đối số ở bên phải,
thì nó đại diện cho một thứ khác. Nó thực sự đại diện cho một con trỏ.
Nó đang tham chiếu đến một con trỏ.
Và một lần nữa, đây là tôi sẽ không quan tâm đến vấn đề này bây giờ bởi vì chúng ta sẽ xem
xét vấn đề này khi chúng ta nói về các con trỏ.
Nhưng nếu bạn nhìn thấy một cái gì đó giống như dấu sao a, đừng lo lắng điều đó thực sự hợp lệ.
Đó là thực hiện dấu hoa thị toán tử con trỏ.
Bạn cũng có thể thấy dấu hai chấm.
Đây là một toán tử được sử dụng để ra quyết định.
Nếu điều kiện là đúng, nếu điều bên trái là đúng, thì giá trị ở
bên phải sau dấu hai chấm được đánh giá, v.v. ngược lại.
Đó là một ký hiệu viết tắt cho một câu lệnh if-else.
Nó là một toán tử bậc ba, nó được gọi là. Nhưng một lần nữa, tôi không muốn thực sự thảo
luận chi tiết về những vấn đề này bởi vì chúng
ta sẽ nói về những điều này khi chúng ta nói về các chủ đề cụ
thể của chúng ta.
Chúng ta sẽ nói về người điều khiển quay vòng khi chúng ta nói về các tuyên bố quyết định. Chúng ta sẽ nói về toán
tử dấu hoa thị đơn nguyên khi chúng ta nói về con trỏ.
Nhưng nếu bạn thấy điều này ngay bây giờ và tôi muốn đề cập ngay bây giờ bởi vì về mặt kỹ thuật chúng là các toán tử, nhưng chúng ta
sẽ hiểu các trường hợp sử dụng của chúng khi chúng ta nói về những khái niệm đó. Cảm ơn bạn.