Reittipiste

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 9. marraskuuta 2016 tarkistetusta versiosta . tarkastukset vaativat 7 muokkausta .

Jaksopiste - ohjelmoinnissa mikä tahansa  ohjelman piste , jossa on taattu, että kaikki aikaisempien laskelmien sivuvaikutukset ovat jo ilmenneet ja seuraavien sivuvaikutukset puuttuvat edelleen.

Sekvenssipisteet mainitaan usein puhuttaessa C- ja C++-kielistä . Näillä kielillä on mahdollista kirjoittaa lauseke, jonka osalausekkeiden arviointijärjestystä ei ole määritelty standardeissa ja joka vaikuttaa tulokseen. Lisäämällä yhden tai useamman sekvenssipisteen voit taata arvioinnin järjestyksen joissakin tapauksissa.

On syytä huomata, että lähestymistapa sekvenssipisteisiin perustuvien lausekkeiden arviointiprosessin virtaviivaistamiseen vastasi aluksi melko hyvin C-kielen tarpeita, mutta ei ollut riittävä C ++ -kielelle, jossa lvvalu- tuloksia palauttavien operaattorien joukko oli laajentunut merkittävästi. Ja kun ilmaantui kielituen tarve monisäikeiseen C- ja C++-kieliin, järjestyspisteisiin perustuva järjestys jouduttiin luopumaan kokonaan. Nykyaikaiset C- ja C++-kielispesifikaatiot kuvaavat lausekkeiden arviointiprosessin järjestystä suhteiden kautta, järjestykseen ennen ( sekvenssi ennen ) ja järjestyksen jälkeen ( sekvenssit jälkeen ). C++11 -standardista lähtien sekvenssipisteen käsitettä ei enää ole C++-kielessä . C :ssä sekvenssipisteen käsite on säilynyt tähän päivään asti, mutta C11 -standardista lähtien , ei peruskäsitteenä, vaan vain yhdistelmänä ennen ja jälkeen järjestetyistä suhteista .

C++11 - standardi sekä myöhemmät C++14- ja C++17-standardit toivat C++-kielen operaattoreille suuren määrän lisätilauksia uuteen malliin perustuen, mikä johti siihen, että monet lausekkeet, joiden käyttäytyminen oli määrittelemätön C++98 :ssa , sai hyvin määritellyn käyttäytymisen nykyaikaisessa C++:ssa. Nykyään C++-kielen lausekkeiden arviointiprosessin tiukuus ylittää huomattavasti C-kielen.

Esimerkkejä C:n ja C++:n epäselvyydestä

Jos on epäselvyyksiä, C- ja C++-kielistandardit:

  1. osoita useita hyväksyttäviä käyttäytymismalleja mahdollisten joukosta (katso määrittelemätön käyttäytyminen );
  2. ilmoittaa ainoa hyväksyttävä käyttäytyminen mahdollisista tai
  3. osoittavat nimenomaisesti, että käyttäytyminen on määrittelemätöntä (katso määrittelemätön käyttäytyminen ).

Esimerkki 1: Määrittelemätön toiminta.

g () + f ()

Operaattori " " ei ole sekvenssipiste, joten ei tiedetä, mikä funktioista kutsutaan ensin: tai . Käyttäytyminen riippuu kääntäjän toteutuksesta . +f()g()

Esimerkki 2: Ainoa hyväksyttävä toimintatapa.

f (), g ()

" "-operaattori on sekvenssipiste, joten arvioinnin järjestys on standardin takaama ja etukäteen tiedossa (vasemmalta oikealle): ,

  • vasen operandi arvioidaan ensin: funktiota kutsutaan ;f()
  • sitten oikea: funktiota kutsutaan .g()

Esimerkki 3: Määrittelemätön toiminta.

i = i ++

C-kielen näkökulmasta määritetty lauseke sisältää useita muunnelmia muuttujasta , joita ei ole järjestetty suhteessa toisiinsa. Tämän ilmaisun käyttäytyminen on määrittelemätön. (Samaan aikaan nykyaikaisen C++-kielen näkökulmasta, joka virtaviivaistaa tehtäväoperaattorin arviointiprosessia paljon tiukemmin, tämän lausekkeen käyttäytyminen on täysin määritelty.) i

Sekvenssipisteet C:ssä ja C++:ssa

