2010-08-14 36 views
6

Tôi vừa đọc một câu hỏi SO trên Python, và nhận thấy sự thiếu dấu ngoặc đơn trong một vòng lặp. Nhìn đẹp với tôi, sau đó tôi tự hỏi: tại sao C# yêu cầu họ?Tại sao C# yêu cầu parens xung quanh điều kiện?

Ví dụ, Tôi hiện cần phải viết:

if (thing == stuff) { 
} 

foreach (var beyonce in allthesingleladies) { 
} 

Vì vậy, tôi tự hỏi tại sao tôi không thể viết:

if thing == stuff { 
} 

Có một cú pháp sự mơ hồ trong tuyên bố mà tôi không biết?

PS, hoạt kê, niềng răng có thể tùy chọn cho một lớp lót:

if (thing == stuff) 
    dostuff(); 
+0

tôi làm obj-c và php và bạn không phải sử dụng nếu đôi khi. : p chỉ 2p của tôi. –

+0

@Ardman - OP là tham chiếu đến '()' không phải là '{}' - nhưng PS làm lẫn lộn vấn đề. – ChrisF

+0

@Ardman: Để rõ ràng, niềng răng chỉ bắt buộc nếu bạn bao gồm * nhiều hơn một câu lệnh * sau 'if' (các câu lệnh đơn có thể mở rộng nhiều dòng). –

Trả lời

8

Hệ thống cần một số cách để biết khi nào điều kiện dừng và câu lệnh bắt đầu. Điều đó có nghĩa là các parens xung quanh điều kiện là tùy chọn, hoặc các dấu ngoặc ôm xung quanh câu lệnh là tùy chọn. Các nhà thiết kế của C# đã chọn để làm cho các dấu ngoặc không bắt buộc (trong trường hợp có một câu lệnh đơn).

Hãy xem xét điều này:

if x == 12 - x == 3 ? x++ : x--; 

Một phân tích cú pháp thể được viết có thể cho biết nơi điều kiện kết thúc và báo cáo kết quả bắt đầu, nhưng đòi hỏi phải có dấu ngoặc làm cho nó đáng kể dễ dàng hơn. Trong trường hợp của ví dụ của tôi, ngữ pháp chỉ ra rằng câu lệnh đầy đủ là if (x == 12) { -x == 3 ? x++ : x--; }. Tuy nhiên, bạn không biết rằng - là sự khởi đầu của câu lệnh cho đến khi bạn nhấn số thứ hai ==, đã có 3 mã thông báo vào đó.

Vì việc phân tích cú pháp chính xác các ví dụ như vậy đòi hỏi phải tìm một số mã thông báo tùy ý trong luồng đầu vào (và làm cho mã khó đọc hơn), có lý do chính đáng để yêu cầu.

+0

Bạn không sai, nhưng theo BNF, có * luôn luôn * một tuyên bố duy nhất trong "sau đó "khoản. Bí quyết là nó có thể là một câu lệnh tổng hợp, với một số câu lệnh nằm giữa các curlies của nó. –

+0

Điều này đúng. Tuy nhiên, nó vẫn không trả lời được câu hỏi tại sao không * hoặc * có thể được bỏ qua, miễn là * cả hai * đều không. Cả hai ví dụ cuối cùng của OP đều không rõ ràng - tại sao chỉ một trong số chúng được phép? (Được hỏi nhiều hơn như một câu hỏi tu từ ...) –

+0

ah, điểm tốt. tôi nghĩ rằng điều niềng răng chỉ là một phần thú vị của đố - nhưng bạn nói đúng, bạn không thể có dấu ngoặc đơn tùy chọn * và * tùy chọn parens. –

0

Đó là một sự lựa chọn thiết kế ngôn ngữ đến từ Java mà lần lượt đến từ C++ mà lần lượt đến từ C mà lần lượt đến từ ???

Python không cần bracers như indention cho thấy ý định. F # cũng vậy. Đó là một ý tưởng hay (IMO).

+0

Python yêu cầu dấu hai chấm để biểu thị sự bắt đầu của câu lệnh đính kèm; F # sử dụng 'do' hoặc' then'. – Gabe

+0

