2008-12-15 39 views
12

Dưới đây là một mảnh thú vị của mã mà thành viên trong nhóm đồng nghiệp của tôi đã chỉ có một cuộc thảo luận sôi nổi về hơi ...'Nếu' tuyên bố và ruột kết

Dim fred As Integer 

    If True Then fred = 5 : fred = 3 : fred = 6 Else fred = 4 : fred = 2 : fred = 1 

Sau khi thực hiện đoạn mã trên, là những gì giá trị của fred?

Cố gắng không gian lận và gỡ lỗi mã.

Đây là một ví dụ mã có tính bắt đầu cao như là một ví dụ về việc sử dụng dấu hai chấm với câu lệnh If, nhưng sau đó ai đó quyết định tự mình lấy kết quả cho fred.

CẬP NHẬT: Tôi thường không viết mã như thế này và đoạn mã này chỉ làm ví dụ. Khi nó xảy ra, câu hỏi này bắt nguồn từ một cuộc thảo luận liên quan đến việc tạo ra một tài liệu tiêu chuẩn mã hóa cho nhóm của chúng tôi.

Trả lời

16

tôi giả sử bạn có nghĩa là VB.Net.

Theo ngữ pháp trong spec VB ngôn ngữ mà bạn có thể đọc ở đây:

http://www.microsoft.com/Downloads/thankyou.aspx?familyId=39de1dd0-f775-40bf-a191-09f5a95ef500&displayLang=en

Kết quả sẽ là "6".

này là vì ngữ pháp cho một "dòng lệnh if" là:

If BooleanExpression Then Statements [ Else Statements ] StatementTerminator 

và "báo cáo" được định nghĩa là

Statements ::= 
[ Statement ] | 
Statements : [ Statement ] 

Edit: Tôi muốn lưu ý gỡ lỗi mã không phải là "gian lận".

Tôi đã từng làm việc trong nhóm biên dịch VB tại Microsoft.

Có những lúc thông số không rõ ràng hoặc không khớp với những gì chúng tôi đã thực sự xuất xưởng. Trong một số trường hợp, giải pháp (những gì chúng tôi đã làm để sửa chữa nó) luôn dựa trên "tốt ... trình biên dịch làm gì bây giờ".

Đôi khi chúng tôi sẽ thay đổi trình biên dịch, đôi khi chúng tôi sẽ thay đổi thông số.

Tuy nhiên, chúng tôi sẽ luôn chạy trình biên dịch để xem nó thực sự đã làm gì trước khi chúng tôi đưa ra quyết định.

Vì vậy, việc gỡ lỗi mã là một phần lớn trong việc tìm ra những gì nó ...

+1

+1 Cái nhìn sâu sắc rực rỡ – ComethTheNerd

+0

"gỡ lỗi" -> "gỡ lỗi". VB.Net "->" VB.NET "(ref. Http://vi.wikipedia.org/wiki/Visual_Basic_.NET). –

+0

To làm rõ, toán tử dấu hai chấm đơn giản cho phép bạn kết hợp nhiều câu lệnh trên một dòng, giống như thực hiện các câu lệnh trên các dòng kế tiếp. –

0

Chỉ cần đoán

fred = 6 vì bạn có thể có nhiều câu lệnh trên cùng một dòng được phân tách bằng dấu hai chấm.

Không chắc nếu "khác" là hợp pháp (ví dụ: compilable)

IMHO một phong cách mã hóa tốt hơn nên được chọn:


if (condition) then 
    statement 
    statement 
else 
    statement 
    statement 
end if 
3

Tôi chưa sử dụng BASIC rộng rãi trong một thời gian, vì vậy đây chỉ là phỏng đoán, nhưng tôi nghĩ rằng fred6.

Thành thật mà nói, mã không thể đọc được. Tôi cảm thấy rằng bằng cách không có mọi thứ trong một dòng và sử dụng thụt lề, mã sẽ dễ đọc hơn:

Dim fred As Integer 

If True Then 
    fred = 5 
    fred = 3 
    fred = 6 
Else 
    fred = 4 
    fred = 2 
    fred = 1 
End If 

Tôi tin rằng đó là mã tương đương, nếu tôi không nhầm.

Nhưng, nếu mã không tương đương, điều đó sẽ trả về một điểm khác: Mã gốc là "khéo léo" theo cách mà dường như nó đang nói không phải là điều thực sự xảy ra. Tương tự như các bẫy bằng các ngôn ngữ C-style:

if (condition) 
    do_something(); 
    do_other_thing(); 

Mã này dường như nói ngụ ý rằng do_somethingdo_other_thing được thực thi khi condition là đúng, nhưng trong thực tế, do_other_thing luôn thực thi.

Tốt nhất là cố gắng tuân theo các kiểu mã hóa làm cho ý định của mã rõ ràng hơn và ít mang tính phi thường hơn.

2

Kết quả cuối cùng là 6.
Bây giờ câu hỏi thực sự là: Làm cách nào bạn vào được repo của mình?
:-)

0

Trong phương ngữ BASIC thực sự cũ, điều duy nhất có thể theo sau "THÌ" là số dòng. Nhiều phương ngữ cải thiện điều này bằng cách cho phép mã theo "THÌ"; sau khi phân tích cú pháp qua "THÌ", họ sẽ chuyển sang dòng tiếp theo nếu điều kiện được chỉ định là sai hoặc tiếp tục với dòng hiện tại. Các phương ngữ khác đã thêm vào khả năng bỏ qua cho đến cuối dòng hoặc "ELSE", tùy theo điều kiện nào đến trước; cố gắng thực thi câu lệnh "ELSE" sẽ chuyển sang cuối dòng.

Khi QuickBasic được giới thiệu, nó đã thêm hỗ trợ cho nhiều dòng nếu/sau đó khối khác, nhưng vẫn tiếp tục hỗ trợ cho cách tiếp cận kiểu cũ. Visual Basic theo sau phù hợp, và vb.net tiếp tục truyền thống.

Các vấn đề liên quan