Seuraavat sekvenssipisteet määriteltiin alkuperäisissä C- ja C++-kielistandardeissa:

  • sekvenssipisteet operaattoreille " && ", " || " ja " , ". Nämä käyttäjät taatusti arvioidaan vasemmalta oikealle, ellei niitä ole ylikuormitettu. Esimerkki. Lausekkeessa " " vasen operandi (" ") arvioidaan ensin; tulos valetaan tyypin mukaan ja sitä verrataan ; jos yhtä suuri kuin , oikea operandi (" ") arvioidaan, muuten ;*p++ != 0 && *q++ != 0*p++ != 0booltruetrue*q++ != 0false
  • sekvenssipiste kolmiosaiselle operaattorille " ?: ". 1. operandi arvioidaan ensin; niin seuraava piste sijaitsee; Toinen operandi arvioidaan vain, jos 1. operandi on yhtä suuri kuin ; Kolmas operandi arvioidaan vain, jos 1. operandi on . Esimerkki. Lausekkeessa " ", ensimmäinen operandi suoritetaan ensin (" "; muuttujaa kasvatetaan ); laskennan tulos valetaan tyyppiin ja sitä verrataan ; jos yhtä suuri , suoritetaan 2. operandi (" "), muussa tapauksessa 3. (" 0 ");truefalsea == (*p++) ? (*p++) : 0*p++p1booltruetrue(*p++)
  • sekvenssipisteet lausekkeissa:
    • symbolin " " tilalle lausekkeissa, jotka ovat erillisiä ohjeita. Esimerkiksi lausekkeessa " " sekvenssipiste lisätään " " sijaan;;a = b;;
    • avainsanan jälkeen kirjoitetun lausekkeen lopussa ; tarkemmin sanottuna sillä hetkellä, kun paluuarvo kopioidaan kutsuvan funktion kontekstiin. Tämä sekvenssikohta on kuvattu eksplisiittisesti vain C++-standardissa;return
    • suluissa avainsanojen , , jälkeen kirjoitettujen lausekkeiden lopussa (mukaan lukien konstruktiot );ifswitchwhilewhiledo-while
    • jokaisen silmukan kolmen lausekkeen lopussa ;for
  • ennen funktion kutsumista. Järjestystä, jossa funktion argumentit arvioidaan, ei ole määritetty. Sekvenssipiste varmistaa, että kaikki argumentit arvioidaan ennen funktion kutsumista. Esimerkki. Harkitse ilmaisua " ". Ensin luodaan väliaikainen muuttuja, jonka arvo on yhtä suuri kuin muuttujan arvo ; sitten "postfix ++" -operaattori kutsutaan muuttujalle (ei väliaikaiselle); lopuksi funktiota kutsutaan  väliaikaisella muuttujalla argumenttina. Yllä oleva koskee muuttujia ja funktioita , vastaavasti. Samaan aikaan "+"-operaattorin sekvenssipisteen puuttumisen vuoksi funktioiden ja kutsumisjärjestystä ei ole määritelty. Siksi "postfix ++" -operaattoreiden kutsumisjärjestystä muuttujille , ja ei ole määritelty . Eli kun toiminto suoritetaan, ei tiedetä, kutsuttiinko "postfix ++" -operaattoreita muuttujille ja . Esimerkki. Harkitse ilmaisua " ". Pilkku funktion argumenttien välillä ei ole "pilkku"-operaattori, eikä se takaa järjestystä, jossa argumentin arvot arvioidaan. Järjestys, jossa funktion argumenttien arvot arvioidaan, ei ole standardoitu ja riippuu kääntäjän toteutuksesta;f( i++ ) + g( j++ ) + h( k++ )iif()jkg()h()f()g()h()ijkf()jkf( a, b, c )
  • ilmoituksessa, jossa on alustus alustusarvon laskennan päättyessä. Esimerkki. Harkitse ilmaisua " ". Sekvenssipiste lisätään sen jälkeen, kun lauseke " " on arvioitu;int a = ( 1 + i++ );( 1 + i++ )
  • ennen kuin soitat ylikuormitetulle operaattorille C++:ssa. Sekvenssipiste varmistaa, että operaattorin argumenttien arvot (kuten tavallinen funktio) arvioidaan ennen sen kutsumista.

Katso myös

Linkit

Muistiinpanot