2015-05-28 13 views
5

Tôi sẽ thực hiện theo hướng dẫn this về lập trình C. Nó nói:Tuyên bố chuyển đổi: Là logic khác nhau trong C v/s. các ngôn ngữ khác như Java?

Tuyên bố chuyển đổi thực sự là hoàn toàn khác (từ các ngôn ngữ khác) và thực sự là "bảng nhảy". Thay vì các biểu thức boolean ngẫu nhiên, bạn chỉ có thể đặt các biểu thức dẫn đến các số nguyên và các số nguyên này được sử dụng để tính toán các bước nhảy từ đầu công tắc đến phần khớp với giá trị đó. Dưới đây là một số mã mà chúng tôi sẽ chia nhỏ để hiểu khái niệm "bảng nhảy" này.

Nhưng, trường hợp của câu lệnh switch cần phải được so sánh cho đến khi một hợp được tìm thấy (nếu không mặc định được trả lại.)

Làm thế nào là nó khác với nhiều câu lệnh if-else sau đó? Hoặc, nó chỉ là một đường cú pháp? Tôi có thiếu cái gì quan trọng ở đây không?

+3

Bài viết bạn liên kết đến giải thích một cách chính xác làm thế nào một câu lệnh switch có thể được tối ưu hóa để sử dụng bảng nhảy, thay vì một chuỗi so sánh. Bạn đã đọc điều đó chưa? –

+0

Thực ra đó là cách nó được thực hiện trong Java, và tôi nghi ngờ các ngôn ngữ khác dựa trên C. –

+0

Trích dẫn đề cập đến Ruby như là khác nhau. –

Trả lời

3

Dường như cách triển khai thực hiện là tùy thuộc vào trình biên dịch. How Switch case Statement Implemented or works internally?

nhưng nói chung một tuyên bố chuyển đổi có điều kiện trước cho phép trình biên dịch tối ưu hóa nó khác với chỉ báo cáo, đó là mục bạn so sánh luôn luôn là một loại số nguyên (char/int/Dài).

Các ngôn ngữ khác cho phép các nguyên thủy có thể được đánh giá tại thời gian biên dịch được sử dụng làm biến báo cáo chuyển đổi (chuỗi trong C#).

Nhưng nói chung, khác với tốc độ tiềm năng (và sự sụp đổ có thể xảy ra nếu bạn không phá vỡ), không có sự khác biệt về hành vi từ một loạt các if.

2

Việc triển khai Java tương tự với GCC 4.8.javac biên dịch để:

  • tableswitch nếu bảng là nhỏ gọn, đó là O (1)
  • lookupswitch nếu không muốn nói, đó là một O (log (n)) tìm kiếm nhị phân

Một tương tự kỹ thuật được sử dụng bởi GCC:

  • O (1) nhảy bảng nếu nhỏ gọn với *%rax
  • O (log (n)) else if tìm kiếm nhị phân khác

Trong trường hợp định nghĩa của nhỏ gọn có thể được tìm thấy tại địa chỉ:

Để quan sát điều đó, chỉ cần biên dịch lại các trường hợp thử nghiệm tối thiểu:

  • trong Java với javap
  • trong C với objdump -S

dụ nhỏ gọn:

switch (i) { 
    case 0: 
     j = 0; 
    break; 
    case 1: 
     j = 1; 
    break; 
    case 2: 
     j = 2; 
    break; 
    case 3: 
     j = 3; 
    break; 
    case 4: 
     j = 4; 
    break; 
    case 5: 
     j = 5; 
    break; 
}; 

Non compact dụ:

switch (i) { 
    case 0: 
     j = 0; 
    break; 
    case 1: 
     j = 1; 
    break; 
    case 0x10: 
     j = 2; 
    break; 
    case 0x100: 
     j = 3; 
    break; 
    case 0x1000: 
     j = 4; 
    break; 
    case 0xFFFFFFF: 
     j = 5; 
    break; 
}; 
Các vấn đề liên quan