In (Objective-) C (++) các báo cáowhile(...) { ... }
, for(...) { ... }
, switch(...) { ...}
, vv chứa một tuyên bố khối đơn (if (...) { ... } else { ... }
chứa hai). Phạm vi của các tuyên bố trong một khối chỉ là khối đó và đó là lỗi để khai báo cùng một biến hai lần trong một khối.
Khối của switch
chứa một số case ...:
nhãn - nhãn không phân cách khối, chúng chỉ là điểm trong khối điều khiển luồng có thể chuyển đến. Điều này làm cho các câu lệnh switch
trong C khác với một số ngôn ngữ khác mà mỗi nhánh là độc lập (vì hai khối trong một if/else
độc lập trong C). A C switch
chỉ là một "goto tính toán" thành một khối duy nhất. Đây là lý do tại sao câu lệnh break;
tồn tại, mà không có luồng điều khiển chỉ tiếp tục từ một nhánh "nhánh" sang dòng tiếp theo.
Một hệ quả khác của việc này là các nhánh khác nhau không thể khai báo cùng tên biến, không giống như câu lệnh if/else
.
Cuối cùng chỉ báo cáo và không tờ khai có thể được dán nhãn, và như là một case ...:
là một hình thức của nhãn không thể có một tuyên bố ngay sau khi một - vì vậy bạn không thể bắt đầu một "chi nhánh" với một bản tuyên bố.
Nếu các biến bạn muốn khai báo trong nhánh chỉ được sử dụng trong nhánh đó (nếu chúng được khai báo ở một trong các khối if/else
) thì bạn có thể giải quyết tất cả các vấn đề , { ... }
, để biến nó thành một câu lệnh khối - các khối có thể được dán nhãn và có thể chứa các khai báo cục bộ. Ví dụ. cái gì đó dọc theo dòng:
switch (expr)
{
case 1:
{
NSString *var;
// use var
break;
}
case 2:
{
NSNumber *var;
// use var
break;
}
...
}
// no var here
Nếu bạn đang gán cho các biến mà bạn cần phải sử dụng sau khi switch
sau đó bạn phải khai báo trước khi switch
, như cơ thể của một switch
là một khối và do đó một tuyên bố địa phương phạm vi. Ví dụ. cái gì đó dọc theo dòng:
NSString *var = nil;
switch (expr)
{
case 1:
...
var = ...;
break;
case 2:
...
var = ...;
break;
...
}
// use var here
HTH
Tất cả các báo cáo trong tất cả các trường hợp của một câu lệnh switch nằm trong phạm vi tương tự, vì vậy khi bạn khai báo một biến với một tên trong một trường hợp, và sau đó bạn khai báo một biến với cùng tên trong một trường hợp khác, bạn đang thực hiện khai báo hai lần một cách hiệu quả. Lỗi không có trong phân bổ hoặc định nghĩa, nó nằm trong phần khai báo. Bạn có thể sử dụng các dấu ngoặc nhọn để tạo một phạm vi mới trong mỗi trường hợp, hoặc bạn chỉ khai báo biến của bạn một lần, trước 'chuyển', và hoãn gán cho đến khi' trường hợp'. – iluvcapra