2012-02-23 28 views
14

Báo cáo được đưa ra trước bất kỳ câu lệnh nào được dán nhãn case trong khối switch-case được xử lý. Xin giải thích hành vi của các chương trình sauLệnh chuyển đổi hoạt động như thế nào?

prog1:

#include<stdio.h> 
int main() 
{ 
    switch(1) 
    { 
    int i=0; 
    case 1:printf("%d",i);   
    } 
getchar(); 
return 0; 
} 

Output: giá trị rác.

prog2:

#include<stdio.h> 
int main() 
{ 
    switch(1) 
    { 
    printf("Inside Switch"); 
    case 1:printf("Case 1\n");  
    } 
    printf("Outside Switch"); 
    getchar(); 
    return 0; 
} 

Output:

Trường hợp 1

Outside Chuyển dữ liệu.

Báo cáo trước khi tuyên bố có nhãn có vẻ không thể truy cập theo chương trình 2 nhưng tại sao tôi không gặp lỗi cho biến chưa khai báo i trong chương trình đầu tiên (chỉ cảnh báo).

Sẽ thực sự hữu ích nếu ai đó có thể giải thích chi tiết cách tuyên bố switch được xử lý nội bộ.

+1

Đây có phải là bài tập về nhà không? Nghe có vẻ như bài tập về nhà. Nếu vậy, hãy thêm thẻ 'bài tập về nhà' và hiển thị công việc của riêng bạn cho đến thời điểm này. –

+2

@ T.J.Crowder Đây không phải là bài tập về nhà.Tôi đã xem qua điều này trong khi tham gia các bài kiểm tra C trên gild và tôi tò mò muốn biết. – Bazooka

+0

Câu lệnh 'switch' về cơ bản là cú pháp đường cho một bảng nhảy với' goto's. –

Trả lời

6

Điều này được giải thích rõ nhất bằng các trích dẫn từ tiêu chuẩn c. Tôi đang trích dẫn các phần liên quan từ tiêu chuẩn áp dụng cho câu hỏi của bạn tại đây.

6.8.4.2 Lệnh switch

Para 4:

Một tuyên bố switch nguyên nhân kiểm soát để chuyển đến, vào, hoặc qua báo cáo kết quả đó là cơ thể switch, tùy thuộc trên giá trị của một biểu thức kiểm soát và trên nhãn có nhãn default và các giá trị của bất kỳ nhãn case nào trên hoặc trong thân chuyển đổi ......

Para 2:

Nếu một tuyên bố switch có liên quan đến case hoặc default nhãn trong phạm vi của một định danh với một loại biến đổi variably, toàn bộ câu lệnh switch phải nằm trong phạm vi của số nhận dạng đó.154)

chú thích:

154) Đó là, việc kê khai hoặc trước câu lệnh switch, hoặc nó sau cuối cùng case hoặc default nhãn gắn liền với switch đó là trong khối chứa khai báo.

Para 7:
VÍ DỤ Trong đoạn chương trình nhân tạo

switch (expr) 
{ 
    int i = 4; 
    f(i); 
    case 0: 
     i = 17; 
     /* falls through into default code */ 
    default: 
     printf("%d\n", i); 
} 

đối tượng có nhận dạng là i tồn tại với thời gian lưu trữ tự động (trong khối) nhưng không bao giờ được khởi tạo, và do đó, nếu biểu thức điều khiển có giá trị khác, cuộc gọi đến hàm printf sẽ truy cập một giá trị không xác định. Tương tự, không thể gọi đến hàm f.


Các nêu trên áp dụng cho cả những ví dụ mã trong câu hỏi.
Example 1, i có Không xác định giá trịvì nó không bao giờ được khởi tạo & vì thế in rác, Trong thời gian ở
Example 2, printf cuộc gọi không đạt được vì sự kiểm soát nhảy đến phù hợp với case nhãn.

+1

cảm ơn vì điều này và những người khác bạn đã trả lời cho tôi. Nhiều đánh giá cao. – Bazooka

+0

+1. Tôi cũng có một cách viết nhỏ về cách chúng được trình biên dịch thực hiện nếu bạn quan tâm, xem [ở đây] (http://lazarenko.me/2013/01/13/switch-statement-machine-code/). –

5

Về cơ bản, một công tắc hoạt động như một goto đến nhãn thích hợp - các câu lệnh can thiệp không được thực thi. Các định nghĩa biến (thực sự xảy ra tại thời gian biên dịch) xảy ra, nhưng nếu chúng chứa khởi tạo, thì nó cũng bị bỏ qua.

+0

Bạn có thể cung cấp một ví dụ về mã không. –

2

Không bao giờ viết câu lệnh trong công tắc không nằm trong bất kỳ trường hợp nào hoặc mặc định vì chúng sẽ không được thực thi.

LƯU Ý: khai có thể được viết ở đó nhưng không tuyên bố (int i; là khai nhưng int i = 10; là khai + phân = tuyên bố để phân công sẽ không được thực hiện có ..!)

switch(a) 
{ 
printf("This will never print"); // this will never executed 
case 1: 
     printf(" 1"); 
break; 

default : 
break; 
} 

vui lòng xem điều này Why variables can not be declared in a switch statement just after labels?

+1

Cảm ơn bạn đã liên kết và trả lời. – Bazooka

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