C++ instrukcja SWITCH i operatory logiczne


(Kot w Półbutach) #1

Witam. Dlaczego instrukcja działa w tym przypadku

switch(wybór)    {        case 1||2:break;        case 4:break;    }[/code]





Ale jeśli dodam do drugiego case'a alternatywę 4||6. Wyświetla mi się błąd, że wartość 1 jest już w użyciu. "Co ma piernik do wiatraka"??


[code=php]switch(wybór)    {        case 1||2:break;        case 4||6:break;    }

ERROR: case value '1' already used

-- Dodane 11.08.2012 (So) 11:19 --

Widzę też, że żaden operator logiczny nie może być wstawiony, dla np. też wyświetla błąd.

(Michalo2882) #2

Taka konstrukcja nie jest przewidziana w standardzie C++. W związku z tym zachowanie kompilatora jest nieprzewidywalne. Poza tym wątpię, żeby nawet ten pierwszy przykład zadziałał (np. jak wybór = 2).

Poprawny składniowo kod wygląda tak:

switch(wybór)

    {

        case 1:

        case 2:

            break;

        case 4:

        case 6:

            break;

    }

A jaki sens miałoby wstawienie operatora && w to miejsce? Jeżeli x == (1 && 2)?


(Kot w Półbutach) #3

Racja, mój program się uruchamia, ale switch nie działa poprawnie. Twój kod za to jest dobry, dzięki.

‘1 && 2’ oczywiście nie ma sensu. To tylko eksperymenty.


(ludzik12345 ) #4

błąd panie michalo2882

poprostu dla kompilatora zduplikowałeś case.

1||2 oraz 2||4 zawsze jest prawdą i to zawsze ten sam warunek dla case …


(Kot w Półbutach) #5

Nie rozumiem, dla np. 5 każda z tych alternatyw będzie fałszywa.

Poza tym skąd masz: ‘1||2 oraz 2||4’, ja przecież nie zawarłem w kodzie dwóch ‘2’.


(ludzik12345 ) #6

nie ważne

michalo wprowadził CIe w błąd poprostu


(Kot w Półbutach) #7

Dalej nie wiem o co Ci chodzi… Ja jestem autorem tego tematu. A kod Michalo działa bardzo dobrze.


(ludzik12345 ) #8

poczytaj o C++ dokłądniej


(Kot w Półbutach) #9

Wytłumaczysz, dlaczego uważasz, że alternatywy 1 i 2 oraz 2 i 4 są zawsze prawdziwe…

Ja poczytam dokładniej o C++, a TY poczytaj więcej o gramatyce i składni j.polskiego, o stosowaniu wielkich liter na początku zdania, łączenia ‘nie’ z przymiotnikami “nieważne” zamiast “nie ważne”, o pisaniu “po prostu”, nie “poprostu” i wielu innych tego typu głupotach. A potem się “mądruj”.


(nnick) #10

Dlaczego są prawdziwe? Dla operacji logicznych C++ 0 to fałsz, każda inna wartość liczbowa to prawda, zatem prawda lub prawda <=> prawda


(ludzik12345 ) #11

poczytaj dokładnie , bo skoro zadajesz takie pytania to kompletnie nie wiesz o czym piszesz.


(Kot w Półbutach) #12

Ludziku, powiedziałem, że poczytam. I tobie też to doradzam j.w. … Wiem o czym piszę, piszę o tym, o czym chciałbym się dowiedzieć, bo uczę się C++ drugi tydzień. A prosiłem o wytłumaczenie tych alternatyw, bo np. w matematyce nie zawsze są one prawdziwe.

I, jeśli łaska, wyjaśnij, skąd u licha wziąłeś te liczby, nie zawarłem w kodzie dwóch ‘2’.


(Rolek0) #13

Przykładowy switch

switch(x)

{

	case 1: /* */; break;

	case 2: /* */; break;

	case 3: /* */; break;

	case 5 + 5: /* */; break;

	case 6 * 9 - 42: /* */; break;

	case 1||2: /* */; break;

	case 4||6: /* */; break;

}

odpowiada mniej więcej

if(x == 1)

	/* */;

else if(x == 2)

	/* */;

else if(x == 3)

	/* */;

else if(x == (5 + 5)) // (x == 10)

	/* */;

else if(x == (6 * 9 - 42)) // (x == 12)

	/* */;

else if(x == (1||2)) // (x == (true||true)) // (x == true) // (x == 1)

	/* */;

else if(x == (4||6)) // (x == (true||true)) // (x == true) // (x == 1)

	/* */;

Tak samo jak w matematyce w C++ alternatywa jest prawdziwa jeśli co najmniej jeden z argumentów jest prawdziwy, gdy oba są prawdziwe to również. Alternatywa jest fałszywa tylko gdy oba argumenty są fałszywe.

Przy konwersji wartości całkowitej na logiczną 0 to fałsz, wszystko inne różne od 0 to prawda. Zarowno 1, 2, 4 jak i 6 są różne od zera więc są prawdziwe. W odwrotną stronę fałsz daje 0 a prawda 1.

to i tak bez znaczenia bo i tak wyjdzie prawda, czyli 1 :stuck_out_tongue:

PS 2 a ‘2’ to drobna różnica :wink:


(Barry06) #14

To samo, tylko “łopatologicznie”:

W każdym case może być tylko jedna wartość - w twoim przypadku jest tam “1 || 2”, więc kompilator obliczy wartość wyrażenia. Najpierw zamieni liczby na wartości logiczne (0 - fałsz, wart. niezerowe - prawda), następnie alternatywa ( PRAWDA LUB PRAWDA). Rezultat - PRAWDA. zmienna wybór zapewne jest typu int więc wartość case jest również zamieniana na int (prawda na int to 1) i dlatego w obu case masz jeden, ale zapisane dwoma innymi wyrażeniami.

switch(wybór)

    {

        case 1:

        case 2: //tu kod dla 1 lub 2

            break;

        case 4:

        case 6: //a tu dla 4 lub 6

            break;

    }

W ten sposób osiągniesz zamierzony efekt, korzystając z pewnej sztuczki - po znalezieniu właściwej etykiety kod jest wykonywany linijka po linijce (także spod innych etykiet) aż do natrafienia na “break;”

switch(wybór)

    {

        case 1: //wykonywane jeśli wybór == 1

        case 2: //tu wybór == 1 lub wybór == 2

            break;

        case 4: //wybór == 4

        case 6: //a tu wybór == 4 lub wybór == 6

            break;

    }

Możesz jeszcze przestudiować przykłady podane przez kolegów powyżej, powinno to trochę wyjaśnić w kwestii instrukcji switch. Powodzenia w dalszej nauce.