Void (kiểu dữ liệu)

Trong nhiều ngôn ngữ lập trình bắt nguồn từ CAlgol68, kiểu void (tiếng Anh: void type) là một kiểu kết quả của hàm nếu hàm này không trả về bất kì kết quả (giá trị) nào. Những hàm như thế thường được gọi trong chương trình vì những hiệu ứng biên của chúng. Các kiểu void có cùng mục đích với các cấu trúc cú pháp xác định các subroutine (đoạn chương trình con) trong Visual Basic và các procedure (thủ tục) trong ngôn ngữ lập trình Pascal. Trong những trường hợp như vậy, kiểu void có mục đích tương tự như kiểu unit (kiểu đơn vị) từ các ngôn ngữ lập trình hàm; tuy nhiên, có nhiều sự khác biệt trong các cách dùng được cho phép, như kiểu void được lấy làm kiểu rỗng và không có giá trị. Để dễ so sánh, xin hãy xem thêm đề mục Kiểu unit#Trong các ngôn ngữ lập trình.

Ngôn ngữ CC++ cũng cung cấp con trỏ chỉ kiểu void (được đặc tả bởi void *), nhưng đây là một khái niệm không có liên quan. Các biến kiểu này là các con trỏ chỉ đến dữ liệu của một kiểu chưa được xác định, vì thế ở ngữ cảnh này (nhưng không phải trong những ngữ cảnh khác) void đóng vai trò như một kiểu vạn năng hay kiểu top. Một chương trình có thể chuyển đổi một con trỏ chỉ đến kiểu bất kì của dữ liệu thành một con trỏ chỉ đến kiểu void và quay ngược lại kiểu ban đầu mà không làm mất thông tin, điều này khiến cho các con trỏ trở nên hữu ích trong các hàm đa hình (polymorphic function) (chú ý điều này không thật đúng đối với các con trỏ hàm vì các hàm không phải là dữ liệu[1]).

Lịch sử

[sửa | sửa mã nguồn]

Trong số những ngôn ngữ lập trình hiện đại, từ khóa void lần đầu tiên xuất hiện trong C++ để hỗ trợ cho khái niệm con trỏ được tổng quát hóa. Tuy nhiên, nhờ sự vay mượn nhanh chóng từ C++, tài liệu tiêu chuẩn đầu tiên chứa từ khóa void đã trở thành chuẩn của ngôn ngữ C và đã được ANSI công bố vào năm 1989. Trong phạm vi ngôn ngữ C++, void đã được chuẩn hóa vào năm 1998.

Sau này, từ khóa void và những cấu trúc ngôn ngữ liên quan đến nó đã được thừa kế bởi các ngôn ngữ Java, C#D.

Ngữ nghĩa

[sửa | sửa mã nguồn]

Ngôn ngữ C trước khi có kiểu void

[sửa | sửa mã nguồn]

Void trong các ngôn ngữ lập trình CC++

[sửa | sửa mã nguồn]

Một hàm có kiểu kết quả void kết thúc hoạt động bằng cách hoặc chạm tới điểm kết thúc của hàm hoặc thực hiện một lệnh trả về mà không có giá trị trả về. Kiểu void có thể cũng xuất hiện như là đối số (argument) duy nhất của một nguyên mẫu hàm (function prototype) nhằm xác định là hàm không có tham số nào cả. Chú ý rằng, mặc dù có tên, nhưng trong tất cả những trường hợp này, kiểu void được dùng làm kiểu unit, chứ không làm số 0 (zero) hay kiểu đáy, thậm chí không giống như một kiểu unit thực sự là kiểu đơn nhất, kiểu void bao gồm một tập hợp rỗng các giá trị, và ngôn ngữ không cung cấp bất cứ cách nào để khai báo một đối tượng hoặc biểu diễn một giá trị với kiểu void.

