Valutazione di espressioni
Il debugger comprende due diverse forme di espressioni: espressioni MASM e espressioni C++.
Le espressioni MASM (Microsoft Macro Assembler) vengono usate negli esempi descritti in questa documentazione della Guida, ad eccezione di quanto indicato in caso contrario. Nelle espressioni MASM tutti i simboli vengono considerati come indirizzi.
Le espressioni C++ sono uguali a quelle usate nel codice C++ effettivo. In queste espressioni i simboli sono compresi come tipi di dati appropriati.
Quando viene usata ogni sintassi
È possibile selezionare l'analizzatore di espressioni predefinito in uno dei modi seguenti:
Usare la variabile di ambiente _NT_EXPR_EVAL prima dell'avvio del debugger.
Usare l'opzione della riga di comando-ee {masm|c++} all'avvio del debugger.
Usare il comando .expr (Choose Expression Evaluator) per visualizzare o modificare l'analizzatore di espressioni dopo l'esecuzione del debugger.
Se non si usa uno dei metodi precedenti, il debugger usa l'analizzatore di espressioni MASM.
Se si vuole valutare un'espressione senza modificare lo stato del debugger, è possibile usare ? (Valuta espressione) Comando.
Tutti i comandi e le informazioni di debug interpretano gli argomenti tramite l'analizzatore di espressioni predefinite, con le eccezioni seguenti:
Il ?? (Valutare l'espressione C++) il comando usa sempre l'analizzatore di espressioni C++.
La finestra Watch usa sempre l'analizzatore di espressioni C++.
La finestra Variabili locali usa sempre l'analizzatore di espressioni C++.
Alcuni comandi di estensione usano sempre l'analizzatore di espressioni MASM e altri comandi di estensione accettano solo argomenti numerici anziché espressioni complete.
Se una parte di un'espressione è racchiusa tra parentesi e si inseriscono due segni (@@) prima dell'espressione, l'espressione viene valutata dall'analizzatore di espressioni che in genere non verrà usata in questo caso.
I due segni (@@) consentono di usare due analizzatori diversi per parametri diversi di un singolo comando. Consente inoltre di valutare parti diverse di un'espressione lunga in base a metodi diversi. È possibile annidare i due segni. Ogni aspetto dei due segni passa all'altro analizzatore di espressioni.
Avviso La sintassi delle espressioni C++ è utile per modificare strutture e variabili, ma non è adatta come parser per i parametri dei comandi del debugger. Quando si usano i comandi del debugger per scopi generali o si usano estensioni del debugger, è necessario impostare la sintassi dell'espressione MASM come analizzatore di espressioni predefinito. Se è necessario disporre di un parametro specifico usa la sintassi dell'espressione C++, usare la sintassi due in corrispondenza del segno (@@).
Per altre informazioni sui due diversi tipi di espressione, vedere Sintassi dell'espressione numerica.
Numeri nelle espressioni
I numeri nelle espressioni MASM vengono interpretati in base al radix corrente. Il comando n (Set Number Base) può essere usato per impostare il radix predefinito su 16, 10 o 8. Tutti i numeri senza prefisso verranno interpretati in questa base. Il radix predefinito può essere sottoposto a override specificando il prefisso 0x (esadecimale), il prefisso 0n (decimale), il prefisso 0t (ottale) o il prefisso 0y (binario).
I numeri nelle espressioni C++ vengono interpretati come numeri decimali a meno che non si specifichi in modo diverso. Per specificare un intero esadecimale, aggiungere 0x prima del numero. Per specificare un intero ottale, aggiungere 0 (zero) prima del numero. Tuttavia, nell'output del debugger viene talvolta usato il prefisso decimale 0n .
Se si vuole visualizzare un numero in diverse basi contemporaneamente, usare il comando .format (Show Number Format).
Simboli nelle espressioni
I due tipi di espressioni interpretano i simboli in modo diverso:
Nelle espressioni MASM ogni simbolo viene interpretato come indirizzo. A seconda del simbolo a cui fa riferimento, questo indirizzo è l'indirizzo di una variabile globale, variabile locale, funzione, segmento, modulo o qualsiasi altra etichetta riconosciuta.
Nelle espressioni C++ ogni simbolo viene interpretato in base al relativo tipo. A seconda del simbolo a cui fa riferimento, può essere interpretato come intero, una struttura di dati, un puntatore a funzioni o qualsiasi altro tipo di dati. Un simbolo che non corrisponde a un tipo di dati C++ (ad esempio un nome di modulo non modificato) crea un errore di sintassi.
Se un simbolo potrebbe essere ambiguo, precederlo con il nome del modulo e un punto esclamativo ( ! ). Se il nome del simbolo può essere interpretato come numero esadecimale, precederlo con il nome del modulo e un punto esclamativo ( ! ) o solo un punto esclamativo. Per specificare che un simbolo deve essere locale, omettere il nome del modulo e includere un segno dollaro e un punto esclamativo ( $! ) prima del nome del simbolo. Per altre informazioni sull'interpretazione dei simboli, vedere Sintassi dei simboli e corrispondenza dei simboli.
Operatori nelle espressioni
Ogni tipo di espressione usa una raccolta diversa di operatori.
Per altre informazioni sugli operatori che è possibile usare nelle espressioni MASM e sulle relative regole di precedenza, vedere Numeri e operatori MASM.
Per altre informazioni sugli operatori che è possibile usare nelle espressioni C++ e sulle relative regole di precedenza, vedere Numeri e operatori C++.
Tenere presente che le operazioni MASM sono sempre basate su byte e le operazioni C++ seguono le regole di tipo C++ (incluso il ridimensionamento dell'aritmetica del puntatore).
Per alcuni esempi delle diverse sintassi, vedere Esempi di espressioni miste.