tôi nghĩ rằng tôi hiểu được cách điểm chuỗi hoạt động trong C++, nhưng this GeeksQuiz question bối rối tôi:Gọi chức năng với tác dụng phụ bên trong biểu
int f(int &x, int c) {
c = c - 1;
if (c == 0) return 1;
x = x + 1;
return f(x, c) * x;
}
int main() {
int p = 5;
cout << f(p, p) << endl;
return 0;
}
Câu trả lời “đúng” cho câu hỏi này nói nó in 6561. Trên thực tế, trong VS2013 nó có. Nhưng không phải là UB anyway vì không có đảm bảo sẽ được đánh giá đầu tiên: f(x, c)
hoặc x
. Chúng tôi nhận được 6561 nếu f(x, c)
được đánh giá đầu tiên: toàn bộ điều này chuyển thành năm cuộc gọi đệ quy: bốn (c = 5, 4, 3, 2
) tiếp theo, cái cuối cùng (c = 1) kết thúc và trả về 1, số tiền đó là 9 ** 4
cuối cùng.
Tuy nhiên, nếu x
được đánh giá trước, thì chúng tôi sẽ nhận được 6 * 7 * 8 * 9 * 1
thay thế. Điều thú vị là, trong VS2013 thậm chí thay thế f(x, c) * x
với x * f(x, c)
không thay đổi kết quả. Không phải là nó có nghĩa là bất cứ điều gì.
Theo tiêu chuẩn, UB này có đúng không? Nếu không, tại sao?
clang cung cấp '3024' cho' x * f (x, c) '(và' 6561' cho 'f (x, c) * x'). – Holt