Määrittelemätön käyttäytyminen ( eng. unspecified behavior ) ja toteutuksen määrittelemä käyttäytyminen ( eng. implementation-defined behavior ) - tietokoneohjelman käyttäytyminen , joka voi vaihdella eri alustoilla ja kääntäjillä, koska ohjelmointikielen määrittely tarjoaa useita päteviä vaihtoehtoja tietty kielirakenne. Toisin kuin määrittelemätön käyttäytyminen , määrittelemättömän toiminnan omaavaa ohjelmaa ei pidetä virheellisenä kielimäärittelyn noudattamisen kannalta; määrittämättömällä käytöksellä spesifikaatio yleensä rajoittaa mahdollisia käyttäytymismalleja, vaikka se ei vähennä niitä yhteen hyväksyttävään.
Ero näiden kahden välillä on, että toiminta on toteutuksen määrittelemää, dokumentoitua ja johdonmukaista tietyssä prosessorissa, ympäristössä, järjestelmäversiossa jne. hätätilassa.
Ohjelmoijan tulee välttää määrittelemätöntä käyttäytymistä paikoissa, joissa se on kriittistä ohjelman tuloksen kannalta - esimerkiksi jos kahta funktiota kutsutaan määrittelemättömässä järjestyksessä ja ne jakavat virheenkorjauskoodin, tämä näkyy virheenkorjauslokissa , mutta se ei välttämättä olla kriittinen tuloksen kannalta. Yhdelle alustalle kirjoittava ohjelmoija voi kiintyä omaan toteutukseensa. Ja jos hän kirjoittaa cross-platform-ohjelman, hänen on otettava huomioon kaikki toteutuksen määrittelemät kohtuulliset käyttäytymistapaukset.
Kielistandardin C99 mukaan
määrittelemätön käyttäytyminen, jossa jokainen toteutus dokumentoi, kuinka valinta tehdään
[…]
3.4.3 määrittelemätön käyttäytyminen
määrittelemättömän arvon käyttö tai muu käyttäytyminen, jossa tämä kansainvälinen standardi tarjoaa kaksi tai useampia mahdollisuutta eikä aseta muita vaatimuksia, joille valitaan missään tapauksessa — ISO/IEC 9899:201x [1]C++- kielistandardin mukaan
käyttäytyminen, hyvin muodostetulle ohjelmarakenteelle ja oikealle datalle, joka riippuu toteutuksesta ja joka jokaisen toteutuksen tulee dokumentoida.
[…]
1.3.13 määrittelemätön käyttäytyminen
käyttäytyminen, hyvin muodostetulle ohjelmakonstruktille ja oikealle datalle, joka riippuu toteutuksesta. Toteutusta ei vaadita dokumentoimaan, mikä käyttäytyminen tapahtuu. [Huomaa: tavallisesti mahdollisten käyttäytymismallien alue rajataan tässä kansainvälisessä standardissa. ]
— ISO/IEC 14882:2003(E)C:ssä ja C++:ssa (toisin kuin Java-kielessä ) funktioparametrien arviointijärjestys on määrittelemätön; siksi alla olevassa ohjelmassa järjestys, jossa merkkijonot "F" ja "G" tulostetaan, riippuu kääntäjästä.
#include <iostream> int f () { std :: cout << "F" << std :: endl ; paluu 3 ; } intg ( ) { std :: cout << "G" << std :: endl ; paluu 4 ; } int h ( int i , int j ) { paluu i + j ; } int main () { palauttaa h ( f (), g ()); }Klassinen esimerkki toteutuksen määrittämästä käyttäytymisestä (määrittelemätön käyttäytyminen, joka toteutusten on dokumentoitava) on tietotyyppien koko; esimerkiksi pitkä eri kääntäjissä ja käyttöjärjestelmissä voi olla 32 tai 64 bittiä pitkä. Ohjelma, joka olettaa, että yksi pitkä sopii aina osoittimeen , ei toimi oikein joillakin alustoilla (esimerkiksi Windows x64 ) [2] .
Tässä on kaksi nopean käänteisen neliöjuuren toteutusta : Carmack - Abrash -toteutus ( Quake III ) ja C++20 -toteutus englanninkielisestä Wikipediasta:
float Q_rsqrt ( float number ) { pitkä i ; kellua x2 , y ; const float three halfs = 1.5F ; x2 = luku * 0,5F ; y = numero ; i = * ( pitkä * ) & y ; // paha liukulukubittitason hakkerointi i = 0x5f3759df - ( i >> 1 ); // mitä vittua? y = * ( float * ) & i ; y = y * ( kolmipuolikkaat - ( x2 * y * y ) ); // 1. iteraatio // y = y * (kolme puoliskoa - ( x2 * y * y ) ); // 2. iteraatio, tämä voidaan poistaa paluu y ; } constexpr float Q_rsqrt ( float number ) eipaitsi { static_assert ( std :: numeeriset_rajoitukset < float >:: is_iec559 ); float const y = std :: bit_cast < float > ( 0x5f3759df - ( std :: bit_cast < std :: uint32_t > ( numero ) >> 1 )); paluu y * ( 1.5f - ( numero * 0.5f * y * y )); }Ensimmäinen on tehty Windowsille ja 32-bittiselle Linuxille, toinen on universaalimpi: se antaa käännösvirheen, jos koneessa on epätyypillisiä murtolukutyyppejä; ei vaadi kauan olla 32-bittinen.