Operator ternar

De la Wikipedia, enciclopedia liberă

În calcul, un operator ternar (uneori incorect numit un operator terțiar) este un operator care are trei operanzi. Acest operator ternar poate transmite mai multe linii de cod la o singură linie în limbajele care o pot folosi, cum ar fi JavaScript, C # sau Java. Argumentele și rezultatul pot fi de diferite tipuri. Inițial vine de la BCPL, a cărui sintaxă echivalentă pentru e1 ? e2: e3 a fost e1 -> e2, e3[1]. Limbajele derivate din BCPL au tendința de a apărea împreună cu acest operator.

Multe limbaje de programare care utilizează sintaxa limbajului C folosesc un operator ternar, ?:, care definește o afirmație condiționată. Deoarece acest operator este adesea singurul operator ternar în limbajul de programare, uneori se face referire pur și simplu la "operatorul ternar".

Majoritatea limbajelor de programare care sunt subliniate în programarea funcțională nu au nevoie de un astfel de operator, deoarece expresia lor regulată condiționată este o expresie în primul rând, de exemplu, sistemul de expresie (dacă (a> b) ab) este echivalent în semantica expresiei C (a> b)? a: b.

Acest lucru este valabil și în multe limbaje imperative, începând cu ALGOL, unde ar fi posibil să se scrie resultado := if a > b then a else b, de asemenea, Smalltalk (resultado := (a > b) ifTrue: [ a ] ifFalse: [ b ]) sau Ruby (resultado = if a > b: a else b end).

Alocare condiționată[modificare | modificare sursă]

Sintaxa operatorului ternar (?:) este folosită după cum urmează:[2]

expresión boleana ? valor si cierto : valor si falso

Condiția este evaluată adevărată sau falsă ca expresie booleană. Pe baza evaluării stării booleene, întreaga expresie returnează valoarea dacă este adevărată dacă condiția este adevărată, dar valoarea dacă este altfel falsă. În general, cele două subexemplează valoarea dacă este adevărată și valoarea dacă false trebuie să aibă același tip, care determină tipul întregii expresii. Importanța acestui tip de control se găsește în cea mai uzuală utilizare a operatorului - în declarațiile de atribuire condiționată. În această utilizare apare ca o expresie în partea dreaptă a unei instrucțiuni de atribuire, după cum urmează:

variable = condición ? valor si cierto : valor si falso

Operatorul ?: Este similar cu modul în care expresiile condiționale (if-then-else) lucrează în limbaj de programare funcțională, cum ar fi Scheme, ML și Haskell, deoarece if-then-else formează o expresie în loc de o declarație în acele limbi.

Utilizare[modificare | modificare sursă]

Cea mai obișnuită utilizare a acestui operator ternar este de a face o scurtă propoziție condiționată. De exemplu, dacă vrem să dezvoltăm codul în C pentru a schimba ora de deschidere a unui magazin la ora 12:00 în weekenduri și ora 9 în zilele lucrătoare, putem folosi:

int tiempo_de_apertura = (día == FIN_DE_SEMANA) ? 12 : 9;

în loc de codul mai detaliat

int tiempo_de_apertura;

if (día == FIN_DE_SEMANA)
    tiempo_de_apertura = 12;
else
    tiempo_de_apertura = 9;

Cele două forme sunt aproape echivalente. Rețineți că ?: este o expresie și if-then-else o declarație. De asemenea, trebuie să se țină cont de faptul că nici valoarea dacă este adevărată, nici valoarea dacă este falsă poate fi omisă din operatorul ternar, ceea ce ar duce la o eroare a compilatorului.

C++[modificare | modificare sursă]

În C++, există situații în care utilizarea alocării condiționate a if-else nu este posibilă, deoarece acest limbaj distinge în mod explicit între inițializare și alocare. Într-un astfel de caz, este întotdeauna posibil să utilizați un apel la funcție, dar acest lucru poate fi inconfortabil. De exemplu, dacă doriți să transmiteți valori cu condiții diferite ca argument pentru un constructor al unui câmp sau al unei clase de bază, nu este posibil să folosiți un simplu if-else, în acest caz putem folosi o expresie de atribuire condiționată sau un apel către funcție. Acesta din urmă este valabil pentru tipurile de referință, de exemplu:

#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    string name;
    ofstream fout;
    if (argc > 1 && argv[1])
    {
        name = argv[1];
        fout.open(name.c_str(), ios::out | ios::app);
    }
 
    ostream &sout = name.empty() ? cout : fout;
}

