Xin chào và chào mừng.
Trong bài giảng này, tôi muốn nói về việc trả về dữ liệu từ các hàm.
Cho đến thời điểm này, chúng tôi đã biết những gì một hàm là chúng ta biết tại sao nó hữu
ích, chúng ta biết cách xác định các hàm mà chúng ta biết cách truyền dữ liệu cho các hàm.
Bây giờ chúng tôi muốn nói về cách chúng tôi có thể trả về dữ liệu từ các
hàm, điều này cũng rất hữu ích.
Trong ví dụ trước của chúng tôi, khi chúng tôi nhân hai số, một hàm nhân
hiển thị kết quả của tính toán ở thiết bị đầu cuối.
Hãy nhớ rằng, chúng tôi đã có điều đó câu lệnh printf trong đó.
Ngoài ra, chúng tôi đã có một ví dụ trong đó chúng tôi trước đó chỉ là một chức năng đơn giản.
Chúng tôi vừa in ra dữ liệu bên trong hàm.
Chúng tôi muốn trở nên tốt đẹp thay vì mang nó ra khỏi
đó bởi vì nó thực sự làm được nhiều thứ hơn.
Nó thực sự đã in nó ra, dữ liệu được trả về và
nó in ra dữ liệu trong hàm chính.
Bạn có thể không phải lúc nào cũng muốn có kết quả tính toán của bạn được hiển thị.
Chức năng trở nên nhiều hơn linh hoạt, chung chung hơn, từ đó cho
phép nó được sử dụng nhiều hơn nếu bạn có thể trả lại dữ liệu.
Vì vậy, các hàm có thể trả về dữ liệu sử dụng cú pháp cụ thể trong c.
Chúng ta nên làm quen với điều này một chút vì hãy
nhớ chức năng chính của chúng ta ở kết thúc, chúng tôi đang trả lại khá nhiều dữ liệu
trong rất nhiều ví dụ.
Vì vậy, chúng tôi đã được tiếp xúc với điều này một chút.
Chúng tôi chưa thực sự hiểu ý nghĩa của nó.
Hãy cùng nhìn lại dạng tổng quát của một hàm.
Hãy nhớ rằng, tiêu đề chức năng này.
Chúng tôi có một loại trả lại là từ lần đầu tiên được định nghĩa.
Và sau đó chúng tôi có tên, và sau đó chúng tôi đã có các tham số được phân tách bằng
dấu phẩy bên trong dấu ngoặc đơn.
Chúng tôi đã biết tên và các tham số.
Điều đầu tiên đó là kiểu trả về.
Kiểu trả về chỉ định kiểu dữ liệu của giá trị được
trả về bởi hàm.
Các hàm có thể trả về bất kỳ loại dữ liệu nào.
Bạn chỉ cần cho trình biên dịch biết loại dữ liệu bạn đang trả về nếu.
Đó là một int, một float, một kép bất kể nó là gì, bạn phải chỉ định điều đó
trong tiêu đề hàm của bạn.
Loại trả lại.
Loại trả lại mà chúng tôi đã thấy ngay tại đây, và bạn có thể chỉ định loại giá trị đó
sẽ được trả về bởi một hàm miễn là nó là một loại hợp pháp trong c.
Tôi đã đề cập đến những cái chính, tăng gấp đôi, nổi và vân vân.
Nhưng bạn cũng có thể trở lại phép liệt kê và con trỏ.
Chúng tôi chưa thảo luận về các con trỏ, nhưng nó làm cho nó rất, rất linh hoạt khi bạn
có thể trả về các con trỏ.
Loại trả lại có thể cũng là loại tránh.
Bạn thường thấy từ khóa này vô hiệu.
Bây giờ chúng tôi hiểu nó có nghĩa là gì.
Void nghĩa là không có dữ liệu sẽ được trả lại.
Nếu bạn thấy khoảng trống trước tên của hàm, bạn sẽ không trả lại bất
kỳ dữ liệu nào.
Nếu bạn thấy khoảng trống bên trong các tham số danh sách, bạn không chuyển bất kỳ dữ liệu nào.
Void chỉ là một từ khóa chung chung cho các loại trả về và cho các tham số, bạn cũng lưu ý rằng bạn có thể sử dụng void cũng
như một con trỏ, nhưng chúng ta sẽ đạt được điều đó khi chúng
ta đạt được điều đó.
Nhưng vô hiệu là một cách nói không nên lời.
Và lý do bạn bao gồm vô hiệu thay vì chỉ không bao gồm bất
cứ điều gì bởi vì nó làm cho chương trình dễ đọc hơn.
Trên thực tế, khi bạn chuyển dữ liệu đến một và bạn không có
dữ liệu nào đang được chuyển, bạn có thể có nó chỉ là dấu ngoặc đơn trống.
Thật dễ dàng để đọc nếu bạn có khoảng trống trong đó.
Tương tự với một loại trả lại ngoại trừ kiểu trả về bạn phải có giá trị vô hiệu.
Bạn không thể có nó chỉ là trống rỗng.
Void nghĩa là không có dữ liệu sẽ được trả lại.
Câu lệnh trả về.
Chúng tôi đã nói về cách bạn có thể xác định dữ liệu nào sẽ được trả lại nhưng làm thế
nào để bạn thực sự trả lại dữ liệu.
Bên trong phần thân của hàm, bạn phải có một tuyên bố mà bạn có thể nói
những gì bạn sẽ trở lại.
Bởi vì hãy nhớ cơ thể của một hàm có thể có nhiều dữ liệu.
Nó có thể có các biến cục bộ, nó có thể có bất cứ điều gì bạn biết, hàm
có thể thực hiện một phép tính cụ thể, có thể thực hiện nhiều phép tính, bạn muốn
trả lại những gì.
May mắn thay có câu nói này với từ khóa trả về.
Nếu bạn cung cấp lợi nhuận không có tên biến sau hoặc biểu thức, điều đó
có nghĩa là bạn chỉ cần thoát khỏi chức năng.
Nó tương tự như ngắt trong một vòng lặp.
Bạn vừa trở về từ hàm.
Và bạn có thể cung cấp điều này trong các hàm được định nghĩa là void.
Nó làm cho nó rõ ràng khi bạn đang thoát khỏi chức năng.
Bạn thực sự chỉ nên có lợi nhuận ở một vị
trí ở cuối hàm.
Chúng ta sẽ làm điều đó sau, nhưng bạn không thể có nó ở bất cứ đâu trong một hàm.
Nếu bạn thấy nó ở bất cứ đâu trong một chức năng, nó có nghĩa là bạn
đang nhảy ra khỏi chức năng đó.
Lý do tại sao nó tốt để có nó ở dưới cùng rất rõ ràng
khi bạn thoát khỏi chức năng.
Nếu bạn có nhiều lần trả lại ngay cả khi bạn đang trả lại tất cả dữ liệu trong
toàn bộ chức năng của mình, nó khó nói khi bạn đang trở lại.
Vì vậy, những gì tôi muốn làm trong hàm là tạo biến và chỉ trả
về một lần ở cuối.
Nếu tôi cần trả lại thứ gì đó trong một hàm hoặc ý tôi là trong một câu lệnh if cụ thể trong một hàm hoặc
một cái gì đó tôi sẽ đặt biến và sau đó
trả về nó ở dưới cùng.
Vì vậy, nếu bạn có trở lại và bạn không có gì sau nó,
điều đó chỉ có nghĩa là bạn đang thoát khỏi chức năng không có dữ liệu trả về.
Điều này thực sự không được sử dụng nhiều.
Bạn chỉ sử dụng nó trong khoảng trống hàm, không trả về giá trị.
Dạng tổng quát hơn của câu lệnh return đang trả về một
số biến hoặc một số biểu thức.
X cộng với y hoặc trả về x.
Mẫu câu lệnh trả về này có được sử dụng với kiểu trả về được chỉ
định trong tiêu đề hàm.
Nếu bạn đang trả về một int, bất kỳ biến hoặc biểu thức nào bạn đang
trả về phải là một số nguyên.
Nó phải đánh giá thành một int, nếu bạn đang trả về một int.
Bây giờ nếu bạn đang tăng gấp đôi, nó phải tăng giá trị lên gấp đôi.
Hãy nhớ rằng, bạn có thể có nhiều các loại dữ liệu khác nhau được trả về.
Giá trị được trả về đối với chương trình đang
gọi là giá trị kết quả khi biểu thức được đánh giá như vậy.
Nếu bạn có x cộng với y, nó sẽ trả về kết quả của biểu thức đó và nó
phải cùng kiểu với khai báo chức năng như tôi đã đề cập.
Một hàm có các câu lệnh trong
phần thân hàm nhưng không trả về giá trị phải có kiểu trả về là void, phải.
Bạn không thể không có điều đó.
Nếu bạn không có điều đó và bạn không trả lại bất kỳ
dữ liệu nào, bạn sẽ nhận được thông báo lỗi.
Khi bạn biên dịch chương trình và nó chứa một hàm với kiểu trả về
void cố gắng trả về lỗi trình biên dịch giá trị.
Void nghĩa là không có dữ liệu trả về, không trả về một biến một biểu thức.
Nếu một hàm không có khoảng trống kiểu trả về và nó
có kiểu trả về hợp lệ, bạn sẽ nhận được một thông báo lỗi nếu trình biên
dịch cố gắng trả về một kiểu khác với một chỉ định hoặc nếu họ chỉ
quay trở lại mà không có gì sau đó.
Vì vậy, hãy chú ý đến điều này.
Những từ khóa đó ở đầu khai báo chức năng là quan trọng.
Nó ảnh hưởng trực tiếp đến việc thực hiện của chức năng và trình biên dịch sẽ cho bạn biết nếu bạn vặn lên và bạn không
trả lại đúng dữ liệu hoặc nếu bạn không trả lại
bất kỳ dữ liệu hoặc nếu bạn trả lại dữ liệu khi bạn không
phải trả lại dữ liệu.
Nếu biểu thức cho kết quả là một giá trị đó là một kiểu
khác với kiểu trả về trong hàm tiêu đề, c sẽ cố gắng chuyển đổi nó.
Trình biên dịch sẽ thử để chuyển đổi nó nếu nó có thể.
Vì vậy, ví dụ: nếu bạn đang trở lại một float và biểu thức của bạn là tôi cộng x với
hai số nguyên, nó sẽ để chỉ chuyển đổi nó thành một float.
Nếu bạn đang trả về một int và bạn có
một biểu thức đang thực hiện phép tính float, nó sẽ chuyển đổi nó thành một nó.
Bạn sẽ mất dữ liệu trong đó nhưng nó sẽ thực hiện chuyển đổi.
Không phải lúc nào cũng có thể để thực hiện chuyển đổi.
Trong trường hợp không thể, bạn sẽ gặp lỗi do trình
biên dịch tạo ra.
Nếu bạn đang cố gắng trả về một int khi bạn
phải trả về một chuỗi hoặc khi bạn đang cố gắng để trả
lại nó khi bạn phải trả lại một enum, đó là sẽ phàn nàn trình biên dịch.
Bạn cũng có thể có nhiều hơn một câu lệnh trả về một hàm, tôi đã đề cập
đến vấn đề này một cách ngắn gọn và tại sao bạn không muốn làm điều đó.
Nhưng bạn có thể làm điều đó.
Bạn có thể có nhiều lần trả lại trong suốt chức năng.
Nó chỉ làm cho mã khó hơn theo dõi bởi vì bạn đang
nhảy ra khỏi chức năng ở khắp nơi.
Khi bạn trở lại và bạn có nhiều giá trị trả về, chỉ cần
đảm bảo lại nếu bạn có một hàm đó là trả lại
một cái gì đó, bạn có một biểu thức hoặc giá trị của loại đó hoặc nó có thể được chuyển đổi.
Bây giờ chúng ta đã nói về truyền dữ liệu và trả về
dữ liệu, chúng tôi biết cách gọi một hàm, nhưng tôi muốn nói
một vài điều khác về lời gọi.
Bạn gọi một hàm bằng cách sử dụng tên hàm theo sau là các đối số mà
bạn truyền vào đó là ở giữa các dấu ngoặc đơn, chúng tôi biết điều đó,
cho đến nay chúng tôi biết nhưng tôi muốn chính thức phát biểu nó, đó là cách bạn
có thể gọi một hàm.
Khi bạn gọi hàm, giá trị của các đối số
mà bạn chỉ định giữa các dấu ngoặc đơn sẽ được gán cho các
tham số bên trong hàm.
Các thông số mang tính đại diện biến với một kiểu dữ liệu.
Sau đó, bạn có thể sử dụng biến đó bất kỳ bên nào trong cơ thể chức năng.
Khi chức năng thoát hoặc thực thi mã nhất định, nó sẽ sử dụng những giá trị được cung cấp làm đối số,
như tôi đã đề cập.
Các đối số bạn chỉ định khi bạn gọi một hàm nên thống nhất về
loại số và trình tự khi tham số trong tiêu đề hàm.
Thứ tự cũng quan trọng, tôi đã không nhấn mạnh điều đó, nhưng
nếu nó cho biết int x double y, trước tiên bạn phải truyền vào int rồi đến double.
Bạn không thể vượt qua trong double và int.
Thứ tự rất, rất cụ thể.
Vì vậy, hãy đảm bảo rằng bạn chuyển dữ liệu dưới dạng một
đối số khi bạn gọi hàm theo cùng một cách với hàm được khai báo trong tiêu đề
hàm trong danh sách tham số, truyền loại phù hợp cũng vậy.
Gọi một hàm và gán dữ liệu được trả về.
Nếu một hàm đang trả về dữ liệu, thì hàm có thể gán dữ liệu đó chỉ bằng cách sử
dụng toán tử bằng và sau lợi nhuận cũng như bạn có thể lưu trữ nó trong một biến cục
bộ nếu bạn muốn.
Nó cũng sẽ hoạt động với một biểu thức.
Vì vậy, bạn có thể nói return x plus y, bạn có thể nói return x, bạn có thể
nói trả về một hằng số.
Ví dụ này ở đây là sau khi bạn gọi lệnh khi bạn muốn gán dữ
liệu được trả về.
Vì vậy, bạn có thể nói int x bằng của tôi hàm gọi, bất cứ điều gì mà
hàm trả về sẽ được gán cho x.
Và nếu lệnh gọi hàm của tôi trả về x cộng với y, kết quả của x cộng với
y sẽ được gán cho x.
Vì vậy, bạn có thể chỉ định dữ liệu được trả về
từ một lời gọi hàm bằng cách chỉ có một biến trên bên trái
của dấu bằng và lệnh gọi hàm trên bên phải của dấu bằng.
Chức năng gọi điện không có để nhận ra hoặc xử lý giá trị được trả
về từ một hàm được gọi.
Bạn không cần phải có phân công đó.
Nếu một hàm đang trả về dữ liệu và bạn không quan tâm đến dữ liệu đó,
bạn không cần phải có số bằng, bạn chỉ có thể gọi hàm.
Nó sẽ không thực sự có ý nghĩa bởi vì nếu nó trả về dữ liệu, điều
đó có nghĩa là bạn có thể cần xem xét nó, nhưng bạn không cần phải làm điều đó.
Trình biên dịch sẽ không phàn nàn nếu bạn chỉ
gọi một hàm và không xử lý dữ liệu.
Tùy thuộc vào bạn như thế nào bạn muốn sử dụng dữ liệu được trả
về từ các lệnh gọi hàm.
Đây là một ví dụ về việc gọi một hàm và cũng trả về dữ liệu
từ một hàm.
Trong ví dụ này, hãy nhân hai số.
Điều này giống như ví dụ chúng tôi trước đó, nhưng ví dụ trước đó không
trả về bất kỳ dữ liệu nào.
Ví dụ trước đó hiển thị đầu ra.
Trong ví dụ này, chúng tôi không hiển thị bất kỳ đầu ra nào.
Chúng tôi đang trả lại dữ liệu và thì chúng tôi đang hiển
thị đầu ra trong hàm chính.
Ở đây chúng ta nhân hai số nhận hai số nguyên làm tham số.
Chúng ta nhân hai số nguyên đó.
Và sau đó thay vì in cái này số lượng hoặc giá trị, chúng tôi đang sử dụng từ khóa trả lại
và sau đó chúng tôi xác định một biến được đặt tên là kết quả và sau đó chúng ta
có dấu chấm phẩy để kết thúc nó.
Khi bạn thấy từ khóa trả lại đó bên trong thân hàm, bạn đang trả
lại dữ liệu đó.
Và hãy nhớ rằng, bạn có thể có nhiều nơi.
Nhưng bạn chỉ có thể có nó trả lại một giá trị, bạn không thể trả về nhiều giá trị.
Vì vậy, nếu bạn có từ khóa trả về trong nhiều chỗ, nó phải nằm trong
câu lệnh if hoặc vòng lặp vì bạn đang nhảy ra ngay lúc đó.
Nếu bạn có một sự trở lại, theo sau là một sự trở lại khác, nó sẽ
cung cấp cho bạn một lỗi vì nó sẽ nói rằng bạn có hai lợi nhuận trong cả hai trường hợp.
Bạn luôn quay trở lại kết quả, bạn không thể làm điều đó.
Nhưng từ khóa trả về là quan trọng.
Bạn đang trả về một biến.
Và sau đó bạn thấy trong chính chức năng dữ liệu được trả về đang được chỉ
định cho một biến cục bộ khác được gọi là kết quả.
Bạn sẽ nhận thấy chúng tôi đang sử dụng những cái tên giống nhau ở đây.
Điều này liên quan đến chức năng phạm vi mà chúng ta
sẽ nói đến trong bài giảng tiếp theo, địa phương biến so với biến toàn cục.
Tất cả những gì bạn cần chú ý trong bài giảng này là thực
tế là hàm này nhân hai số đang trả về dữ liệu.
Làm thế nào bạn trả lại nó, bạn trả lại nó sử dụng từ khóa
return theo sau là biến của biểu thức.
Bạn cũng nhận thấy rằng nhân hai số chỉ định kiểu trả về
ở đầu tiêu đề hàm.
Nó trả về một int.
Vì vậy, chúng ta phải trả về một int.
Bạn cũng nhận thấy rằng khi chúng tôi chỉ định dữ liệu trong
hàm main, chúng tôi đang gán nó vào trong int.
Giao những việc đó rất dễ dàng, chúng tôi chỉ cần có toán tử bằng.
Nếu chúng tôi không quan tâm đến dữ liệu, chúng tôi chỉ có thể gọi nhân
hai số và sau đó không làm gì với nó nhưng.
Sau khi chúng tôi nhận được dữ liệu trả về từ hàm, sau đó chúng tôi in
nó ra bằng cách sử dụng một hàm printf.
Điều này làm cho chức năng nhiều hơn gắn kết rằng nó lấy dữ liệu.
Chúng tôi không thực sự hiển thị kết quả bên trong hàm.
Có những lúc chúng ta không muốn để hiển thị kết
quả, chúng tôi chỉ muốn nhân hai số và sau đó chúng tôi có thể muốn chia sản phẩm.
Tính linh hoạt với dữ liệu được thông qua và dữ liệu được trả về là một vấn đề lớn.
Đây là một ví dụ đơn giản.
Bạn sẽ tiếp xúc với điều này nhiều hơn trong thử thách tiếp theo của chúng tôi.