2015-05-28 7 views
5

Przechodzę przez this samouczek dotyczący programowania w języku C. Jest napisane:Przełącznik: czy logika jest inna w C v/s. inne języki, takie jak Java?

Instrukcja switch jest w rzeczywistości zupełnie inna (z innych języków) i jest naprawdę "tabelą skoków". Zamiast wyrażeń losowych boolowskich można wstawiać tylko wyrażenia, które dają liczby całkowite, a te liczby całkowite są używane do obliczania skoków od góry przełącznika do części odpowiadającej tej wartości. Oto kod, który rozbijamy, aby zrozumieć tę koncepcję "tabel skoków".

Ale przypadki switch musi być porównane aż zostanie znaleziony (inaczej domyślny jest zwracana.)

Czym różni się od wielokrotności if-else wtedy? A może to tylko cukier syntaktyczny? Czy brakuje mi czegoś ważnego tutaj?

+3

artykuł, który odwołuje się do wyjaśnia dokładnie, jak oświadczenie przełącznik może być zoptymalizowany do użycia tabeli przeskoku, a nie łańcucha porównań. Czytałeś to? –

+0

Właściwie to jest zaimplementowane w Javie i podejrzewam, że inne języki oparte na C. –

+0

Cytat odnosi się do Ruby jako innej. –

Odpowiedz

3

Wygląda na to, że sposób jego implementacji zależy od kompilatora. How Switch case Statement Implemented or works internally?

ale generalnie instrukcja switch ma warunek wstępny, który pozwala kompilatorowi zoptymalizować go, który różni się od samych instrukcji if, czyli porównywany element jest zawsze typem całkowitym (char/int/długie).

Inne języki umożliwiają użycie prymitywów, które mogą być oceniane w czasie kompilacji, jako zmienne instrukcji switch (string w C#).

Ogólnie rzecz biorąc, poza potencjalnym przyspieszeniem (i upadkiem, który może się zdarzyć, jeśli się nie złamiesz), nie ma żadnej różnicy behawioralnej od mnóstwa przypadków.

2

Implementacja Java jest analogiczna do wersji GCC 4.8.javac zestawia się:

  • tableswitch jeżeli tabela jest zwarte, co oznacza O (1)
  • lookupswitch jeśli nie, co O (log (n)) przeszukiwanie binarne

Analogiczne technika ta jest wykorzystywana przez GCC:

  • o (1), jeśli skok tabeli zwarta *%rax
  • O (log (n)) else if wyszukiwania binarnego inaczej

Jeżeli definicja kompaktowych można znaleźć na stronie:

Aby to zaobserwować, wystarczy dekompilować minimalne przypadki testowe:

  • w Javie z javap
  • w C objdump -S

Compact przykład:

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 kompaktowy przykład:

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; 
}; 
Powiązane problemy