Nome
expr - Valuta un'espressione
Sinossi
espr arg ? arg arg … ?
Concatena arg (aggiungendo spazi separatori tra di loro), valuta il risultato come espressione Tcl e restituisce il valore. Gli operatori consentiti nelle espressioni Tcl sono un sottoinsieme degli operatori consentiti nelle espressioni C e hanno lo stesso significato e la stessa precedenza degli operatori C corrispondenti. Le espressioni producono quasi sempre risultati numerici (valori interi o virgola mobile). Ad esempio, l'espressione
expr 8,2 + 6
valuta a 14.2. Le espressioni Tcl differiscono dalle espressioni C nel modo in cui vengono specificati gli operandi. Inoltre, le espressioni Tcl supportano operandi non numerici e confronti tra stringhe.
operandi
Un'espressione Tcl consiste in una combinazione di operandi, operatori e parentesi. È possibile utilizzare lo spazio bianco tra operandi e operatori e parentesi; viene ignorato dalle istruzioni dell'espressione. Dove possibile, gli operandi sono interpretati come valori interi. I valori interi possono essere specificati in decimale (nel caso normale), in ottale (se il primo carattere dell'operando è0), o in esadecimale (se i primi due caratteri dell'operando sono0x). Se un operando non ha uno dei formati interi indicati sopra, viene considerato come un numero a virgola mobile se ciò è possibile. I numeri in virgola mobile possono essere specificati in uno qualsiasi dei modi accettati da un compilatore C conforme agli standard ANSI (eccetto che ilf, F, l, eL i suffissi non saranno consentiti nella maggior parte delle installazioni). Ad esempio, tutti i seguenti numeri validi sono in virgola mobile: 2.1, 3., 6e4, 7.91e + 16. Se non è possibile alcuna interpretazione numerica, allora un operando viene lasciato come una stringa (e solo ad esso può essere applicato un numero limitato di operatori).
Gli operandi possono essere specificati in uno dei seguenti modi:
1
Come valore numerico, intero o virgola mobile.
2
Come variabile Tcl, usando lo standard$ notazione. Il valore della variabile verrà utilizzato come operando.
3
Come una stringa racchiusa tra virgolette. Il parser di espressioni eseguirà le barre rovesciate, le variabili e le sostituzioni di comando sulle informazioni tra le virgolette e utilizzerà il valore risultante come operando
4
Come una stringa racchiusa tra parentesi graffe. I caratteri tra la parentesi aperta e la parentesi chiusa corrispondente verranno utilizzati come operandi senza alcuna sostituzione.
5
Come un comando Tcl racchiuso tra parentesi. Il comando verrà eseguito e il suo risultato verrà utilizzato come operando.
6
Come una funzione matematica i cui argomenti hanno una qualsiasi delle forme precedenti per gli operandi, come ad esempiosin (x $). Vedi sotto per un elenco di funzioni definite.
Dove le sostituzioni si verificano sopra (ad esempio all'interno di stringhe tra virgolette), vengono eseguite dalle istruzioni dell'espressione. Tuttavia, un ulteriore livello di sostituzione potrebbe essere già stato eseguito dal parser di comando prima che venisse chiamato il processore di espressioni. Come discusso di seguito, di solito è meglio racchiudere le espressioni tra parentesi per impedire al parser di comando di eseguire sostituzioni sui contenuti.
Per alcuni esempi di espressioni semplici, supponiamo che la variabileun ha il valore 3 e la variabileBha il valore 6. Quindi il comando sul lato sinistro di ciascuna delle righe seguenti produrrà il valore sul lato destro della linea:
expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * llength "6 2" 8 expr {{word one} <"word $ a"} 0
operatori
Gli operatori validi sono elencati di seguito, raggruppati in ordine decrescente di precedenza:
- + ~ !
Unario meno, unario più, bit-saggio NOT, logico NOT. Nessuno di questi operandi può essere applicato agli operandi stringa e NOT bit-saggio può essere applicato solo ai numeri interi.
* / %
Moltiplicare, dividere, resto. Nessuno di questi operandi può essere applicato agli operandi stringa e il resto può essere applicato solo ai numeri interi. Il resto avrà sempre lo stesso segno del divisore e un valore assoluto più piccolo del divisore.
+ -
Aggiungi e sottrarre. Valido per qualsiasi operando numerico.
<< >>
Maiusc e destra. Valido solo per gli operandi interi. Uno spostamento a destra fa sempre propagare il bit del segno.
< > <= >=
Booleano meno, maggiore, minore o uguale e maggiore o uguale. Ogni operatore produce 1 se la condizione è vera, 0 altrimenti. Questi operatori possono essere applicati alle stringhe e agli operandi numerici, nel qual caso viene utilizzato il confronto delle stringhe.
== !=
Booleano uguale e non uguale. Ogni operatore produce un risultato pari a zero / uno. Valido per tutti i tipi di operandi.
&
AND bit-saggio. Valido solo per gli operandi interi.
^
OR esclusivo bit-saggio. Valido solo per gli operandi interi.
|
Bit-saggio OR. Valido solo per gli operandi interi.
&&
AND logico. Produce un risultato 1 se entrambi gli operandi sono diversi da zero, 0 altrimenti. Valido solo per gli operandi booleani e numerici (interi o in virgola mobile).
||
OR logico. Produce un risultato 0 se entrambi gli operandi sono zero, 1 altrimenti. Valido solo per gli operandi booleani e numerici (interi o in virgola mobile).
X ? y : z
If-then-else, come in C. If X valuta a non zero, quindi il risultato è il valore di y . Altrimenti, il risultato è il valore di z . Il X l'operando deve avere un valore numerico.
Vedere il manuale C per ulteriori dettagli sui risultati prodotti da ciascun operatore. Tutti gli operatori binari si raggruppano da sinistra a destra con lo stesso livello di precedenza. Ad esempio, il comando
expr 4 * 2 <7
restituisce 0.
Il&&, ||, e?: gli operatori hanno `` valutazione lazy '', proprio come in C, il che significa che gli operandi non vengono valutati se non sono necessari per determinare il risultato. Ad esempio, nel comando
expr {$ v? a: b}
solo uno diun oB verrà effettivamente valutato, in base al valore di$ v. Si noti, tuttavia, che questo è vero solo se l'intera espressione è racchiusa tra parentesi graffe; altrimenti, il parser di Tcl valuterà entrambiun eB prima di invocare ilespr comando.
Funzioni matematiche
Tcl supporta le seguenti funzioni matematiche nelle espressioni:
addominali manganellocepposqrt acos Doppiolog10srand come in expprigioniero di guerraabbronzatura un'abbronzatura pavimentorandtanh atan2 fmodil giro ceil hypotpeccato cos intsinh
addominali( arg )
Restituisce il valore assoluto di arg . Arg può essere intero o virgola mobile e il risultato viene restituito nella stessa forma.
acos ( arg )
Restituisce l'arco coseno di arg , nell'intervallo 0, pi radianti. Arg dovrebbe essere compreso nell'intervallo -1,1.
come in( arg )
Restituisce l'arcoseno di arg , nell'intervallo -pi / 2, pi / 2 radianti. Arg dovrebbe essere compreso nell'intervallo -1,1.
un'abbronzatura( arg )
Restituisce l'arco tangente di arg , nell'intervallo -pi / 2, pi / 2 radianti.
atan2 ( x, y )
Restituisce l'arco tangente di y / X , nell'intervallo -pi, pi radianti. X e y non possono essere entrambi 0.
ceil ( arg )
Restituisce il valore intero più piccolo non inferiore a arg .
cos ( arg )
Restituisce il coseno di arg , misurato in radianti.
cosh ( arg )
Restituisce il coseno iperbolico di arg . Se il risultato causerebbe un overflow, verrà restituito un errore.
Doppio( arg )
Se arg è un valore flottante, restituisce arg , altrimenti converte arg fluttuare e restituisce il valore convertito.
exp ( arg )
Restituisce l'esponenziale di arg , definito come e ** arg . Se il risultato causerebbe un overflow, verrà restituito un errore.
pavimento( arg )
Restituisce il valore integrale più grande non maggiore di arg .
fmod ( x, y )
Restituisce il resto in virgola mobile della divisione di X di y . Se y è 0, viene restituito un errore.
hypot ( x, y )
Calcola la lunghezza dell'ipotenusa di un triangolo rettangolo ( X * X + y * y ).
int ( arg )
Se arg è un valore intero, restituisce arg , altrimenti converte arg to integer by truncation e restituisce il valore convertito.
log ( arg )
Restituisce il logaritmo naturale di arg . Arg deve essere un valore positivo.
log10 ( arg )
Restituisce il logaritmo di base 10 di arg . Arg deve essere un valore positivo.
pow ( x, y )
Calcola il valore di X elevato al potere y . Se X è negativo, y deve essere un valore intero.
rand ()
Restituisce un numero in virgola mobile da zero a poco meno di uno o, in termini matematici, l'intervallo 0,1). Il seme proviene dall'orologio interno della macchina o può essere impostato manualmente con la funzione srand.
il giro( arg )
Se arg è un valore intero, restituisce arg , altrimenti converte arg all'intero arrotondando e restituisce il valore convertito.
peccato( arg )
Restituisce il seno di arg , misurato in radianti.
sinh ( arg )
Restituisce il seno iperbolico di arg . Se il risultato causerebbe un overflow, verrà restituito un errore.
sqrt ( arg )
Restituisce la radice quadrata di arg . Arg deve essere non negativo
srand ( arg )
Il arg , che deve essere un numero intero, viene utilizzato per reimpostare il seme per il generatore di numeri casuali. Restituisce il primo numero casuale da quel seme. Ogni interprete ha il suo seme.
tan ( arg )
Restituisce la tangente di arg , misurato in radianti.
tanh ( arg )
Restituisce la tangente iperbolica di arg .
Oltre a queste funzioni predefinite, le applicazioni possono definire funzioni aggiuntive utilizzandoTcl_CreateMathFunc().
Tipi, overflow e precisione
Tutti i calcoli interni che coinvolgono numeri interi sono fatti con il tipo C lungo e tutti i calcoli interni che coinvolgono il virgola mobile vengono eseguiti con il tipo C Doppio . Quando si converte una stringa in virgola mobile, viene rilevato un overflow esponenziale che genera un errore Tcl. Per la conversione in intero da stringa, il rilevamento dell'overflow dipende dal comportamento di alcune routine nella libreria C locale, quindi dovrebbe essere considerato inaffidabile. In ogni caso, l'overflow e il underflow di un intero non vengono generalmente rilevati in modo affidabile per i risultati intermedi. Overflow e underflow in virgola mobile vengono rilevati nel grado supportato dall'hardware, che è generalmente abbastanza affidabile.
La conversione tra le rappresentazioni interne per interi, virgola mobile e stringhe viene eseguita automaticamente secondo necessità. Per i calcoli aritmetici, gli interi vengono utilizzati fino a quando non viene introdotto un numero a virgola mobile, dopo il quale viene utilizzato il virgola mobile. Per esempio,
expr 5/4
restituisce 1, mentre
expr 5 / 4.0 expr 5 / (lunghezza della stringa "abcd" + 0.0)
entrambi restituiscono 1,25. I valori in virgola mobile vengono sempre restituiti con un ``.'' o une in modo che non sembrino valori interi. Per esempio,
expr 20.0 / 5.0
ritorna4.0no4.
Operazioni su stringhe
I valori di stringa possono essere utilizzati come operandi degli operatori di confronto, sebbene l'analizzatore di espressioni cerchi di eseguire confronti come intero o virgola mobile quando possibile. Se uno degli operandi di un confronto è una stringa e l'altro ha un valore numerico, l'operando numerico viene riconvertito in una stringa utilizzando la C sprintf specificatore di formato% d per numeri interi e% g per valori a virgola mobile. Ad esempio, i comandi
expr {"0x03"> "2"} expr {"0y" <"0x12"}
entrambi restituiscono 1. Il primo confronto viene eseguito utilizzando il confronto tra interi e il secondo viene eseguito utilizzando il confronto di stringhe dopo che il secondo operando viene convertito nella stringa18. A causa della tendenza di Tcl a trattare i valori come numeri quando possibile, non è generalmente una buona idea usare operatori come==quando si vuole veramente il confronto tra stringhe ei valori degli operandi potrebbero essere arbitrari; è meglio in questi casi usare ilstringa comando invece.
Considerazioni sulle prestazioni
Racchiudi espressioni in parentesi graffe per la migliore velocità e le più piccole esigenze di archiviazione. Ciò consente al compilatore bytec Tcl di generare il codice migliore.
Come accennato in precedenza, le espressioni sono sostituite due volte: una volta dal parser Tcl e una volta dal espr comando. Ad esempio, i comandi
impostare un 3 imposta b {$ a + 2} expr $ b * 4
return 11, non un multiplo di 4. Questo perché il parser Tcl verrà prima sostituito$ a + 2 per la variabileB, poi ilespr il comando valuterà l'espressione$ a + 2 * 4.
La maggior parte delle espressioni non richiede un secondo ciclo di sostituzioni. O sono racchiusi tra parentesi o, in caso contrario, la loro variabile e le sostituzioni di comando producono numeri o stringhe che non richiedono necessariamente sostituzioni. Tuttavia, poiché alcune espressioni non vincolate richiedono due cicli di sostituzioni, il compilatore bytecode deve emettere istruzioni aggiuntive per gestire questa situazione. Il codice più costoso è richiesto per le espressioni non vincolate che contengono sostituzioni di comando. Queste espressioni devono essere implementate generando un nuovo codice ogni volta che viene eseguita l'espressione.
parole
aritmetico, booleano, confronto, espressione, confronto sfocato
Importante: Utilizzare il uomo comando ( % uomo ) per vedere come viene utilizzato un comando sul tuo computer specifico.