2013-03-12 25 views
6

Nhà điều hành biểu thức thông điệp mục tiêu-C (ký hiệu thông báo), sử dụng dấu ngoặc vuông [], có ưu tiên giống như toán tử C cho mảng con trỏ, cũng sử dụng dấu ngoặc vuông []?Ưu tiên toán tử Objective-C của dấu ngoặc vuông được sử dụng làm biểu thức/ký hiệu thông báo?

Tôi tham khảo this table of C operators.

Ngoài ra, một câu hỏi tương tự cũng áp dụng cho toán tử "Cú pháp chấm" Mục tiêu-C cho lời gọi phương thức truy cập so với toán tử C cho "chọn phần tử theo tham chiếu". Họ có cùng quyền ưu tiên không?

Tôi đã tìm kiếm một giờ để có câu trả lời đơn giản, dứt khoát cho câu hỏi cơ bản này. Đáng ngạc nhiên, tôi không tìm thấy một. Do đó, câu hỏi này. Liên kết chào mừng.

+0

Không có thông số ngôn ngữ ObjC (công khai, dù sao), vì vậy sẽ không có bất kỳ tài liệu nào bằng văn bản cho việc này; câu trả lời là bất kỳ trình biên dịch nào. –

+0

Có lý do cụ thể nào bạn muốn biết điều này không? –

+2

Cú pháp gửi tin nhắn không phải là toán tử để bắt đầu, vì vậy cố gắng đặt nó trên bảng các toán tử là vô nghĩa. –

Trả lời

7

Bạn đã trở nên bối rối vì nhiều giải thích về ngữ pháp và ưu tiên đưa các phím tắt để nói rằng các nhà khai thác có được ưu tiên. Họ không. Đó là sản phẩm trong ngữ pháp được ưu tiên, và chúng được ưu tiên so với các sản phẩm khác. Nó chỉ có ý nghĩa đối với hai sản phẩm có ưu tiên tương đối với nhau nếu ngữ pháp không rõ ràng (nghĩa là nó có thể tạo ra hai cây phân tích khác nhau cho cùng một đầu vào), và nếu sự mơ hồ được giải quyết bằng cách xác định ưu tiên của một sản xuất so với .

Hãy để tôi giải thích bằng ví dụ.

Dưới đây là một ngữ pháp đồ chơi:

expression = 
    | IDENTIFIER 
    | NUMBER 
    | expression '+' expression 
    | expression '*' expression 
    | expression '(' expression ')' // function call 
    | '(' expression ')' // grouping 
    | expression '[' expression ']' // array subscript 
    | '[' expression IDENTIFIER ':' expression ']' // message send 
    ; 

Bây giờ, hãy xem xét phân tích 1 + 2 * 3 với ngữ pháp này. Có hai cây phân tích cú pháp hợp lệ:

+    * 
/\   /\ 
1 *   + 3 
/\  /\ 
    2 3  1 2 

Bằng cách xác định rằng việc sản xuất * có độ ưu tiên cao hơn so với sản xuất +, chúng tôi yêu cầu phân tích cú pháp để sản xuất cây trái thay vì cây ngay. Do đó, ý tưởng về mối quan hệ ưu tiên giữa sản xuất + và sản xuất * có ý nghĩa: nó có ảnh hưởng đến đầu ra của trình phân tích cú pháp.

Tương tự, 1 + foo(3) có hai cây phân tích cú pháp:

+    () 
/\   /\ 
1 ()   + 3 
/\  /\ 
foo 3  1 foo 

Vì vậy, một lần nữa ý tưởng về một mối quan hệ ưu tiên giữa '+' sản xuất và gọi hàm sản xuất có ý nghĩa. Trường hợp của 1 + foo[3] (trong đó sử dụng sản xuất subscript thay cho sản xuất cuộc gọi chức năng) là tương tự, do đó, nó làm cho tinh thần để xác định một mối quan hệ ưu tiên giữa sản xuất '+' và sản xuất subscript.

Bây giờ, hãy xem xét 1 + (2 * 3). Ngữ pháp chỉ có thể sản xuất một cây phân tích cú pháp có thể:

+ 
/\ 
1 () 
    | 
    * 
/\ 
    2 3 

Không cần cho một mối quan hệ ưu tiên giữa + sản xuất và sản xuất nhóm, bởi vì chỉ có một cách để phân tích đầu vào này.Nó sẽ là vô nghĩa để xác định rằng sản xuất nhóm có ưu tiên cao hơn sản xuất +, bởi vì không có cây phân tích cú pháp khác mà bạn có thể sản xuất bằng cách làm như vậy.

Cuối cùng, hãy xem xét 1 + [2 add:3]. Điều này tương tự với ví dụ nhóm. Chỉ có một cây phân tích cú pháp có thể:

+ 
/\ 
/ \ 
1 [ ] 
/| \ 
/| \ 
2 add 3 

Không thể phân tích cú pháp cây khác. Không cần phải xác định mối quan hệ ưu tiên giữa sản xuất + và thông báo gửi sản xuất. Việc chỉ định một mối quan hệ ưu tiên giữa chúng sẽ không có hiệu lực, bởi vì ngữ pháp đơn giản là không cho phép đầu vào này được phân tích cú pháp theo bất kỳ cách nào khác.

+1

Tôi sợ một người biết khoa học về tính toán, thiết kế và phân tích cú pháp sẽ đi cùng và giải thích tại sao câu hỏi của tôi là vô nghĩa. Câu trả lời của bạn là hoàn toàn đáng để đối mặt với nỗi sợ của tôi. – Jeff

+0

@robmayoff giải thích tuyệt vời. thanx –

1

Chúng nằm trong cùng một nhóm ưu tiên. Tôi tin rằng thư gửi [] tương đương với() vì thời gian chạy xử lý chúng như dấu ngoặc đơn trong trường hợp thư.

http://www.techotopia.com/index.php/Objective-C_2.0_Operator_Precedence

+0

Tôi đã tìm thấy trang Techotopia, nhưng trang web đó quá spam, tôi không tin tưởng thông tin đó. – Jeff

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