Đối số và tham số là 2 thuật ngữ xuất hiện trong các lĩnh vực khoa học khác nhau từ toán học, tin học, kỹ thuật,... Tuy nhiên, 2 thuật ngữ này sẽ được sử dụng phổ biến nhất trong ngôn ngữ lập trình C/ C++.
Mục lục bài viết
1. Đối số là gì?
Đối số có tên tiếng anh là Argument là giá trị truyền vào khi gọi hàm. Một đối số được tham chiếu đến các giá trị được truyền trong một hàm và các giá trị này thường là nguồn của hàm yêu cầu các đối số trong quá trình thực thi.
Trong hàm được gọi, các giá trị này sẽ được gán cho các biến trong định nghĩa. Loại của các giá trị được truyền vào trong hàm sẽ giống với loại của các biến được xác định trong định nghĩa hàm tạo tình nhất quán và phù hợp. Chúng được gọi là đối số thực tế hoặc tham số thực tế. Giữa đối số và tham số khi gọi hàm phải có kiểu giữ liệu phù hợp.
Ví dụ: Với một hàm cho trước. Gọi hàm sum() cho hai số cần cộng.
Trong ví dụ này, hai số cần cộng đó sẽ được gọi là các đối số và chuyển vào Sum() khi nó được gọi từ một nơi khác.
Trong ngôn ngữ lập trình C++ sẽ hỗ trợ cho chúng ta nhiều kiểu truyền đối số khác nhau tương ứng với mỗi kiểu khai báo tham số khác nhau mà chắc chắn những người lập trình, IT cần nắm vững:
- Thứ nhất, truyền đối số là giá trị (Call by value). Biến x và y được khai báo làm tham số của hàm add (hàm giá trị) đóng vai trò như là biến cục bộ hoạt động bên trong hàm này. Vì thế, tại thời điểm kết thúc phiên làm việc của hàm, các biến tham số này sẽ bị hủy và những giá trị được truyền vào không còn tồn tại.
- Thứ hai, truyền đối số là tham chiếu. Truyền đối số là tham chiếu (Call by reference) tức là truyền cho đối số một bản sao, nghĩa là giá trị của biến đó sẽ được sao chép sang biến tham số truyền vào hàm.
- Thứ ba, truyền đối số là địa chỉ. Truyền địa chỉ cho hàm( Passing arguments by address) là truyền địa chỉ của biến đối số chứ không phải giá trị biến đối số. Vì đối số là một địa chỉ, tham số hàm phải là một con trỏ. Sau đó, hàm có thể truy cập hoặc thay đổi giá trị được trỏ đến.
Như vậy, giữa đối số và tham số có quan hệ mật thiết và gắn bó với nhau. Đây là 2 thuật ngữ gắn chặt trong ngôn ngữ lập trình, vậy tham số và đối số khác nhau như thế nào?
2. Tham số và đối số khác nhau như thế nào?
Tham số và đối số có sự gắn bó mật thiết, có độ tương thích cao và đảm bảo rằng kiểu giữ liệu giữa tham số và đối số phải có sự phù hợp với nhau. Vậy tham số và đối số khác nhau như thế nào? Để tìm hiểu rõ được điều này, trước tiên chúng ta cần phải biết tham số là gì?
2.1. Tham số là gì?
Tham số có tên tiếng anh là parameter là những biến được khai báo trong việc khai báo trong một hàm (function declaration). Tham số giữ vai trò tiếp nhận giá trị đầu vào cho hàm số mỗi khi hàm số đó được gọi.
Các tham số trong nguyên mẫu hàm được áp dụng đối với quá trình thực thi hàm mà nó được định nghĩa.Tham số sử dụng để nhận các đối số được truyền trong quá trình gọi hàm. Chúng được gọi là đối số chính thức hoặc tham số chính thức.
Hàm là một nhóm các câu lệnh cùng nhau thực hiện một nhiệm vụ. Mọi chương trình C đều có ít nhất một hàm, đó là hàm main() và tất cả các chương trình tầm thường nhất đều có thể định nghĩa các hàm bổ sung.
Bạn có thể chia mã của mình thành các chức năng riêng biệt. Cách bạn phân chia mã của mình giữa các chức năng khác nhau là tùy thuộc vào bạn, nhưng về mặt logic, việc phân chia sao cho mỗi chức năng thực hiện một nhiệm vụ cụ thể.
Một khai báo hàm cho trình biên dịch biết về tên, kiểu trả về và các tham số của hàm. Định nghĩa hàm cung cấp phần thân thực của hàm.
Thư viện chuẩn C cung cấp nhiều chức năng tích hợp sẵn mà chương trình của bạn có thể gọi. Ví dụ: strcat() để nối hai chuỗi, memcpy() để sao chép một vị trí bộ nhớ sang một vị trí khác và nhiều chức năng khác.
Một chức năng cũng có thể được gọi là một phương thức hoặc một thủ tục con hoặc một thủ tục, v.v.
2.2. Sự khác nhau của tham số và đối số:
Vậy tham số và đối số khác nhau như thế nào?
- Thứ nhất, trong lĩnh vực toán học ta có thể thấy sự khác nhau giữa tham số và một đối số của hàm là: tham số (parameter) là các ký hiệu thuộc phần định nghĩa của hàm. Còn các đối số (argument) là các ký hiệu được cung cấp cho hàm (function declaration) khi nó được dùng.
- Thứ hai, phân biệt đối số và tham số trong ngôn ngữ lập trình C/C++ của tin học:
+ Khi một hàm được gọi, đối số là các giá trị được truyền trong quán trình gọi. Còn tham số là các giá tị xác định tại thời điểm nguyên mẫu hàm hoặc định nghĩa hàm được gọi.
+ Đối số được sử dụng trong câu lệnh gọi hàm để nhằm mục đích gửi giá trị từ hàm gọi đến hàm nhận. Còn đối với tham số, chúng được sử dụng trong tiêu đề của hạm được gọi để nhận giá trị từ các đối số. Tham số chính là đầu lọc nhận kết nối từ các đối số.
+ Trong thời gian gọi, mỗi đối số sẽ được gán cho một tham số trong định nghĩa hàm. Còn tham số là các biến cục bộ được gán giá trị của những đối số khi hàm được gọi.
+ Đối số trong hàm còn được gọi là tham số thực tế, còn tham số được gọi là tham số chính thức.
Để làm rõ hơn về sự khác biệt này, dưới đây là ví dụ mô phỏng để người đọc dễ dàng theo dõi:
Ví dụ về đối số: Sử dụng giá trị giả về làm đối số, ta có:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include int getValueFromUser() // this function now returns an integer value { std::cout << "Enter an integer: " ; int input{}; std::cin >> input; return input; // added return statement to return input back to the caller } void printDouble( int value) { std::cout << value << " doubled is: " << value * 2 << 'n' ; } int main() { printDouble(getValueFromUser()); return 0; } |
Ví dụ về tham số: Dưới đây là ví dụ về về hàm với số lượng tham số khác nhau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // This function takes no parameters // It does not rely on the caller for anything void doPrint() { std::cout << "In doPrint()n" ; } // This function takes one integer parameter named x // The caller will supply the value of x void printValue( int x) { std::cout << x << 'n' ; } // This function has two integer parameters, one named x, and one named y // The caller will supply the value of both x and y int add( int x, int y) { return x + y; } |
Ví dụ về việc tham số và đối số làm việc cùng nhau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include // This function has two integer parameters, one named x, and one named y // The values of x and y are passed in by the caller void printValues( int x, int y) { std::cout << x << 'n' ; std::cout << y << 'n' ; } int main() { printValues(6, 7); // This function call has two arguments, 6 and 7 return 0; } |
Khi hàm printValues được gọi với các đối số 6 và 7, tham số x của printValues được tạo và khởi tạo với giá trị 6 và tham số y của printValues được tạo và khởi tạo với giá trị 7.
3. Bài tập cụ thể về tham số và đối số:
Bài tập 1: Hãy thiết lập hàm power(a, b, c) với a, b, c là các số nguyên. Hàm trả lại giá trị (a+b)c
Trả lời:
def power(a,b,c):
m=a+b;
s=1
for i in range(1,c+1):
s=s*m
return s
Bài tập 2: Giả sử hàm f có hai tham số là x và y. Khi khai báo, hàm này sẽ trả lại giá trị x + 2y. Hỏi lời gọi hàm f(10,a) có lỗi hay không?
Trả lời: Lời gọi hàm f(10,a) có lỗi nếu tham số a truyền vào chưa có giá trị
Bài tập 3: Thiết lập hàm change() có hai tham số là xâu ho_ten và số c. Hàm sẽ trả lại xâu kí tự ho_ten là chữ in hoa nếu c = 0. Nếu tham số c khác 0 thì hàm trả lại xâu ho_ten là chữ in thường.
def change(s,c)
if c==0:
return s.upper()
else:
return s.lower()
Bài tập 4: Hãy sửa chữa chương trình này để chương trình chạy đúng:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include int getValueFromUser() // this function now returns an integer value { std::cout << "Enter an integer: " ; int input{}; std::cin >> input; return input; // added return statement to return input back to the caller } void printDouble( int value) { std::cout << value << " doubled is: " << value * 2 << 'n' ; } int main() { int num { getValueFromUser() }; printDouble(num); return 0; } |
Trả lời: Trong chương trình này, biến num đầu tiên được khởi tạo với giá trị được nhập bởi người dùng. Sau đó, hàm printDouble được gọi và giá trị của num được sao chép vào tham số giá trị của hàm printDouble. Hàm printDouble sau đó sử dụng giá trị của tham số đó.
Trên đây là đáp án trả lời cho câu hỏi đối số là gì? Tham số và đối số khác nhau như thế nào? Bạn đọc có thể tham khảo.