Trong những phiên bản sớm nhất của C, các hàm không có kết quả xác định đã được mặc định kiểu trả về của int và các hàm không có đối số đã dễ dàng có các danh sách đối số rỗng. Các con trỏ chỉ dữ liệu không được định kiểu đã được khai báo như là các số nguyên (integer) hoặc con trỏ chỉ char. Một vài trình biên dịch C lúc ban đầu đã có đặc điểm mà ngày nay bị xem là phiền toái, đó là phát sinh cảnh báo cho bất kì lời gọi hàm nào không sử dụng giá trị trả về của hàm. Mã cũ đôi khi vứt bỏ những lời gọi hàm như vậy để tránh kết liễu cảnh báo này. Lúc Bjarne Stroustrup bắt đầu công trình của ông ấy trên C++ vào 1979-1980, void và con trỏ void đã từng là một phần của phương ngữ ngôn ngữ C được hỗ trợ bởi các trình biên dịch bắt nguồn từ AT&T.[2]

Việc sử dụng tường minh void và việc không cho các đối số ở trong một nguyên mẫu hàm có các ngữ nghĩa khác nhau trong C và C++, và được chi tiết hóa trong bảng sau đây:[3]

C++ C tương đương
void f(); //được ưa thích hơn cả void f(void);
void f(void); void f(void);
void f(...); //Chấp nhận bất kì đối số nào void f(); /*Chấp nhận bất kì đối số nào*/

Tuy nhiên, một nguyên mẫu C không lấy các đối số, ví dụ void f() ở trên, đã bị phản đối trong C99.[4]

Tham khảo

[sửa | sửa mã nguồn]
  1. ^ generic-function-pointers-in-c-and-void
  2. ^ "Standardisation."[liên kết hỏng]
  3. ^ Stroustrup, Bjarne (2009). Programming: Principles and Practice Using C++. Boston: Addison-Wesley. tr. 996. ISBN 0321543726.
  4. ^ Bjarne Stroustrup, C and C++: Case Studies in Compatibility. Reconcilable differences? You decide, Dr. Dobb's, ngày 1 tháng 9 năm 2002; print version Lưu trữ 2011-08-10 tại Wayback Machine
Chúng tôi bán
Bài viết liên quan
4 thương hiệu pizza ngon khó cưỡng
4 thương hiệu pizza ngon khó cưỡng
Bạn có biết bạn sẽ “nạp thêm” trung bình là 250 kcal khi ăn một chiếc pizza không? Đằng nào cũng “nạp thêm” từng đó kcal thì 4 thương hiệu pizza mà MoMo đề xuất dưới đây sẽ không làm bạn phải thất vọng. Cùng điểm qua 4 thương hiệu pizza mà MoMo “chọn mặt gửi vàng” cho bạn nhé!
Nên tìm hiểu những khía cạnh nào của người ấy trước khi tiến tới hôn nhân?
Nên tìm hiểu những khía cạnh nào của người ấy trước khi tiến tới hôn nhân?
Sự hiểu biết của mỗi người là khác nhau, theo như góc nhìn của tôi, hôn nhân có rất nhiều kiểu, thế nhưng một cuộc hôn nhân làm cho người trong cuộc cảm thấy thoải mái, nhất định cần phải có tình yêu.
Tóm tắt One Piece chương 1092: Sự cố
Tóm tắt One Piece chương 1092: Sự cố "Bạo chúa tấn công Thánh địa"
Chương bắt đầu với việc Kuma tiếp cận Mary Geoise. Một số lính canh xuất hiện để ngăn ông ta lại, nhưng Kuma sử dụng "Ursus Shock" để quét sạch chúng.
Neia và màn lột xác sau trận chiến bảo vệ thành Loyts
Neia và màn lột xác sau trận chiến bảo vệ thành Loyts
Neia và màn lột xác sau trận chiến bảo vệ thành Loyts, gián điệp do "Nazarick cộng" cài vào.