Sziasztok!
Van egy ilyen programsorom:
int i;
// bla-bla-bla
for (i = 0; i < steps; a[low+i] = temp[i++]);
Erre ezt üzeni a fordító:
warning: operation on ‘i’ may be undefined
Szerintetek, melyik műveletre gondol, és hogyan lehetne írni az utasítást, hogy ne kapjak ilyen figyelmeztetést. Egyáltalán érdemes ezzel foglalkozni?
- 1269 megtekintés
Hozzászólások
A kiertekelesi sorrend nem trivialis (a[low+i]=temp[i++] a gazos resz). Azaz mit csinaljon a fordito?
- elobb kiszamolja hogy a jobb oldali erteket hova tegye (kiertekeli a low+i-t), megvan a memoria hely a[] vmelyik eleme, majd utana kiertekeli a jobb oldalt
- elobb kiertekeli a jobb oldalt, fasza, majd utana kitalalja hogy az eredmenyt hova is kell tenni a memoriaban.
A ket megoldas mas eredmenyt ad, es erre a C szabvany nem mond semmit, hogy ekkor mi a teendo", marmint milyen sorrendben kell kiertekelni.
Szerk: a megoldas lehet: k=i++, a[low+i]=temp[k], pl. ha erre a sorrendre gondoltal :] ha nem, akkor
a[low+i]=temp[i], i++.
- A hozzászóláshoz be kell jelentkezni
http://c-faq.com/expr/evalorder2.html
a[low+i] = temp[i++] kétértelmű:
a[low+i] = temp;i++
ill.
old_i=i++;a[low+i] = temp[old_i]
A probléma az, hogy i++ azt jelenti, hogy i++ kiértékelődik i-nek, majd a következő szekvenciapont (;) előtt valamikor inkrementálódik. De még ez előtt használod is indexként i-t, így nem egyértelmű, hogy ez az inkrementálás előtt vagy után van. Az értékadás nem szekvenciapont.
Java-ban pl. ez nem lenne gond.
--
[i]The Net is indeed vast and infinite...
http://gablog.eu
- A hozzászóláshoz be kell jelentkezni
Mindkettőtök hozzászólását nagyon köszönöm. Igyekszem ezeket a kétértelmű kifejezéseket kerülni a jövőben.
Üdv: Pelz.
Egyébként ezt a verziót szerettem volna:
a[low+i]=temp[i], i++
- A hozzászóláshoz be kell jelentkezni
Ha nem akarod, hogy a kollegád a pokolba kívánjon a rossz karbantarthatóság miatt, akkor a jó hagyományos gyalog módszert javaslom
for(int i=0; i<steps; ++i) a[low+i] = temp[i];
Nem attól jó programozó valaki, ha kriptikusan fogalmaz, hanem ha világosan fogalmazva tudja előadni a jó ötleteit.
- A hozzászóláshoz be kell jelentkezni
Igazad van!
- A hozzászóláshoz be kell jelentkezni
Sok embernel elofordul, hogy gyors es kicsi kodot szeretne irni es az a teves kepzete tamad, ha kisebb a forrass, ill. tobb dolgot pasziroz egyetlen kifejezesbe akkor az ugy jobb lesz.
Tobbnyire tevednek.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni