Кіріспе

Компьютерлік бағдарламалаудағы түсінік. C және C++ тілдерінде реттілік нүктесі – компьютерлік бағдарламаның орындалуы кезіндегі кез келген нүкте, онда алдыңғы есептеулердің барлық жанама әсерлері аяқталғаны және келесі есептеулердің ешқандай жанама әсерлері орындалмағаны кепілдіріледі. Олар өрнектердің жарамдылығын және, егер жарамды болса, олардың мүмкін нәтижелерін анықтау үшін маңызды ұғым болып табылады. Кейде өрнектің анықталғанын қамтамасыз ету және есептеудің жалғыз дұрыс ретін кепілдеу үшін қосымша реттілік нүктелерін қосу қажет болады. C11 және C++11 стандарттарында реттілік нүктесі термині реттілеумен алмастырылды. Үш мүмкіндік бар:

Бір өрнектің есептелуі екінші өрнектің алдында реттіленіп, немесе керісінше, екінші өрнектің есептелуі біріншісінен кейін реттіленіп, тиімді түрде алмастырылатын жағдай. Өрнектердің есептелуі анықталмаған ретпен реттіленіп, яғни бірі екіншісінен бұрын реттіленеді, бірақ қайсысы екені белгіленбеген. Өрнектердің есептелуі ретсіз болады. Ретсіз есептеулердің орындалуы үстіне түсуі мүмкін, егер олар ортақ күйді пайдаланса, бұл қатаң түрде анықталмаған мінез-құлыққа әкелуі мүмкін. Мұндай жағдай параллель есептеулерде туындауы мүмкін, жарыс жағдайларын тудыруы мүмкін, бірақ анықталмаған мінез-құлық бір жіпті есептеулерде де кездесуі мүмкін. Мысалы, `a[i] = i++;` (мұнда `a` – массив, ал `i` – бүтін сан) анықталмаған мінез-құлыққа ие.

Екіжақтылықтың мысалдары

C және C++ тілдерінде + операторы тізбектелген нүктемен байланысты емес, сондықтан f + g өрнегінде f немесе g алдымен орындалуы мүмкін. Комма операторы тізбектелген нүктені енгізеді, сондықтан f , g кодында бағалау реті анықталған: ең алдымен f шақырылады, содан кейін g шақырылады. Тізбектелген нүктелер сондай-ақ бір өрнек ішінде бір айнымалы бірнеше рет өгертілген кезде де маңызды болады. Көбінесе мысалға келтірілетін C өрнегі – i=i++, ол i-ге оның бұрынғы мәнін тағайындайды және i-ді арттырады. i-дің соңғы мәні белгісіз, себебі бағалау ретіне байланысты арттыру тағайындаудан бұрын, кейін немесе оның арасында болуы мүмкін. Нақты бір тілдің анықтамасы мүмкін болатын мінез-құлықтың біреуін нақтылай алады немесе мінез-құлық анықталмаған деп жай ғана айта алады. C және C++ тілдерінде мұндай өрнекті бағалау анықталмаған мінез-құлыққа әкеледі. C# сияқты басқа тілдер тағайындау және арттыру операторларының басымдығын i=i++ өрнегінің нәтижесіне кепілдік беру үшін анықтайды.

C++03 дейін

C және C++ тілдерінде реттілік нүктелері келесі орындарда кездеседі. (C++-да, жүктемеленген операторлар функциялар сияқты әрекет етеді, сондықтан жүктемеленген операторлар функция шақырулары сияқты реттілік нүктелерін енгізеді.) && (логикалық ЖӘНЕ), || (логикалық ИЛИ) (қысқаша бағалаудың бөлігі ретінде) және үтір операторларының сол және оң жақ операндаларын бағалау арасында. Мысалы, өрнегінде, ішкі өрнектің барлық жанама әсерлері екенін анықтауға тырысудан бұрын аяқталады. Үштік шартты оператордың бірінші операндысы мен екінші немесе үшінші операндысын бағалау арасында. Мысалы, өрнегінде, бірінші кейін реттілік нүктесі бар, яғни екінші рет орындалғанға дейін ол арттырылады. Толық өрнектің соңында. Бұл санатқа өрнек операторлары (мысалы, тапсыру операторы ), қайтару операторлары, , , немесе операторларының басқару өрнектері және for операторындағы үш өрнектің әрқайсысы кіреді. Функцияға шақыру алдында. Аргументтерді бағалау реті көрсетілмеген, бірақ бұл реттілік нүктесі олардың барлық жанама әсерлері функцияға енуге дейін аяқталады дегенді білдіреді. өрнегінде, өзінің бастапқы мәнімен параметр ретінде шақырылады, бірақ функцияның денесіне ену алдында арттырылады, ал және сәйкесінше және операторларына ену алдында жаңартылады. Дегенмен, , операторларының орындалу реті және , арттырылу реті көрсетілмеген. Егер функциясы және айнымалыларына қол жеткізсе, ол екеуін де, ешқайсысын да немесе олардың біреуін ғана арттырылған күйде таба алады. (Функция шақыруы үтір операторын пайдаланбайды; , және үшін бағалау реті белгісіз.) Функциядан қайтару кезінде, қайтарылатын мән шақыру контексіне көшірілгеннен кейін. (Бұл реттілік нүктесі тек C++ стандартында ғана көрсетілген; ол C-де тек жанама түрде кездеседі.) Бастамалаушының соңында; мысалы, жариялаудағы өрнегінің бағалануынан кейін. Әр жариялау тізбегіндегі әр жариялаушы арасында; мысалы, өрнегіндегі екі бағалау арасында (Бұл үтір операторының мысалы емес.) Кіріс/шығыс формат спецификаторымен байланысты әр түрлендіруден кейін. Мысалы, өрнегінде, бағаланғаннан кейін және басып шығару алдында реттілік нүктесі бар.

C11 және C++11

Ішінара, жіптерге тілдік қолдаудың енгізілуіне байланысты, C11 және C++11 бағалау реті үшін жаңа терминология енгізді. Бір операция екіншісінен бұрын "реттеле" алады, немесе екеуі де "белгісіз" реттеледі (біреуі екіншісі аяқталғаннан кейін ғана басталуы керек), немесе "реттелмеген" (әрбір өрнектегі операциялар бір-бірімен араласуы мүмкін).