Những gì đang xảy ra ở đây?
if(int a = Func1())
{
// Works.
}
if((int a = Func1()))
{
// Fails to compile.
}
if((int a = Func1())
&& (int b = Func2()))
)
{
// Do stuff with a and b.
// This is what I'd really like to be able to do.
}
Phần 6.4.3 trong tiêu chuẩn 2003 giải thích cách các biến được khai báo trong điều kiện câu lệnh lựa chọn có phạm vi mở rộng đến cuối các câu lệnh con được điều kiện kiểm soát. Nhưng tôi không thấy nó nói gì về việc không thể đặt dấu ngoặc quanh khai báo, cũng như không nói gì về chỉ một khai báo cho mỗi điều kiện.
Hạn chế này gây khó chịu ngay cả trong trường hợp chỉ cần một khai báo trong điều kiện. Xem xét điều này.
bool a = false, b = true;
if(bool x = a || b)
{
}
Nếu tôi muốn nhập phạm vi 'if "-body với x được đặt thành false thì khai báo cần có dấu ngoặc đơn (vì toán tử gán có mức độ ưu tiên thấp hơn OR logic), nhưng vì không thể sử dụng dấu ngoặc nên yêu cầu khai báo x bên ngoài body, làm rò rỉ khai báo đó đến một phạm vi lớn hơn mong muốn. Rõ ràng ví dụ này là nhỏ nhặt nhưng trường hợp thực tế hơn sẽ là một trường hợp trong đó a và b là các hàm trả về giá trị cần được kiểm tra
Vì vậy, có phải những gì tôi muốn làm không phù hợp với tiêu chuẩn, hay trình biên dịch của tôi chỉ làm hỏng các quả bóng của tôi (VS2008)?
while
cũng giống như cho if
.
if (int a = foo(), int b = bar(), a && b)
:? Nếu toán tử dấu phẩy không được nạp chồng, tiêu chuẩn nói rằng các biểu thức được đánh giá từ trái sang phải và giá trị kết quả là biểu thức cuối cùng. Nó hoạt động với for
khởi tạo vòng lặp, tại sao không ở đây?
if
hoạt động, và có vẻ như đó là một giả định sai.
if
.if
không phải là một vòng lặp, nó là một điều kiện.