C-ben switch-en belül case-nél lehet logikai operátorokat használni?
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?
Csak ilyet lehet:
switch(a){
case 1:
case 2:
/*1 vagy 2 az "a" értéke*/
break;
}
Nem. A case kulcsszó után konstans jön.
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
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.
#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 :)
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.
Így tudod megoldani:
switch(i) {
case 1:
case 2:
//do something
break;
default:
break;
}
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.
> 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 {
…
}
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!