2013-08-27 59 views
8

mặt hàng này trong linux/kernel/signal.cMặc định khoản trước khi phần trường hợp trong câu lệnh switch

switch (_NSIG_WORDS) { 
default: 
    for (i = 1; i < _NSIG_WORDS; ++i) { 
     x = *++s &~ *++m; 
     if (!x) 
      continue; 
     sig = ffz(~x) + i*_NSIG_BPW + 1; 
     break; 
    } 
    break; 

case 2: 
    x = s[1] &~ m[1]; 
    if (!x) 
     break; 
    sig = ffz(~x) + _NSIG_BPW + 1; 
    break; 

case 1: 
    /* Nothing to do */ 
    break; 
} 

Có lẽ đây không phải là ví dụ khá tốt, nhưng tôi không thể hiểu được cách thức hoạt động và những gì nhắc Linus để đặt phần mặc định ở phía trước câu lệnh chuyển đổi.

+0

'x = * ++ s & ~ * ++ m;' == 'x = (* (++ s)) & (~ (* (++ m)));' ..'default: 'giống như bất kỳ trường hợp nào khác nếu bạn không viết như cuối cùng, bạn cần thêm câu lệnh' break; 'cho cùng một lý do chúng ta trường hợp khác –

Trả lời

10

Thứ tự của case nhãn trong một khối switch trong mã không có gì để thực hiện với thao tác được thực thi. Nhãn default được thực hiện nếu không có số case khớp hoặc rơi từ số case phía trên. Có nó đầu tiên trong cơ sở mã không thay đổi điều này.

Một lợi thế khi có default trước tiên là không thể để case ở trên nó vô tình hoặc cố tình rơi qua default. Điều này có nghĩa là default sẽ chạy nếu, và chỉ khi, giá trị khớp với không có câu hỏi case trong khối switch.

Để cực kỳ dễ hiểu, bạn vẫn có thể nhấn nhãn default với một số goto rõ ràng. Đó là khá hiếm mặc dù.

+1

Không chắc chắn liệu tôi có nhận được lý do cho phần thứ hai của câu trả lời hay không. Giả định là nó nguy hiểm hơn để đi qua để mặc định hơn bất kỳ trường hợp nào khác? – Ziffusion

+3

@Ziffusion lý do như sau: Mọi người tin rằng 'mặc định' chỉ nên được nhấn nếu không có giá trị khớp. Đặt nó ở đầu làm cho trực quan dễ dàng hơn để xác nhận điều này thực sự là trường hợp. Nó cũng làm cho các bổ sung trong tương lai mà bị thông qua và vi phạm các giả định về 'mặc định' nhiều hơn nữa có thể nhìn thấy. Lưu ý tôi không nói rằng tôi đồng ý với nó, điều này chỉ đơn giản là logic những người khác đã trình bày cho tôi trong quá khứ – JaredPar

+1

Cảm ơn bạn rất nhiều, @ JaredPar, tôi nghĩ rằng swith-case hoạt động như 'if ('a') {/ * something * /} else if ('b') {/ * something else * /} else {/ * khá khác * /} ', và mệnh đề' default' là cái gì đó giống như 'else' cuối cùng không có' if (..) .) '. Tôi nghĩ rằng đây là một khía cạnh quan trọng của ngôn ngữ C, vì vậy cảm ơn bạn một lần nữa. – Netherwire