Кіріспе

Компьютерлік бағдарламалаудағы шартты оператор

Компьютерлік бағдарламалауда үштік шартты оператор – бірнеше бағдарламалау тілдеріндегі негізгі шартты өрнектердің синтаксисінің бөлігі болып табылатын үштік оператор. Оны әдетте шартты оператор, үштік if немесе желілік if (қысқартылған iif) деп атайды. Егер `a` мәні рас болса, өрнек `b` мәнін береді, әйтпесе `c` мәнін береді. Бұл форма ең көп таралған, бірақ басқа синтаксистер де бар; мысалы, Raku infix операторларымен шатасуды болдырмау үшін `a ? b : c` синтаксисін пайдаланады, ал Visual Basic NET-те ол `If(a, b, c)` түрінде келеді. Бұл оператор бастапқыда CPL тілінен шыққан, онда `e1 ? e2 : e3` үшін баламалы синтаксис `e1 → e2, e3` болды. Көптеген үштік операторлар мүмкін болғанымен, шартты оператор өте кең таралған, ал басқа үштік операторлар сирек кездеседі, сондықтан шартты операторды көбінесе үштік оператор деп атайды.

Вариациялар

"The" үштік оператордың егжей-тегжейлі семантикасы, сондай-ақ оның синтаксисі тілден тілге айтарлықтай өзгереді. Бір тілден екінші тілге ең жоғары деңгейдегі айырмашылық – өрнектер жанама әсерлерге жол бере ме (көптеген процедуралық тілдердегідей) және тіл қысқа тұйықталу бағалау семантикасын қамтамасыз ете ме, яғни тек таңдалған өрнек бағаланады (көптеген тілдердегі стандартты операторлар барлық аргументтерді бағалайды). Егер тіл жанама әсерлері бар өрнектерді қолдайтын болса, бірақ қысқа тұйықталу бағалауын нақтыламаса, онда тілде қай өрнек бірінші бағаланатыны туралы қосымша айырмашылық туындайды – егер тіл кез келген нақты тәртіпке кепілдік берсе (шарттылық та өрнек саналатынын ескеріңіз). Сонымен қатар, егер тәртіпке кепілдік берілмесе, нәтиже белгісіз (көздердің бірінен алынған мән) немесе анықталмаған (жанама әсерлер кезінде компилятордың қалауынша кез келген мән, тіпті қателікке әкелуі мүмкін) деп жіктелетіндігі туралы да айырмашылық бар. Егер тіл өрнектерде жанама әсерлерге жол бермесе (функционалдық тілдерде жиі кездеседі), онда бағалау тәртібінің мәндік семантикасы жоқ, бірақ ол шексіз рекурсияның аяқталуына немесе өнімділікке әсер етуі мүмкін (функционалдық тілде, сәйкес өрнектерімен қысқа тұйықталу бағалауы қалыпты, үштік оператордың табиғи қолданылуы сирек кездеседі, сондықтан бұл мәселе шектеулі). Осы себептерге байланысты, кейбір тілдерде оператор түрі блоктық шарттық түрінен сәл өзгеше семантикаға ие болуы мүмкін (C тілінде – берілген мысалдың синтаксисі – бұл шын мәнінде эквивалентті). Ұялы үштік операторлардың ассоциативтілігі де тілден тілге өзгеше болуы мүмкін. Көптеген тілдерде үштік оператор оңға қарай ассоциативті, сондықтан ол интуитивті түрде , деп бағаланады, бірақ PHP әсіресе солға қарай ассоциативті және келесідей бағаланады: , бұл бағдарламашылардың күткенінен мүлдем басқа. (Бұл мысалдар үштік оператордың төмен оператор басымдылығына ие екенін болжайды, бұл барлық C отбасы тілдерінде және көптеген басқа тілдерде де дұрыс.)

Картамен теңдестігі

Үштік операторды екілік карта операциясы ретінде де қарастыруға болады. R және басқа да тілдерде, тура өрнектегі жұптарды қолданатындарда, үштік операторды R өрнегі сияқты нәрсе арқылы модельдеуге болады (бұл тәсіл 0-ден басталатын индекс қолданатын тілдерде көбірек табиғи). Ішкі үштік операторларды жағдай векторындағы алғашқы `true` мәнінің индексін қайтаратын функция арқылы модельдеуге болады. Екі картаға сәйкес келетін оператордың екеуі де екілік операторлар екенін ескеріңіз, бұл үштік оператордың семантикалық емес, синтаксистік тұрғыдан үштік екенін көрсетеді. Бұл құрылымдарды деректерді біріктіруге негізделген, функциялардың құрамына емес, керридің әлсіз түрі ретінде қарастыруға болады. Егер тіл болашақтар немесе уәделер механизмін ұсынса, онда қысқаша бағалау кейде екілік карта операциясының аясында да модельделуі мүмкін.

Жүре беріңіз

Go-да үштік оператор жоқ, сондықтан толық if операторын қолдану міндетті.

Джулия

Джулияда "Ескеріңіз, және операторларының айналасындағы бос орындар міндетті: мысалы, өрнегі жарамды үштік өрнек болып табылмайды (бірақ екеуінен кейін де жаңа жолға өтуге болады және)."

JavaScript-ті қолдану

Жазбаша шартты оператор JavaScript-та C++ және Java-дағыдай, бірақ ортаңғы өрнек үтірлі өрнек болмайды. Сондай-ақ, C++-тағы сияқты, бірақ C немесе Perl-ден өзгеше, ол оң жақтағы тапсырмадан жоғары басымдыққа ие болмайды – мысалы, `var timeout = settings === null ? 1000 : settings.timeout;` орнына. C# және Java-дағы сияқты, өрнек тек берілген шартқа сай келген жағдайда ғана бағаланады; екінші өрнек бағаланбайды.