Ít hoặc nhiều, đây là lần phát trên dangling else problem.
Ví dụ,
if(blah)
if (more blah)
// do some blah
else
// no blah I suppose
Nếu không có dấu ngoặc nhọn, những thứ khác là mơ hồ bởi vì bạn không biết nếu nó liên quan đến việc đầu tiên hoặc thứ hai nếu tuyên bố. Vì vậy, bạn phải dự phòng trên một trình biên dịch (ví dụ trong Pascal hoặc C, trình biên dịch giả định sự lúng túng khác được liên kết với câu lệnh if gần nhất) để giải quyết sự mơ hồ hoặc không biên dịch hoàn toàn nếu bạn không muốn cho phép sự mơ hồ như vậy ngay từ đầu.
Tương tự,
try
try
// some code that throws!
catch(some blah)
// which try block are we catching???
catch(more blah)
// not so sure...
finally
// totally unclear what try this is associated with.
Bạn có thể giải quyết nó với một quy ước, nơi khối catch được luôn gắn liền với những thử gần nhất, nhưng tôi tìm thấy giải pháp này thường cho phép các lập trình viên để viết mã đó là nguy hiểm tiềm tàng. Ví dụ: trong C, điều này:
if(blah)
if(more blah)
x = blah;
else
x = blahblah;
... là cách trình biên dịch sẽ hiểu điều này nếu/nếu/khối khác. Tuy nhiên, nó cũng hoàn toàn hợp pháp để vít lên thụt của bạn và viết:
if(blah)
if(more blah)
x = blah;
else
x = blahblah;
... mà bây giờ làm cho nó xuất hiện như khác được kết hợp với bên ngoài câu lệnh if, trong khi thực tế nó được kết hợp với bên trong nếu tuyên bố do các công ước C. Vì vậy, tôi nghĩ rằng yêu cầu niềng răng đi một chặng đường dài hướng tới giải quyết sự mơ hồ và ngăn chặn một lỗi khá lén lút (những loại vấn đề có thể được tầm thường để bỏ lỡ, ngay cả trong kiểm tra mã). Các ngôn ngữ như python không có vấn đề này kể từ khi thụt đầu dòng và vấn đề khoảng trắng.
Eh, bởi vì các nhà thiết kế của một trong hai ngôn ngữ cảm thấy như thế này là không cần thiết? –
Yêu cầu tính năng http://connect.microsoft.com/ –
Đó là âm mưu của các nhà thiết kế ngôn ngữ giúp bạn sử dụng phong cách cú đúp K & R. – zwol