2011-11-05 29 views
19
int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
} 

mã ở trên là hợp lệ? xem nếu tôi chắc chắn rằng int sẽ không có giá trị nào thay vì 1 và 0 thì trong trường hợp đó tôi có thể tránh mặc định không?Nếu tôi không viết mặc định trong trường hợp chuyển đổi thì sao?

Điều gì xảy ra nếu trong mọi trường hợp, giá trị sẽ khác nhau 1 và 0?

Edit: tôi biết đây là câu hỏi ngớ ngẩn nhưng tôi đã suy nghĩ rằng có lẽ nó sẽ là hành vi bất hợp pháp hoặc không xác định vì vậy chỉ cần hỏi để đảm bảo

+6

tôi đã thử nhưng tôi đã nghĩ rằng có lẽ nó sẽ là hành vi bất hợp pháp hoặc không xác định vì vậy chỉ cần yêu cầu đảm bảo –

+0

Trong trường hợp này tôi luôn đặt mặc định và ném ngoại lệ. Bây giờ trong C# 7 với sự linh hoạt lớn hơn của "trường hợp khi" tôi đã di chuyển để bao gồm tất cả các trường hợp có thể và sử dụng mặc định để trang trải những người không thể. Douglas Adams sẽ hiểu được quan điểm đó. – Paulustrious

Trả lời

47

Mã hợp lệ. Nếu không có nhãn default: và không có nhãn nào trong số các nhãn case khớp với giá trị "đã chuyển", thì sẽ không có câu lệnh ghép hợp chất được kiểm soát nào được thực thi. Việc thực hiện sẽ tiếp tục từ cuối báo cáo chuyển đổi.

ISO/IEC 9899: 1999, phần 6.8.4.2:

[...] Nếu không chuyển đổi case trận đấu biểu hiện liên tục và không có default nhãn, không có phần nào của cơ thể chuyển đổi được thực hiện.

2

Đó là hợp lệ không có một trường hợp default.

Tuy nhiên, ngay cả khi bạn chắc chắn rằng bạn sẽ không có bất kỳ giá trị nào thay vì 1 và 0, bạn nên có trường hợp mặc định để nắm bắt bất kỳ giá trị nào khác (mặc dù về mặt lý thuyết là không thể) xuất hiện trong một số trường hợp, như tràn bộ đệm) và in lỗi.

+0

Bạn đang giả định rằng đó là lỗi không khớp với một trong các trường hợp báo cáo - có thể đúng trong trường hợp này. Bạn có thể _want_ chỉ thực hiện một hành động một số giá trị có thể có của một biến và chỉ thực hiện trong các trường hợp khác. IMHO, đây là cách sử dụng hoàn toàn hợp lý câu lệnh chuyển đổi. –

+0

@Charles: Ông viết trong câu hỏi: xem tôi có chắc chắn rằng int sẽ không có giá trị nào thay vì 1 và 0 thì trong trường hợp đó tôi có thể tránh mặc định: –

+1

Tôi không đồng ý với bạn, tôi ' m xin lỗi nếu nó đi qua như thế. Tôi đã chỉ ra rằng mặc dù, nói chung, nó là thực hành tốt để có một nhãn 'mặc định', nó không nhất thiết phải thực hành xấu để bỏ qua một. –

7

Đó là mã hoàn toàn hợp pháp. Nếu a không phải là 0 hoặc 1, thì khối chuyển đổi sẽ bị bỏ qua hoàn toàn.

2

có mã trên là hợp lệ,

nếu điều kiện chuyển đổi không phù hợp với bất kỳ điều kiện của vụ án và một mặc định không được trình bày việc thực hiện chương trình đi trước thoát từ việc chuyển đổi mà không làm bất cứ điều gì.

21

Khi những người khác đã chỉ ra đó là mã hoàn toàn hợp lệ. Tuy nhiên, từ quan điểm kiểu mã hóa, tôi thích thêm một câu lệnh trống rỗng default với một nhận xét để làm rõ rằng tôi đã không vô tình quên nó.

int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
default: // do nothing; 
     break; 
} 

Mã được tạo có/không có default phải giống nhau.

+3

+1 cho mục đích giao tiếp. – weberc2

+0

+1 Tôi googled mong đợi một câu trả lời như thế này. – Suzi

+1

Nếu bạn có ý định xử lý tất cả các trường hợp trong một enum, tôi sẽ đề nghị * bỏ qua * trường hợp mặc định, bởi vì hầu hết các trình biên dịch sẽ cảnh báo nếu một trường hợp enum bị quên trong câu lệnh switch. – rdb

-2

Tôi đề nghị mỗi trường hợp phải có một "default:" cuối cùng như mã này !! , nó sẽ là tốt để có một "default:" Trường hợp Nếu Bất cứ điều gì xảy ra lỗi hoặc thay đổi Bạn có thể cảnh báo người dùng về một giá trị sai

int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
default: // do nothing; 
     break; 
} 

nhưng vẫn trường hợp có thể chạy mà không cần "default:", như nếu phát biểu, bạn có thể chạy if() mà không cần else()

+1

Cách này trả lời câu hỏi? Và những gì nó thêm rằng đã không được nói trong câu trả lời chấp nhận? (Ngoài ra, bạn nên xem xét mất dấu chấm than.) –

1

Điều này cũng giống như không nếu điều kiện phù hợp và không được cung cấp.

mặc định không phải là trường bắt buộc trong trường hợp chuyển đổi. Nếu không có trường hợp nào phù hợp và mặc định không được cung cấp, thì không có gì sẽ được thực hiện.

2

Mặc định không bắt buộc nhưng luôn tốt để có nó. Mã này là lý tưởng nhưng cuộc sống của chúng tôi không phải là, không có hại để đặt một bảo vệ ở đó. Nó cũng sẽ giúp bạn gỡ lỗi nếu có bất kỳ điều bất ngờ nào xảy ra.

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