Anh (Chị) hãy cho biết kết quả của đoạn lệnh sau là gì?
int add (int a, int b)
{ return (a + b); }
int sub (int a, int b)
{ return (a - b); }
int operation (int x, int y, int(*functocall) (int,int))
{ int s = (*functocall)
(x,y); return s;
}
int main() { int m,n; int (*minus)(int,int) = sub;
m= (7,5,add);
n =(20,m,minus);
return 0;
}
Trả lời:
Đáp án đúng: D
Đoạn code C++ này sử dụng con trỏ hàm để thực hiện các phép toán số học. Tuy nhiên, có một lỗi cú pháp quan trọng trong cách gán giá trị cho biến `m` và `n`.\n\nPhân tích chi tiết:
1. **Khai báo hàm:**
* `int add(int a, int b)`: Hàm trả về tổng của hai số nguyên.
* `int sub(int a, int b)`: Hàm trả về hiệu của hai số nguyên.
* `int operation(int x, int y, int(*functocall)(int, int))`: Hàm này nhận hai số nguyên `x`, `y` và một con trỏ hàm `functocall` (có kiểu trả về `int` và nhận hai tham số `int`). Hàm `operation` gọi hàm được trỏ bởi `functocall` với `x` và `y` làm đối số.
2. **Hàm `main`:**
* `int (*minus)(int, int) = sub;`: Khai báo một con trỏ hàm `minus` trỏ đến hàm `sub`.
* `m = (7, 5, add);` : Đây là dòng lệnh gây lỗi. Toán tử dấu phẩy (`,`) trong C/C++ đánh giá các biểu thức từ trái sang phải và trả về giá trị của biểu thức cuối cùng. Trong trường hợp này, `(7, 5, add)` sẽ trả về giá trị của `add`. Vì `add` là một con trỏ hàm, `m` sẽ nhận địa chỉ của hàm `add`, và vì kiểu của `m` là `int` nên đoạn code này gây ra lỗi biên dịch do trình biên dịch không thể chuyển đổi một con trỏ hàm sang một số nguyên.
* `n = (20, m, minus);`: Tương tự như trên, dòng này cũng gây ra lỗi. `(20, m, minus)` sẽ trả về `minus` (là một con trỏ hàm), và `n` sẽ nhận giá trị này, gây ra lỗi biên dịch tương tự như với `m`.
3. **Kết luận:**
* Đoạn code có lỗi biên dịch do cố gắng gán con trỏ hàm cho biến kiểu `int` sử dụng toán tử dấu phẩy một cách sai. Do đó, chương trình sẽ không biên dịch thành công.