2012-11-05 6 views
5

Chociaż jestem nowy na C i chcą pomóc w tym programieC: Sprawa przełącznik z operatorem logicznym

mojego kodu jest:

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 

    int suite=2; 

    switch(suite) 
    {   
     case 1||2: 
     printf("hi"); 

     case 3: 
     printf("byee"); 

     default: 
     printf("hello"); 
    } 

    printf("I thought somebody"); 
    getche(); 
    } 

pracuję w Turbo C i nie wykazuje błąd i wyjście to
cześć, myślałem

Proszę, daj mi znać, jak to działa? uwaga: - tutaj przerwa nie ma miejsca, ponieważ celowo je opuściłem.

+7

Powinieneś poznać moich znajomych: Enter i spację. Są naprawdę niesamowite i mogą sprawić, że twój kod będzie świetny, jeśli dobrze ich poprosisz. –

+0

Dziękuję @Aniket ... –

+0

@BobKaufman Edytowałem tylko częściowo - jego część nigdy nie została zapisana. Dziękuję także DaoWen :-) –

Odpowiedz

6

to zrobić:

switch(suite){ 
    case 1:/*fall through*/ 
    case 2: 
    printf("Hi"); 
... 
} 

To będzie dużo bardziej przejrzysty sposób to zrobić. Wyrażenie 1||2 ocenia się na 1, ponieważ suite było 2, nie będzie ani pasowało 1, ani 3 i przeskakiwało do przypadku default.

+7

Są dozwolone ... po prostu nie będą działać tak, jak mógłby tego oczekiwać. –

+0

@JeffMercado dzięki, mogę sprawdzić, jak działają. Mężczyzna 8 lat z C i coś z tego wciąż wraca i szkoły ja –

+0

Aniket - Ponieważ nie ma typu boolowskiego w C (są tylko ints) kompilator zrobi stałe zwijanie na '1 || 2', jak to by Wykonaj '0 + 1', a skończysz na' case 1' zamiast _1 lub 2_, którego może oczekiwać użytkownik, jeśli pochodzą z języka z pełnym dopasowaniem do wzorca z alternatywnymi. – DaoWen

13
case 1||2: 

Zostaje true. więc staje się case 1:, ale przekazana wartość wynosi 2. Tak więc domyślny przypadek został wykonany. Potem wykonasz swój printf("I thought somebody");.

+2

+1 za wyjaśnienie, dlaczego kod OPs nie zadziałał zgodnie z oczekiwaniami. –

+0

no tak, myślałem, że działa jak eithor 1 lub 2 case .. ale wygląda na to, że działa inaczej –

+0

szczęśliwy, że zrozumiałeś ... – Jeyaram

0

You switch o wartości 2, który pasuje default sprawę switch rachunku, więc wypisuje „cześć”, a następnie wydrukowana ostatnia linia „Myślałam, że ktoś”.

2
case 1||2: 

Wyniki w

case 1: 

ponieważ 1 || 2 ocenia się 1 (I pamiętaj, tylko stałe wyrażenia integralne są dozwolone w case wypowiedzi, więc nie można sprawdzić dla wielu wartości w jednej case).

chcesz użyć:

case 1: 
    // fallthrough 
case 2: 
+1

'1 || 2' jest stałą wartością. Kompilator w pewnym momencie zmniejszyłby tę wartość. Najprawdopodobniej w czasie parsowania. –

+0

@JeremyJStarcher: Nie chciałem powiedzieć, że nie było (i pokazałem, co jest zredukowane w moim pierwszym przykładzie), pomyślałem, że OP chce tego samego przypadku dla 1 i 2. Jednak, czytając to ponownie, Z pewnością sformułowałem to w sposób mylący. Naprawię to, dzięki. –

+0

NP. Wiem, że to lubię, gdy ludzie wzmacniają moje sformułowania. –

-1
case (1||2): 
    printf("hi"); 

Wystarczy umieścić wsporniki i zobaczyć magię.

W twoim kodzie, program po prostu sprawdza pierwszą wartość i idzie w dół. Od kiedy nie znajduje 2, przechodzi do domyślnego przypadku.

Ale gdy określisz, że oba terminy, tj. 1 i 2, są razem, przy użyciu nawiasów, działa tak, jak chciał.

+0

Wątpię, żeby to zadziałało. Który kompilator używasz? –

+0

Próbowałem go w gcc. To działa. –