Nie jestem pewien co do gwarancji wykonania dla potrójnego operatora C/C++.
Na przykład jeśli mam podany adres i wartość logiczną, która mówi, jeśli adres jest dobre do czytania można łatwo uniknąć źle odczytuje za pomocą if/else:Warunki wykonywania potrójnego operatora C++
int foo(const bool addressGood, const int* ptr) {
if (addressGood) { return ptr[0]; }
else { return 0; }
}
Czy operator trójskładnikowych (?:
) Gwarancja jednak, że ptr
nie będzie dostępny, chyba że addressGood
jest prawdziwy?
A może optymalizujący kompilator generuje kod, który uzyskuje dostęp do ptr
w każdym przypadku (prawdopodobnie powodując awarię programu), przechowuje wartość w rejestrze pośrednim i używa warunkowego przypisania do wdrożenia operatora trójskładnikowego?
int foo(const bool addressGood, const int* ptr) {
// Not sure about ptr access conditions here.
return (addressGood) ? ptr[0] : 0;
}
Dzięki.
AFAIK, tak, nie powinien oceniać drugiego oddziału. – chris
Styl projektu: API naprawdę nie powinno mieć "addressGood". Kanoniczna reprezentacja złego adresu to "0". To znaczy. 'int foo (const const int * ptr) {return ptr? * ptr: 0; } ' – MSalters
Nie wiem, czy' const const int * 'naprawdę ma sens. – rsp1984