Kezdőoldal » Számítástechnika » Programozás » C-ben switch-en belül case-nél...

C-ben switch-en belül case-nél lehet logikai operátorokat használni?

Figyelt kérdés

pl:


switch(i) {

case 1||2:

//do something

break;

default:

break;

}


tehát ha az i értéke 1 VAGY 2, akkor fusson le az adott case


lehet ilyet csinálni? vagy a case csak közvetlenül értékeket fogad el?



2014. febr. 23. 02:54
1 2
 1/15 uno20001 ***** válasza:

Csak ilyet lehet:


switch(a){

case 1:

case 2:

/*1 vagy 2 az "a" értéke*/

break;

}

2014. febr. 23. 11:01
Hasznos számodra ez a válasz?
 2/15 anonim ***** válasza:

Nem. A case kulcsszó után konstans jön.

[link]


De nyugodtan használj if-et.


Egyébként meg, ha azt írod, hogy


case 1: // itt i==1

case 2: // itt i==1 VAGY i==2, ha case 1-ből nem breakelsz ki

2014. febr. 23. 11:03
Hasznos számodra ez a válasz?
 3/15 iostream ***** válasza:
Ki kéne próbálni, de gyanítom, hogy akár fordulhat is, hiszen 1 || 2 értéke fordítási időben ismert: 1 (ha i valami egész típus, egyébként true). Csak nem azt csinálná, amire számítasz.
2014. febr. 23. 14:23
Hasznos számodra ez a válasz?
 4/15 anonim ***** válasza:

A logikád még nem elég programozós. A hétköznapi nyelvben mondunk olyanokat, hogy "egy vagy kettő", de a matematikában nem. Pl. az x=1 vagy x=2 eredményt (ami pl. az x^2-3x+2=0 megoldása) nem lehet úgy leírni, hogy "x=1 vagy 2".

A programozás pedig matematika.

Ha ezt a különbséget megérted, nem fogsz ilyeneket kérdezni, hanem mindig teljes állítások közé raksz logikai műveleteket.

2014. febr. 23. 16:23
Hasznos számodra ez a válasz?
 5/15 A kérdező kommentje:

#4:

akkor azt mondod hogy a progrmozásban nincs OR? nem egészen értelek

ha van egy változód, ami felvehet pl. 3 értéket, és azt szeretnéd hogy az első kettő esetében ugyanaz történjen, akkor te hogy oldanád meg? 1 vagy 2... másképp ezt logikailag nem lehet felírni


egyébként már rájöttem, valóban, ha egy case után nincs break, akkor átmegy a következőbe :)

2014. febr. 23. 22:05
 6/15 anonim ***** válasza:

Ilyesmit mondtam volna? Azt mondtam, hogy az OR nem számok, hanem _állítások_ között állhat, úgy, ahogy írtam a példában. A switchben meg úgy lehet használni, ahogy írták.



Egyébként számok között is állhat OR a programozásban, de annak egészen más jelentése van, mint amire te használni akarod. Bitenkénti vagynak hívják, és a C-ben egy | a jele.

2014. febr. 24. 07:07
Hasznos számodra ez a válasz?
 7/15 anonim ***** válasza:

Így tudod megoldani:


switch(i) {

case 1:

case 2:

//do something

break;

default:

break;

}

2014. febr. 24. 09:22
Hasznos számodra ez a válasz?
 8/15 anonim ***** válasza:

Az a helyzet hogy a C elég gépikód-barát nyelv, ezért tud nagyon optimális kódot fordítani. A switch valójában feltételes ugrásokat csinál, amihez a blokk elején csinál csak vizsgálatot. A case/default kulcsszavak helyére nem kerül valódi lefordított kód, azok csak ugrási címek, ahova a vizsgálat után ugrik. Szóval oda nem tehetsz futásidőben végrehajtandó kifejezést.


Pontosabban tehetsz, ha konstansokból áll, ahogy iostream is írta, de ott az értékeket logikai kifejezéseknek fogja értelmezni, és vagy 1-et vagy 0-t fog tenni a case után. Ez neked nem jó.


A fenti módszer (case-ek közvetlenül egymás után) is azért működik, mert ezek csak címek, sőt minden ilyen egymást követő case ugyanaz a cím lesz. Tehát ezen esetekben a switch vizsgálattól pontosan ugyanoda fog ugrani a végrehajtás.

2014. febr. 24. 11:00
Hasznos számodra ez a válasz?
 9/15 2xSü ***** válasza:

> akkor azt mondod hogy a progrmozásban nincs OR?


De van, viszont az kizárólag bool típusú – vagy implicit módon azzá konvertálható – kifejezések között használható.


Tehát annak nincs értelme, hogy x == 1 || 2, annak viszont van, hogy (x == 1) || (x == 2). A két kifejezés, amelyek között „vagy” kapcsolat van, önmagukban kiértékelhetőek, igazak vagy hamisak.


Kicsit hátralépve a C-től, úgy általánosságban:


A case 1||2 -nél az 1 || 2 -t önálló kifejezésként fogja kiértékelni a legtöbb programnyelv legtöbb fordítója. Mivel logikai művelet van közöttük, így az egész számokat logikai típusra fogja elsőnek konvertálni, ha tudja. Hogy megengedett-e, létezik-e ilyen implicit konverzió egész és logikai érték között, az programozási nyelvtől függ. Néhány nyelvben egészen egyszerűen a 1 || 2 hibás kifejezés. Néhány nyelvben meg a számokat magukat fogja logikai típussá konvertálni, általában úgy, hogy 0 esetén hamis, 1 esetén igaz lesz a kifejezés. (Tehát jelen esetben 1 || 2 = true || true = true.)


Hogyan is fog egy ilyen nyelvben lefordulni a kérdésben megadott forráskód? Így:


switch(i) {

case true:

break;

default:

break;

}


Látható, hogy itt sem az történik, amit szeretnél, még ha a fordító esetleg nem is jelez hibát.


A switch alapvetően akkor használható, ha egy változót, kifejezést értékek alapján akarunk elágaztatni. Komplexebb esetben if-ekkel oldható meg a dolog:


if ((i==1) || (i==2)) {

} else if (i<10) {

} else {

}

2014. febr. 24. 11:05
Hasznos számodra ez a válasz?
 10/15 anonim ***** válasza:
Hogy én mennyire utálom a switch-case-t. Mindig if-ezek. Valahogy az átláthatóbb olvasni is.
2014. febr. 27. 15:45
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!