Qualche lingua ha mai supportato un obiettivo di assegnazione condizionale? [chiuso]

2

Non ho mai visto un linguaggio di programmazione con obiettivi di assegnazione condizionale, ad esempio:

// If (x == y), then var1 will be set to 1, else var2 will be set to 1
((x == y) ? var1 : var2) = 1

L'obiettivo del compito è determinato in modo condizionale in fase di esecuzione, in questo caso in base al fatto che x == y.

Sembra che potrebbe essere una comoda sintassi.

Qualcuno conosce un linguaggio di programmazione che supporti questo?

O esiste un motivo teorico per cui non può essere fatto in modo efficace?

    
posta Brendan Hill 11.12.2015 - 12:17
fonte

2 risposte

6

Questa non è una domanda teorica, ma pratica.

C ++ supporta ciò che stai chiedendo:

[C++14: 5.16/4]: If the second and third operands are glvalues of the same value category and have the same type, the result is of that type and value category [..]

Ad esempio:

#include <iostream>

int x = 3, y = 4;

void foo(const bool b)
{
    (b ? x : y) = 6;
}

int main()
{
    std::cout << x << ' ' << y << '\n';   // 3 4
    foo(true);
    std::cout << x << ' ' << y << '\n';   // 6 4
    foo(false);
    std::cout << x << ' ' << y << '\n';   // 6 6
}

( demo live )

(Questo è fondamentalmente uguale a *ptr = val , poiché il dereferenziamento produce un lvalue.)

Vale la pena notare che C non non lo supporta:

#include <stdio.h>
#include <stdbool.h>

int x = 3, y = 4;

void foo(const bool b)
{
    (b ? x : y) = 6;
}

int main()
{
    printf("%d %d\n", x, y);   // 3 4
    foo(true);
    printf("%d %d\n", x, y);   // 6 4
    foo(false);
    printf("%d %d\n", x, y);   // 6 6
}

// main.c: In function 'foo':
// main.c:8:17: error: lvalue required as left operand of assignment
//      (b ? x : y) = 6;
             ^

( demo live )

... anche se ti permetterà di simulare questa tecnica, applicando le mie prime osservazioni riguardo alle dereferenze del puntatore:

*(b ? &x : &y) = 6;
    
risposta data 11.12.2015 - 12:40
fonte
3

Puoi farlo in Perl. È lo stesso di C ++.

my $x = 0;
my $y = 0;

1==1 ? $x: $y = 1;

print "x: $x y: $y\n";

$x = 0;
$y = 0;

1==0 ? $x: $y = 1;

print "x: $x y: $y\n";

Nota: questo costrutto può spesso portare a confusione. Ad esempio, considera il seguente codice:

$condition ? $y = 0 : $x = 1;

La persona che scrive questa riga di codice probabilmente pensava che $y sarebbe stato impostato a 0 se $condition è true, ma in realtà ciò valuta a $y = 0 = 1 , che dà a $y un valore di 1.

    
risposta data 11.12.2015 - 12:40
fonte

Leggi altre domande sui tag