Giá trị trả về của f (p, p), nếu giá trị p là được khởi tạo thành 5 trước cuộc gọi? Lưu ý rằng tham số đầu tiên là được truyền theo tham chiếu, trong khi thông số thứ hai được chuyển theo giá trị.Hành vi không xác định trong mã đã cho?
int f (int &x, int c) { c = c - 1; if (c==0) return 1; x = x + 1; return f(x,c) * x; }
Tùy chọn là:
Tôi cố gắng giải thích:
Trong mã này, sẽ có bốn cuộc gọi đệ quy với tham số (6,4), (7,3), (8,2) và (9,1). Cuộc gọi cuối cùng trả về 1. Nhưng do vượt qua tham chiếu, x trong tất cả các hàm trước bây giờ là 9. Do đó, giá trị được trả về bởi f (p, p) sẽ là 9 * 9 * 9 * 9 * 1 = 6561.
Câu hỏi này là từ kỳ thi cạnh tranh GATE, (see Q.no.-42). Phím trả lời được đưa ra bởi GATE "Nhãn hiệu cho tất cả" (có nghĩa là không có tùy chọn chính xác.) key set-C, Q.no.-42. Một nơi nào đó được giải thích là:
Trong GATE 2013, nhãn hiệu được gán cho tất cả giống như mã trong C/C++ tạo ra hành vi không xác định. Điều này là do *
không phải là một điểm chuỗi trong C/C++. Mã đúng phải thay thế
return f(x,c) * x;
với
res = f(x,c);
return res * x;
Nhưng mã cho hoạt động tốt. Khóa của GATE có sai không? Hoặc thực sự là sai lầm với câu hỏi?
Một trong những điều có thể xảy ra nếu bạn băng qua đường mà không cần tìm cả hai cách là bạn chuyển sang phía bên kia một cách an toàn. Nhưng đó là một lỗi để * dự đoán * rằng một người đi qua đường mà không cần tìm cả hai cách sẽ làm cho nó sang phía bên kia một cách an toàn. –
Tương tự như [Miêu tả điểm mơ hồ, hành vi không xác định?] (Http://stackoverflow.com/q/29513572/1708801) –