2015-09-21 11 views
6

In C/C++, la seconda memoria diComportamento non definito o: Swift ha punti sequenza?

int i = 0; 
int j = i++ + i++ + ++i; 

invoca sia

  • comportamento specificato, perché l'ordine di valutazione degli operandi è specificata, e
  • comportamento indefinito , perché gli effetti collaterali sullo stesso oggetto i sono non correlati l'uno rispetto all'altro.

veda ad esempio

Ora, dato che la Swift è stato progettato come un linguaggio sicura, qual è la situazione corrispondente qui? Il risultato è

var i = 0 
let j = i++ + i++ + ++i 

ben definito? Si può concludere dal riferimento alla lingua nel libro Swift che j == 4?

+2

Questa è una buona domanda da porre, ma sfortunatamente ho la sensazione che la risposta sia "nessuno lo sa" ... – jtbandes

+0

@jtbandes: Grazie (ma qualcuno non è d'accordo :) - Probabilmente hai ragione. Ora ho pubblicato questo messaggio nel forum degli sviluppatori Apple, forse questo mi dà un feedback: https://forums.developer.apple.com/thread/20001. –

+1

Impressionante - Chris Lattner ha risposto. Speravo segretamente che la risposta fosse "da sinistra a destra" :) – jtbandes

risposta

5

La domanda è stato risposto dallo sviluppatore Apple e progettista Swift Chris Lattner in Apple Developer Forum https://forums.developer.apple.com/thread/20001#63783:

Sì, il risultato di tale espressione saranno sempre 4. Swift valuta le espressioni da sinistra a destra, non è indefinito o implementazione definito un comportamento simile C.

Chris ha anche aggiunto:

Detto questo, se si scrive il codice del genere, qualcuno che cerca di mantenerla non sarà probabilmente molto felice con te

Concordato! È stato pensato come un esempio estremo per dimostrare il problema.

+1

Un aggiornamento: per ora open source [Swift Evolution] 9https: //github.com/apple/swift-evolution/blob/master/proposals/0004- remove-pre-post-inc-decrement.md) process, '--' e' ++' devono essere rimossi dalle future versioni di Swift. – rickster

+0

@rickster: hai ragione, grazie per aver aggiunto le informazioni qui! - Ma anche senza questi operatori, il fatto che Swift valuti le espressioni da sinistra a destra rimane interessante (secondo me). –

Problemi correlati