2014-11-11 15 views
13

Tôi mới đến Objetive C, nhưng từ tất cả những gì tôi biết về báo cáo chuyển đổi, mã sau không nên in bất cứ điều gì, bởi vì với tôi có vẻ như có một lỗi biên dịch. Tuy nhiên 2 IS được in. Tôi không hiểu tại sao. Ai đó có thể xin giải thích?chuyển đổi câu lệnh trong C/Mục tiêu C

- (void) test { 
    int myVar = 2; 

    switch (myVar) { 
     case 1: 
     { 
      NSLog(@"result: %d", myVar); 
      break; 

      case 2: 
      { 
       NSLog(@"result: %d", myVar); 
      } 
      break; 
     } 
    } 
} 
+9

một trường hợp ': không phải là một khối hoặc một câu lệnh độc lập. Đó là một nhãn **. ** Hãy nghĩ nó là mục tiêu của một 'goto' có điều kiện. –

+5

Không chắc chắn lý do tại sao các downvotes. Đây là một chi tiết rất tinh tế của C thật thú vị. Liệu điều này biên dịch vì nó là mã hợp lệ hoặc trùng hợp ngẫu nhiên của cú pháp? Ngoài ra, hãy tìm kiếm "thiết bị của Duff". – bbum

+1

@bbum hợp lệ, chính xác vì 'trường hợp là nhãn. Ngoài ra, thiết bị của Duff. –

Trả lời

13

Bạn có thể nghĩ về switch(value){case label:, ...} xây dựng như một tuyên bố biếngoto <label>, trong đó:

1)switch(arg) xác định label thực hiện sẽ chảy vào tiếp theo.
2) Các từ khóa trường hợp: xác định nhãn. Ví dụ: case label:.

Trong câu lệnh chuyển đổi, từ khóa case được theo sau bởi một nhãn (biểu thức liên tục theo sau là :), được xử lý giống như nhãn được sử dụng trong các câu lệnh goto. Kiểm soát chuyển đến câu lệnh có số case constant-expression khớp với giá trị switch(arg).

Vì vậy, pháp lý không có gì là cú pháp sai với mã của bạn. Nghĩa là, nó sẽ biên dịch và xây dựng, và chạy tốt. Điều duy nhất cú pháp trong mã ví dụ của bạn vi phạm là khả năng đọc trong đó luồng thực thi bỏ qua khối {...}, trong hầu hết các trường hợp sẽ trực tiếp thực thi luồng và chuyển trực tiếp đến nhãn được nhắm mục tiêu được xác định bằng từ khóa case. Nên.

Thường không bỏ qua tiền lệ được thiết lập tốt để thử nghiệm với cấu trúc lai mới sẽ mang lại kết quả hữu ích. Nhưng khi đó, kết quả có thể trở thành huyền thoại. Ví dụ: see Duff's Device.

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