Jak nazywa się taka konstrukcja: (warunek)?a:b

Jak nazywa się taka konstrukcja: (warunek)?a:b
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

M.in. C++ istnieje taka konstrukcja:
(warunek)?prawda:fałsz
I mam dwa pytania:
1.Czy ma to może jakąś swoją nazwę?
2.Czy istnieje może jakiś odpowiednik w Pascalu (poza if'em oczywiście :P)?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
M2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 123
0

Ten operator nazywa się operatorem wybodu

Endrju
  • Rejestracja: dni
  • Ostatnio: dni
0

I nie ma go w Pascalu.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Tutaj napisałem odpowiednik dla Delphi:

Kopiuj
Function iif(Condition, vTrue, vFalse: Variant; vNot: Boolean=False): Variant;
Begin
 Result := null;
 Case (VarType(Condition) and VarTypeMask) Of
  varSmallint, varInteger, varByte, varSingle, varCurrency, varLongWord, varWord, varInt64: if (Condition = 1) Then Result := vTrue Else Result := vFalse;
  varBoolean: if (Condition) Then Result := vTrue Else Result := vFalse;
  varString: if (LowerCase(Condition) = 'true') Then Result := vTrue Else Result := vFalse;
  else raise Exception.Create('iif unknown type');
 End;
 if (vNot) Then
  if (Result = vTrue) Then
   Result := vFalse Else
   Result := vTrue;
End;

Przykład działania:

Kopiuj
Function CzyParzysta(N: Integer): Boolean;
Begin
 Result := iif(n and 1, false, true);
End;
KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1652
1

Albo inna nazwa: operator trójargumentowy

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
0

Spotkałem też wyrażenie warunkowe ;]

iooi
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 573
0

Nie do końca jest to odpowiednik, bo w przypadku klasycznego operatora, operandy obliczane są leniwie, w zależności od spełnienia warunku:

Kopiuj
int x() {
    cout << 'x';
    return 1;
}

int y() {
    cout << 'y';
    return 2;
}

int main() {
    cout << (true ? x() : y()) << endl;
    cout << (false ? x() : y()) << endl;
}

Wynik:

Kopiuj
x1
y2
Kopiuj
function x: Integer;
begin
    write('x');
    result := 1;
end;

function y: Integer;
begin
    write('y');
    result := 2;
end;

begin
    writeln(iif(true, x, y));
    writeln(iif(false, x, y));
end.

Wynik:

Kopiuj
yx1
yx2
bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Znam język (Clipper), który nie ma operatora trójargumentowego, ale ma funkcję if z leniwą ewaluacją.

Kopiuj
x:=0
y:=if(x==0,3,5/x)
//y=3

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.