2012-03-29 29 views
7

Việc mở rộng phạm vi trường hợp GNU cho phép dao động trường hợp trong báo cáo chuyển đổi:Chuyển đổi phần mở rộng phạm vi trường hợp GNU tiêu chuẩn C

switch (value) { 
    case 1 ... 8: 
     printf("Hello, 1 to 8\n"); 
     break; 
    default: 
     printf("Hello, default\n"); 
     break; 
} 

Làm thế nào bạn có thể chuyển đổi này để chuẩn C (c99, hoặc C89)? Thêm các câu lệnh riêng lẻ?

Chỉnh sửa: Bạn sẽ xử lý các câu lệnh chuyển đổi rất lớn một cách cụ thể như thế nào?

Trả lời

7
switch(value) 
{ 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
     printf("Hello, 1 to 8\n"); 
     break;  
    default:   
     printf("Hello, default\n");   
     break; 
} 

EDIT: Để trả lời nhận xét.
Nếu bạn có quá nhiều trường hợp, khi đó bạn có thể cân nhắc thay thế các trường hợp chuyển đổi trường hợp với if-else. Nó có thể sạch hơn, ngắn gọn & có thể đọc được.

if (value >=1 && value <= 8) 
{  
    printf("Hello, 1 to 8\n"); 
} 
else 
{ 
    printf("Hello, default\n"); 
} 
+2

Tôi đang cố gắng thay thế một trường hợp 32 ... 126: :) Đó sẽ là một câu lệnh chuyển đổi dài ... – Ynv

+0

Có cách nào để tạo các trường hợp này với bộ tiền xử lý C không? – Ynv

+0

@Ynv: Bạn có thể chỉ muốn chuyển sang sử dụng một loạt các câu lệnh if-else. –

2

Nếu phạm vi dài dài bạn có thể làm, một chút bẩn nhưng,

switch(what) { 
case 1: 
    /* do 1 */ 
    break; 
case 2: 
    /* do 2 */ 
    break; 
default: 
    if (what > 31 && what < 127) { 
     /* do 32 to 126 */ 
    } 
} 

Điều tốt nhất sẽ lẽ thể để loại bỏ các chuyển đổi cho một nếu tất cả cùng nhau.

Cực kỳ nghiêm ngặt khi lồng ghép. Nếu bạn muốn chuyển đổi, vì một lý do nào đó, thì tốt hơn thì ở trên sẽ là:

if (value > 31 && value < 127) { 
    /* Do something */ 
} else { 
    switch (value) { 
    case 1: 
     ... 
    } 
} 

Ach, xin lỗi vì đã chỉnh sửa lại. này sẽ sạch hơn.

if (value > 31 && value < 127) { 
    /* Do something */ 
} else if (value > 127 && value < 178) { 

} else if (... 

} 

switch (value) { 
case 1: 
    ... 
} 
3

Tôi sẽ sử dụng một tuyên bố if:

if (value >=1 && value <= 8) { 
    printf("Hello, 1 to 8\n"); 
} else { 
    printf("Hello, default\n"); 
} 

Sau đó bạn có thể thêm else if báo cáo nếu có nhiều dãy được yêu cầu,

2

Ngoài ra, kể từ khi con số này tiếp giáp với nhau, bạn có thể thực hiện tối ưu hóa thủ công trường hợp chuyển đổi.

typedef void(*func_t)(void); 

#define CASES_N 9 

void func0 (void) 
{ 
    printf("Hello, 0\n"); 
} 

void func1 (void) 
{ 
    printf("Hello, 1 to 8\n"); 
} 

static const func_t execute [CASES_N] = 
{ 
    &func0, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1 
}; 

int main() 
{ 
    if(what < CASES_N) 
    { 
    execute[what](); 
    } 
    else 
    { 
    printf("Hello, default\n"); 
    } 
} 

Mã này về cơ bản giống như trình chuyển đổi được tối ưu hóa trình biên dịch.

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