Diskuze: Použití inkrementů/dekrementů v C
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Prefix je pro zvýšení/zmenšení o jedna před vyhodnocením výrazu(přiřazení k a), zatímco sufix se vykoná až po vyhodnocení výrazu. Do teď jsem myslel, že to v Javě funguje stejně.
V Javě nejsem moc zběhlý, ale v PHP by to mělo fungovat promenna++ (ihned se zvýší o jedno, ale nikam se neukládá). V C se ukládá zpátky do původní proměnné, že?
Ano, inkrementace/dekrementace mění přímo tu proměnnou, přičemž prefix/sufix rozhoduje jestli se započítá do výrazu nebo ne. Jinak nějak nedokážu pochopit, k čemu je ta PHP verze inkrementace/dekrementace, proč rovnou nepoužít "a+1"?
Máš pravdu, teď jsem to zkoušel, toho jsem si nikdy nevšiml.
V čem je tedy výhoda? Proč existuje prefixní i sufixní inkrementant (dekrementant)?
V kratším zápisu. Takté to teoreticky může pomoci překladači vygenerovat lepší/rychlejší kód.
Na druhou stranu, divoké používání těchto zkrácenin může vést k znepřehlednění zdrojáku, takže je třeba být opatrný.
V čem je tedy výhoda? Proč existuje prefixní i sufixní inkrementant (dekrementant)?
Je to pozůstatek z dob dávno minulých.
Kód for(int i = 0; i < n; ++i) býval v C rychlejší než for(int i = 0; i
< n; i++)
Také samotný výraz ++a býval rychlejší než a++ díky ušetřené
instrukci.
Dneska se optimalizace o všechno postarají a doporučuje se podobným trikům
vyhýbat.
proč rovnou nepoužít "a+1"?
To je záležitostí hardwarovou. Když se podíváš na instrukce, tyto dvě operace jsou rozdílné.
;a++
INC [a]
Inkrementuje proměnnou a. Jeden příkaz, jeden takt procesoru. (doufám že to mám správně, v ASM moc zběhlý nejsem)
; a = a + 1
MOV eax,[a]
ADD eax,0x1
MOV [a],eax
Zde nejprve musíš proměnou nejprve načíst do registru, potom přičíst jedničku, a hodnotu zpět uložit. Dva příkaz MOV navíc, a myslím taky není na jeden tik (tedy je pomalejší jako INC).
Nicméně překladače by to měli zvládnout optimalizovat.
Jo, já vím. Já komentoval:
V Javě nejsem moc zběhlý, ale v PHP by to mělo fungovat promenna++ (ihned se zvýší o jedno, ale nikam se neukládá).
Zobrazeno 10 zpráv z 10.