În acest caz, nu există nici o posibilitate de înlocuire a utilizării operatorului: cu un altul. (Deși aveți posibilitatea să înlocuiți utilizarea ?: Cu un apel la funcție, în cadrul căruia poate fi uun if-else.) În plus, operatorul ternar poate da un Ivalue, adică o valoare la care se poate da o altă valoare. Luați în considerare următorul exemplu:

  #include <iostream>
   int main () {
   int a=0, b=0;
 
   const bool cond = ...;
   (cond ? a : b) = 1;
   std::cout << "a=" << a << ','
             << "b=" << b << '\n';
  }

C#[modificare | modificare sursă]

Exemplul[modificare | modificare sursă]

class Ejemplo
{
   static void Main()
    {
 var a = 0;
            var b = 1;
            var r = a == b ? "Es igual" : "No es igual";
 Console.WriteLine(r);

    }
}
/*
Resultado:
No es igual
*/

CFML (Railo)[modificare | modificare sursă]

Exemplul 1[modificare | modificare sursă]

<cfscript>
arg = "T";
vehicle = ( ( arg == 'B' ) ? 'bus' : 
            ( arg == 'A' ) ? 'airplane' : 
            ( arg == 'T' ) ? 'train' : 
            ( arg == 'C' ) ? 'car' : 
            ( arg == 'H' ) ? 'horse' : 
                             'feet' );
</cfscript>
<cfoutput>#vehicle#</cfoutput>

Exemplul 2[modificare | modificare sursă]

<cfscript>
price = ( product.hasPrice() ) ? product.getPrice() : "-";
writeOutput( "Precio del producto: " & price );
</cfscript>

Java, JSP[modificare | modificare sursă]

În Java, operatorul ternar este numit și operatorul condițional și utilizează aceeași sintaxă ca celelalte limbi bazate pe limbajul C. De exemplu, pentru a verifica dacă o persoană este de vârstă legală, am folosi următoarele:

   boolean mayor_de_edad = edad >= 18 ? true: false;

Acesta va înlocui următorul cod detaliat:

 boolean mayor_de_edad;
 if(edad >= 18){
    mayor_de_edad = true;
 }else{
    mayor_de_edad = false;
 }

Pentru a utiliza operatorul ternar în paginile JavaServer, puteți încorpora codul Java utilizând scriptleturi. Acest mod nu este recomandat, dar este sugerat de folosit bibliotecile JSTL pentru a obține un cod mai curat și mai structurat. De exemplu, pentru a comuta culoarea rândurilor într-o table HTMLfolosind CSS, am putea folosi următoarele:

  <c:forEach list="${requestScope.miLista}" varStatus="contador"> 
      <tr class="${contador % 0 ? 'even' : 'odd'}">
         <td>Hola Mundo!!!</td>
      </tr>
  </c:forEach>

Perl, PHP[modificare | modificare sursă]

Un constructor if-else din Perl sau PHP va fi scris astfel:

if ($a > $b) {
    $result = $a;
} else {
    $result = $b;
}

Rescris cu operatorul ternar, ar arăta astfel:

$result = ($a > $b) ? $a : $b;

De la versiunea 5.3, PHP suportă o sintaxă a operatorului ternar. În această formă, condiția este returnată dacă condiția nu este evaluată ca fiind falsă:

 $variable = condicion ?: if false

Python[modificare | modificare sursă]

Un operator ternar pentru Python a fost aprobat ca propunere de îmbunătățire Python 308 și a fost adăugat la versiunea 2.5 în septembrie 2006. Operatorul ternar Python diferă de comună ?: în ordinea operanzilor săi. Forma generală este:

valor_si_cierto if condición else valor_si_falso

Visual Basic .NET[modificare | modificare sursă]

Chiar dacă .NET nu utilizează operanzi ?: Puteți utiliza o implementare foarte asemănătoare cu instrucțiunea if ... else.

Dim tiempo_de_apertura As Integer = IIf((dia = FIN_DE_SEMANA), 12, 9)
 
'sintaxis general es IIf(condicion, valor_si_cierto, valor_si_falso)

În exemplul anterior, IIF este o funcție și nu un operator ternar real. Ca o funcție, valorile celor trei părți sunt evaluate înainte ca apelul funcției să apară. Această limitare a impus și în Visual Basic. NET 9.0, lansat ca Visual Studio 2008, la care a fost introdus un operator ternar real utilizând cheia IF în loc de IIF. Aceasta permite funcționarea următorului cod:

Dim nombre As String = If(persona Is Nothing, "", persona.Nombre)

Note[modificare | modificare sursă]

  1. ^ „BCPL Ternary operator (page 15)” (PDF). BCPL Reference Manual. Arhivat din original (PDF) la . Accesat în . 
  2. ^ „Ternary Operators”. Arhivat din original la . Accesat în .