C đến từ [B] (http://en.wikipedia.org/wiki/B_%28programming_language%29) –

2

[Tôi biết mình có khả năng Flamed cô cho điều này nhưng tôi đã có thể nói nó tất cả cùng]

Là một lập trình viên chủ yếu vb đó là một điều mà làm phiền tôi đến tận xương. Theo ý kiến ​​của tôi, parens nên được tùy chọn và niềng răng bắt buộc. Nếu nó quá nhiều để hỏi sau đó Microsoft có thể 'mượn' từ vb vào C# bằng cách giới thiệu một C# tương đương với vb's Then.

Nhưng tại sao lại bận tâm? Microsoft thiết kế C# dựa trên C, C++ và Java, tất cả đều đặt điều kiện if trong parens vậy tại sao nên C# khác?


Sửa

Thành thực mà nói, tôi nghĩ rằng dựa trên C# 4 của 'áp dụng các thông số bắt buộc và được đặt tên, một tính năng mà luôn luôn là trong VB (ít nhất là kể từ VB6), phiên bản tiếp theo của C# (C# 5.0, có nghĩa là) cũng có thể giới thiệu một tính năng 'mới', do đó bạn không phải gõ vào dấu ngoặc đơn không cần thiết.

Vì có một số ít nhất là if condition ? truePart : falsePart, có if condition then something hoặc đối với những người không tham gia C# trông giống như vb, if condition do something sẽ không phải là một ý tưởng tồi.

+1

Là một lập trình viên VB cũ, tôi cũng đã tìm thấy parens (và niềng răng, cho rằng vấn đề) khó chịu. Nhưng với tư cách là lập trình viên C# cải cách, tôi thấy rằng, đối với tôi, niềng răng và dấu ngoặc đơn làm cho việc đọc mã dễ dàng hơn, bởi vì chúng hoạt động trực quan như bài viết hàng rào (parens và niềng răng là khác biệt với từ). Hôm nay tôi thấy đọc VB không thoải mái, nhưng tôi cho rằng nó đi xuống đến những gì bạn đang sử dụng để (hoặc hiện đang sử dụng, có lẽ). –

+0

Tôi đồng ý rằng tôi thấy dấu câu giúp dễ đọc hơn. Ngôn ngữ sử dụng các từ cho dấu chấm câu (như COBOL hoặc VB) khó đọc hơn. – Gabe

+3

VB cũng đã parens, từ khóa Then. Sử dụng dấu câu thay vì từ khóa chỉ đơn thuần là tùy chọn kiểu. –

4

Đó là cú pháp 'tính năng' quay lại C và có thể với một số ngôn ngữ trước đó.

Về cơ bản nó là một sự lựa chọn giữa

if (condition) statement; 

if condition then statement; 

Trong thời gian khi C đã được hình thành, ký hiệu ngắn hơn và ít từ khoá hơn là xu hướng.

0

BTW, nếu tôi có người phân tích, tôi sẽ cho phép một nhà điều hành bên ngoài cuộc gọi: một dấu chấm than hàng đầu. Nó cho tôi biết rằng việc kiểm tra mã cho các điều kiện tiêu cực phức tạp kết thúc với một bộ ngoặc đơn bổ sung so với kiểm tra mã cho những người tích cực phức tạp.

+0

Tôi đồng ý, 'if!' Là một cách ngắn gọn, ngắn gọn để nói 'trừ khi'. – Gabe

0

Nói một cách đơn giản, đó là do cách C/C++/C# xử lý không gian trắng. Bạn cần một số loại dấu phân tách vì các câu lệnh có thể mở rộng nhiều dòng. Bạn cũng cần một cách để "chặn" hoặc nhóm các câu lệnh lại với nhau thành một khối.

  • C/C++/C# sử dụng() 's, {}' s
  • VB/VB.NET/VBScript/VBA sử dụng Chức năng/End Function, Sub/End Sub, Nếu/Sau đó/Khác/Khác Nếu/Kết thúc Nếu vậy, và như vậy vào. (Chỉ để chặn, vì các ngôn ngữ dựa trên VB không hỗ trợ các câu lệnh trải rộng trên nhiều dòng.)

Nếu câu hỏi cụ thể của bạn, bạn đang sử dụng() để tạo biểu thức. Do đó, bạn cần một cách để báo cho trình biên dịch biết bạn đang thực hiện với biểu thức, vì {} (các dấu phân cách chặn) không bắt buộc.

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