Guía de seguimiento dinámico de Solaris

Capítulo 2 Tipos, operadores y expresiones

D permite acceder y manipular varios objetos de datos: Es posible crear y modificar variables y estructuras de datos, acceder a los objetos de datos definidos en el núcleo del sistema operativo y los procesos de usuario, así como declarar constantes de cadenas, coma flotante y enteros. D proporciona un superconjunto de operadores ANSI-C que se utilizan para manipular objetos y crear expresiones complejas. Este capítulo describe el conjunto detallado de reglas para los tipos, operadores y expresiones.

Nombres de identificador y palabras clave

Los nombres de identificador en D están compuestos por letras en mayúsculas y minúsculas, números y guiones bajos en los que el primer carácter debe ser una letra o guión bajo. Todos los nombres de identificador que comienzan con un guión bajo (_) están reservados para las bibliotecas de sistema de D. Debe evitar dichos nombres en los programas de D. Por convención, los programadores de D utilizan normalmente nombres con mayúsculas y minúsculas para las variables y nombres en mayúsculas para las constantes.

Las palabras clave del lenguaje D son identificadores especiales reservados para utilizarse en la sintaxis del lenguaje de programación. Estos nombres siempre se especifican en minúsculas, y no se pueden utilizar para los nombres de las variables de D.

Tabla 2–1 Palabras clave de D

auto*

goto*

sizeof

break*

if*

static*

case*

import*+

string+

char

inline

stringof+

const

int

struct

continue*

long

switch*

counter*+

offsetof+

this+

default*

probe*+

translator+

do*

provider*+

typedef

double

register*

union

else*

restrict*

unsigned

enum

return*

void

extern

self+

volatile

float

short

while*

for*

signed

xlate+

D reserva para utilizar como palabras clave un superconjunto de palabras clave de ANSI-C. Las palabras clave reservadas para la utilización futura en el lenguaje D se marcan con “*”. El compilador de D producirá un error de sintaxis si intenta utilizar una palabra clave que esté reservada para su uso futuro. Las palabras clave definidas por D pero no definidas por ANSI-C se marcan con “+”. D proporciona el conjunto completo de tipos y operadores que se encuentra en ANSI-C. La principal diferencia en la programación en D es la ausencia de construcciones de flujo de control. Las palabras clave asociadas con el flujo de control en ANSI-C se han reservado para la utilización futura en D.

Tipos de datos y tamaños

D proporciona tipos de datos básicos para los números enteros y constantes de coma flotante. La aritmética sólo se puede realizar en números enteros en los programas de D. Las constantes de coma flotante se pueden utilizar para inicializar las estructuras de datos, sin embargo, la aritmética de coma flotante no está permitida en D. D proporciona un modelo de datos de 32 y 64 bits para utilizar al escribir programas. El modelo de datos utilizado al ejecutar el programa es el modelo de datos original asociado con el núcleo del sistema operativo activo. Puede determinar el modelo de datos original para el sistema utilizando isainfo -b.

En la siguiente tabla se muestran los nombres de los tipos de número entero y sus tamaños en cada uno de los dos modelos de datos. Los números enteros se representan en un formato de parejas complementarias en el orden de codificación de bytes original del sistema.

Tabla 2–2 Tipos de datos de números enteros de D

Nombre de tipo 

Tamaño de 32–bits 

Tamaño de 64–bits 

char

1 byte 

1 byte 

short

2 bytes 

2 bytes 

int

4 bytes 

4 bytes 

long

4 bytes 

8 bytes 

long long

8 bytes 

8 bytes 

Los tipos de número entero se pueden prefijar con el calificador signed o unsigned. Si no hay ningún calificador de signo presente, se asume que el tipo es signed (con signo). El compilador de D también proporciona los alias de tipo que se indican en la siguiente tabla:

Tabla 2–3 Alias de tipo de número entero de D

Nombre de tipo 

Descripción 

int8_t

Número entero con signo de 1 byte 

int16_t

Número entero con signo de 2 bytes 

int32_t

Número entero con signo de 4 bytes 

int64_t

Número entero con signo de 8 bytes 

intptr_t

Número entero con signo de tamaño igual a un puntero 

uint8_t

Número entero sin signo de 1 byte 

uint16_t

Número entero sin signo de 2 bytes 

uint32_t

Número entero sin signo de 4 bytes 

uint64_t

Número entero sin signo de 8 bytes 

uintptr_t

Número entero sin signo de tamaño igual a un puntero 

Estos tipos de alias son equivalentes a la utilización del nombre del tipo base correspondiente en la tabla anterior, y se definen adecuadamente para cada modelo de datos. Por ejemplo, el nombre de tipo uint8_t es un alias para el tipo unsigned char. Consulte el Capítulo 8Definiciones de tipos y constantes para obtener más información sobre cómo definir sus propios alias de tipo para utilizarlos en los programas D.

D proporciona tipos de coma flotante para ofrecer compatibilidad con las declaraciones y tipos de ANSI-C. Los operadores de coma flotante no se admiten en D, sin embargo, se puede realizar un seguimiento y dar formato a los objetos de datos de coma flotante utilizando la función printf. () Se pueden utilizar los tipos de coma flotante que se indican en la siguiente tabla:

Tabla 2–4 Tipos de datos de coma flotante en D

Nombre de tipo 

Tamaño de 32–bits 

Tamaño de 64–bits 

float

4 bytes 

4 bytes 

double

8 bytes 

8 bytes 

long double

16 bytes 

16 bytes 

D también proporciona el tipo especial string para representar cadenas ASCII. Las cadenas se analizan con más detalle en el Capítulo 6Cadenas.

constantes

Las constantes de números enteros se pueden escribir en formato decimal (12345), octal (012345) o hexadecimal (0x12345). Las constantes octales (base 8) deben tener un cero como prefijo. Las constantes hexadecimales (base 16) deben tener un prefijo 0x o 0X. Las constantes de números enteros tienen asignado el tipo más pequeño entre int, long y long long que pueda representar su valor. Si el valor es negativo, se utiliza la versión con signo del tipo. Si el valor es positivo y demasiado grande para que se ajuste a la representación de un tipo con signo, se utiliza la representación del tipo sin signo. Puede aplicar cualquiera de los siguientes sufijos a una constante de número entero para especificar explícitamente su tipo de D:

u o U

Versión unsigned del tipo seleccionado por el compilador

l o L

long

ul o UL

unsigned long

ll o LL

long long

ull o ULL

unsigned long long

Las constantes de coma flotante siempre se escriben en sistema decimal y deben contener una coma decimal (12,345), un exponente ( 123e45) o ambos (123,34e-5). Las constantes de coma flotante tienen asignado el tipo double de forma predeterminada. Puede aplicar cualquiera de los siguientes sufijos a una constante de coma flotante para especificar explícitamente su tipo de D:

f o F

float

l o L

long double

Las constantes de caracteres se escriben como un único carácter o secuencia de escape entre un par de comillas simples ('a'). Las constantes de caracteres tienen asignado el tipo int y son equivalentes a una constante de número entero cuyo valor está determinado por el valor de dicho carácter en el juego de caracteres ASCII. Puede consultar ascii(5) para ver una lista de los caracteres y sus valores. También puede utilizar cualquiera de las secuencias de escape especiales que se muestran en la siguiente tabla en la constantes de caracteres. D admite las mismas secuencias de escape que se encuentran en ANSI-C.

Tabla 2–5 Secuencias de escape de caracteres en D

\a

alerta. 

\\

barra invertida 

\b

retroceso 

\?

signo de interrogación 

\f

avance de página 

\'

comillas simples 

\n

nueva línea 

\”

comillas dobles 

\r

retorno de carro 

\0oo

valor octal 0oo

\t

ficha horizontal 

\xhh

valor hexadecimal 0xhh

\v

ficha vertical 

\0

carácter nulo 

Puede incluir más de un especificador de caracteres entre comillas simples para crear números enteros cuyos bytes individuales se inicialicen de acuerdo con los especificadores de caracteres correspondientes. Los bytes se leen de izquierda a derecha desde la constante de caracteres, y se asignan al número entero resultante en el orden correspondiente del endian-ness nativo de su entorno operativo. Se pueden incluir hasta ocho especificadores de caracteres en una única constante de caracteres.

Las constantes de cadenas de cualquier longitud se pueden crear incluyéndolas entre un par de comillas dobles ("hello"). Es posible que una constante de cadena no contenga un carácter de nueva línea literal. Para crear cadenas que contengan líneas nuevas, use la secuencia de escape \n en vez de una línea nueva literal. Las constantes de cadena pueden contener cualquiera de las secuencias de escape de caracteres especiales mostradas anteriormente para las constantes de caracteres. De forma parecida a ANSI-C, las cadenas se representan como matrices de caracteres terminadas por un carácter null (\0) que se agrega implícitamente a cada constante de cadena que declare. Las constantes de cadena se asignan al tipo especial de D string. El compilador de D proporciona un conjunto de funciones especiales para comparar y realizar un seguimiento de las matrices de caracteres declaradas como cadenas, como se describe en el Capítulo 6Cadenas.

Operadores aritméticos

D proporciona los operadores aritméticos binarios que se muestran en la siguiente tabla para utilizarlos en sus programas. Estos operadores tendrán el mismo significado para los números enteros que en ANSI-C.

Tabla 2–6 Operadores aritméticos binarios en D

+

adición de números enteros 

-

resta de números enteros 

*

multiplicación de números enteros 

/

división de números enteros 

%

módulos de números enteros 

La aritmética en D sólo se realizará en los operandos de números enteros, o en punteros, como se analiza en el Capítulo 5Punteros y matrices. La aritmética no se utilizará en los operandos con coma flotante en programas en D. El entorno de ejecución de DTrace no realiza ninguna acción en un desbordamiento o subdesbordamiento de número entero. Debe comprobar estas condiciones en las situaciones en las que se puedan producir desbordamientos o subdesbordamientos.

El entorno de ejecución de DTrace comprueba automáticamente, y notifica, los errores por división por cero procedentes de una utilización inadecuada de los operadores / y %. Si un programa D ejecuta una operación de división no válida, DTrace desactivará automáticamente la instrumentación afectada y notificará el error. Los errores detectados por DTrace no tienen ningún efecto en otros usuarios de DTrace ni en el núcleo del sistema operativo, por lo que no necesita preocuparse de provocar daños si el programa D contiene de forma inadvertida alguno de estos errores.

Además de estos operadores binarios, los operadores + y - también se pueden utilizar como operadores unarios; estos operadores tienen una prioridad más alta que cualquiera de los operadores aritméticos binarios. El orden de prioridad y las propiedades de asociación de todos los operadores de D se muestran en la Tabla 2–11. Puede controlar la prioridad agrupando las expresiones entre paréntesis ( ).

Operadores relacionales

D proporciona los operadores relacionales binarios que se muestran en la siguiente tabla para utilizarlos en sus programas. Estos operadores tendrán el mismo significado para los números enteros que en ANSI-C.

Tabla 2–7 Operadores relacionales de D

<

el operando de la izquierda es menor que el de la derecha 

<=

el operando de la izquierda es menor o igual que el de la derecha 

>

el operando de la izquierda es mayor que el de la derecha 

>=

el operando de la izquierda es mayor o igual que el de la derecha 

==

el operando de la izquierda es igual que el de la derecha 

!=

el operando de la izquierda es distinto que el de la derecha 

Normalmente, los operadores relacionales se utilizan con mayor frecuencia para escribir predicados en D. Cada operador se evalúa en un valor de tipo int, que es igual a uno si la condición es verdadera (true), o cero si es falsa (false).

Los operadores relacionales se pueden aplicar a pares de números enteros, punteros o a cadenas. Si se comparan los punteros, el resultado es equivalente a una comparación de números enteros de dos punteros interpretados como números enteros sin signo. Si se comparan las cadenas, el resultado se determina como si se estuviera realizando un strcmp(3C) en los dos operandos. A continuación se muestran algunas comparaciones de cadenas de D de muestra y sus resultados:

"coffee" < "espresso"

... devuelve 1 (true) 

"coffee" == "coffee"

... devuelve 1 (true) 

"coffee" >= "mocha"

... devuelve 0 (false) 

Los operadores relacionales también pueden utilizarse para comparar un objeto de datos asociado con un tipo de enumeración, con cualquiera de las etiquetas de enumerador definidas por la enumeración. Las enumeraciones son un recurso para crear constantes de números enteros, y se describen de forma más detallada en el Capítulo 8Definiciones de tipos y constantes.

operadores lógicos

D proporciona los siguientes operadores lógicos binarios para utilizarlos en sus programas. Los dos primeros operadores son equivalentes a los operadores de ANSI-C correspondientes.

Tabla 2–8 Operadores lógicos de D

&&

AND lógico: verdadero (true) si ambos operandos son verdaderos (true)

||

OR lógico: verdadero (true) si uno o los dos operandos son verdaderos (true)

^^

XOR lógico: verdadero (true) si exactamente un operando es verdadero (true)

Normalmente, los operadores lógicos se utilizan con mayor frecuencia para escribir predicados en D. El operador lógico AND realiza una evaluación de cortocircuito: si el operando de la izquierda es falso (false), la expresión de la derecha no se evalúa. El operador lógico OR realiza una evaluación de cortocircuito: si el operando de la izquierda es verdadero (true), la expresión de la derecha no se evalúa. El operador lógico XOR no provoca ningún cortocircuito: ambos operandos se evalúan siempre.

Además de los operadores lógicos binarios, el operador unario ! se puede utilizar para realizar una negación lógica de un único operando: convierte un operando cero en un uno, y un operando distinto a cero en cero. Por convención, los programadores de D utilizan ! cuando trabajan con números enteros que tienen que representar valores booleanos y == 0 cuando trabajan con números enteros no booleanos, aunque ambas expresiones tienen un significado equivalente.

Los operadores lógicos se pueden aplicar a operandos de tipo números enteros o punteros. Los operadores lógicos interpretan los operandos de puntero como valores de números enteros sin signo. Al igual que los operadores lógicos y relacionales en D, los operandos son verdaderos (true) si tienen un valor de número entero distinto a cero y falsos (false) si tienen un valor de numero entero cero.

Operadores a nivel de bit

D proporciona los siguientes operadores binarios para manipular bits individuales dentro de los operandos de números enteros. Estos operadores tienen todos el mismo significado que en ANSI-C.

Tabla 2–9 Operadores a nivel de bit de D

&

AND a nivel de bit 

|

OR a nivel de bit 

^

XOR a nivel de bit 

<<

desplaza el operando de la izquierda hacia la izquierda el número de bits especificado por el operando de la derecha 

>>

desplaza el operando de la izquierda hacia la derecha el número de bits especificado por el operando de la derecha 

El operador binario & se utiliza para borrar bits de un operando de números enteros. El operador binario | se utiliza para definir bits en un operando de números enteros. El operador binario ^ devuelve un uno en cada posición de bit donde exactamente se define uno de los bits de operando correspondiente.

Los operadores de desplazamiento se utilizan para mover bits hacia la izquierda o derecha en un operando de números enteros concreto. Si se realiza el desplazamiento hacia la izquierda, se rellenan las posiciones de bits vacías en el lado derecho del resultado con ceros. Si se realiza el desplazamiento hacia la derecha utilizando un operando de números enteros sin signo, se rellenan las posiciones de bits vacías en el lado izquierdo del resultado con ceros. Si se realiza el desplazamiento hacia la derecha utilizando un operando de números enteros con signo, rellena las posiciones de bits vacías en el lado izquierdo del valor del bit con signo, también conocido como una operación de desplazamiento aritmético.

Si se realiza un desplazamiento de un valor de número entero mediante un número negativo de bits o mediante un número de bits más grande que el número de bits en el operando de la izquierda, produce un resultado no definido. El compilador de D producirá un mensaje de error si puede detectar esta condición cuando compila el programa D.

Además de los operadores lógicos binarios, el operador unario ! se puede utilizar para realizar una negación a nivel de bits de un único operando: convierte cada bit cero en el operando en un bit uno, y cada bit uno del operando en un bit cero.

Operadores de asignación

D proporciona los siguientes operadores de asignación binaria para modificar variables de D. Sólo puede modificar variables y matrices de D. Los objetos de datos del núcleo y las constantes no se pueden modificar utilizando los operadores de asignación de D. Los operadores de asignación tiene el mismo significado que en ANSI-C.

Tabla 2–10 Operadores de asignación de D

=

define el operando de la izquierda igual al valor de la expresión de la derecha 

+=

aumenta el operando de la izquierda por el valor de la expresión de la derecha 

-=

reduce el operando de la izquierda por el valor de la expresión de la derecha 

*=

multiplica el operando de la izquierda por el valor de la expresión de la derecha 

/=

divide el operando de la izquierda por el valor de la expresión de la derecha 

%=

modula el operando de la izquierda por el valor de la expresión de la derecha 

|=

OR a nivel de bits del operando de la izquierda con el valor de la expresión de la derecha 

&=

AND a nivel de bits del operando de la izquierda con el valor de la expresión de la derecha 

^=

XOR a nivel de bits del operando de la izquierda con el valor de la expresión de la derecha 

<<=

desplaza el operando de la izquierda hacia la izquierda el número de bits especificado por el valor de la expresión de la derecha 

>>=

desplaza el operando de la izquierda hacia la derecha el número de bits especificado por el valor de la expresión de la derecha 

Aparte del operador de asignación =, el resto de operadores de asignación se proporciona como un atajo para utilizar el operador = con uno de los otros operadores descritos anteriormente. Por ejemplo, la expresión x = x + 1 es equivalente a la expresión x += 1, excepto en que la expresión x se evalúa una vez. Estos operadores de asignación obedecen las mismas reglas para los tipos de operando que los formularios binarios descritos anteriormente.

El resultado de cualquier operador de asignación es una expresión igual al nuevo valor de la expresión de la izquierda. Puede utilizar los operadores de asignación o cualquiera de los operadores descritos hasta ahora en combinación para formar expresiones de complejidad arbitraria. Puede utilizar paréntesis ( ) para agrupar los términos en las expresiones complejas.

Operadores de incremento y reducción

D proporciona los operadores unarios especiales ++ y -- para aumentar y disminuir los punteros y números enteros. Estos operadores tienen el mismo significado que en ANSI-C. Estos operadores sólo se pueden aplicar a las variables, y pueden aplicarse antes o después del nombre de la variable. Si el operador aparece antes del nombre de la variable, la variable se modifica en primer lugar y, a continuación, la expresión resultante es igual al nuevo valor de la variable. Por ejemplo, las siguientes dos expresiones producen resultados idénticos:

x += 1;

y = ++x;

y = x;

 

Si el operador aparece después del nombre de la variable, la variable se modifica después de que su valor actual se devuelva para utilizarse en la expresión. Por ejemplo, las siguientes dos expresiones producen resultados idénticos:

y = x;

y = x--;

x -= 1;

 

Puede utilizar los operadores de incremento y reducción para crear variables nuevas sin tener que declararlas. Si se omite una declaración de variable y el operador de incremento o reducción se aplica a una variable, la variable se declara implícitamente como de tipo int64_t.

Los operadores de incremento y reducción se pueden aplicar a variables de números enteros o a punteros. Cuando se aplica a variables de números enteros, los operadores incrementan o reducen el valor correspondiente en uno. Cuando se aplican a las variables de puntero, los operadores incrementan o reducen la dirección del puntero por el tamaño del tipo de datos referenciado por este puntero. Los punteros y la aritmética de punteros en D se explica en el Capítulo 5Punteros y matrices.

Expresiones condicionales

Aunque D no proporciona compatibilidad para construcciones if-else-then, proporciona compatibilidad para las expresiones condicionales sencillas utilizando los operadores ? y :. Estos operadores permiten que tres expresiones se asocien cuando se utiliza la primera expresión para evaluar condicionalmente una de las otras dos. Por ejemplo, la siguiente declaración de D se podría utilizar para definir una variable x en una o dos cadenas en función del valor de i:

x = i == 0 ? "zero" : "non-zero";

En este ejemplo, la expresión i == 0 se evalúa en primer lugar para determinar si es true o false. Si la primera expresión es true, la segunda expresión se evalúa y la expresión ?: devuelve su valor. Si la primera expresión es false, la tercera expresión se evalúa y la expresión ?: devuelve su valor.

Al igual que con cualquier operador D, puede utilizar varios ?: operadores en una sola expresión para crear más expresiones complejas. Por ejemplo, la siguiente expresión tomará una variable char c que contenga uno de los caracteres 0-9, a-z o A-Z y devolverá el valor de este carácter cuando se interprete como un número en un número entero hexadecimal (base 16):

hexval = (c >= '0' && c <= '9') ? c - '0' :
    (c >= 'a' && c <= 'z') ? c + 10 - 'a' : c + 10 - 'A';

La primera expresión que se utilice con ?: debe ser un puntero entero para que se pueda evaluar para su valor verdadero. La segunda y tercera expresión pueden ser de cualquier tipo compatible. No debe construir una expresión condicional en la que, por ejemplo, una ruta devuelva una cadena y otra ruta devuelva un número entero. La segunda y tercera expresión tampoco deben invocar una función de seguimiento como trace() o printf(). Si desea realizar un seguimiento condicional de los datos, use un predicado en su lugar, como se indica en el Capítulo 1Introducción.

conversiones de tipos

Cuando se construyen las expresiones utilizando operandos de distintos tipos pero compatibles, las conversiones de tipo se realizan para determinar el tipo de la expresión resultante. Las reglas de D para las conversiones de tipo son las mismas que las reglas de conversión aritmética para los números enteros en ANSI-C. Estas reglas se denominan en ocasiones como conversiones aritméticas habituales.

Una manera sencilla de describir las reglas de conversión es la siguiente: cada tipo de número entero se clasifica en el orden char, short, int, long, long long, con los tipos sin signo correspondientes asignados un puesto por encima de su equivalente con signo, pero debajo del siguiente tipo de número entero. Cuando construye una expresión utilizando dos operandos de número entero como x + y y los operandos son de tipos de números enteros distintos, se utiliza el tipo de operando con el puesto más alto como el tipo de resultado.

Si se requiere una conversión, el operando de puesto menor es primero promocionado al tipo superior. Esta promoción no cambia el valor del operando: simplemente amplía el valor a un contenedor mayor en función de su signo. Si se promociona un operando sin signo, los bits de orden superior sin utilizar del número entero resultante se rellenan con ceros. Si un operando con signo se promociona, los bits de orden superior sin utilizar se rellenan mediante una extensión del signo. Si un tipo con signo se convierte a un tipo sin signo, primero se amplía el signo del primero y luego se le asigna el nuevo tipo sin signo determinado por la conversión.

Los números enteros y otros tipos también se pueden convertir de un tipo a otro. En D, los punteros y números enteros se pueden convertir a cualquier tipo de número entero o puntero, pero no a otros tipos. Las reglas para convertir y promocionar cadenas y matrices de caracteres se analizan en el Capítulo 6Cadenas. Una conversión de número entero o puntero se forma utilizando una:

y = (int)x;

donde el tipo de destino se coloca entre paréntesis y se utiliza como prefijo de la expresión de origen. Los números enteros se convierten a tipos de puesto superior realizando una promoción. Los números enteros se convierten a tipos de puesto inferior utilizando ceros en los bits de orden superior libres del número entero.

Debido a que D no permite la aritmética de coma flotante, no se permite ninguna conversión o fusión de operando de coma flotante y no se define ninguna regla para la conversión implícita de la coma flotante.

Prioridad

Las reglas de D para la prioridad y la asociación de operadores se describen en la siguiente tabla. Estas reglas son en cierta medida complejas, pero son necesarias para proporcionar una compatibilidad precisa con las reglas de prioridad de operadores ANSI-C. Las entradas de la tabla se muestran en orden de la máxima prioridad a la mínima.

Tabla 2–11 Prioridad y asociación de operadores en D

operadores 

Asociación 

() [] -> .

izquierda a derecha 

! ~ ++ -- + - * & (tipo) sizeof stringof offsetof xlate

derecha a izquierda 

* / %

izquierda a derecha 

+ -

izquierda a derecha 

<< >>

izquierda a derecha 

< <= > >=

izquierda a derecha 

== !=

izquierda a derecha 

&

izquierda a derecha 

^

izquierda a derecha 

|

izquierda a derecha 

&&

izquierda a derecha 

^^

izquierda a derecha 

||

izquierda a derecha 

?:

derecha a izquierda 

= += -= *= /= %= &= ^= |= <<= >>=

derecha a izquierda 

,

izquierda a derecha 

Existen varios operadores en la tabla que todavía no se han analizado; estos operadores se tratarán en próximos capítulos:

sizeof

Calcula el tamaño de un objeto (Capítulo 7Estructuras y uniones)

offsetof

Calcula el desplazamiento de un miembro de tipo (Capítulo 7Estructuras y uniones)

stringof

Convierte el operando en una cadena (Capítulo 6Cadenas)

xlate

Traduce un tipo de datos (Capítulo 40Traductores)

unario &

Calcula la dirección de un objeto (Capítulo 5Punteros y matrices)

* unario

Anula la referencia de un puntero respecto a un objeto (Capítulo 5Punteros y matrices)

-> y .

Accede a un miembro de una estructura o un tipo de unión (Capítulo 7Estructuras y uniones)

El operador coma (,) indicado en la tabla es para la compatibilidad con el operador de coma de ANSI-C, que se puede utilizar para evaluar un conjunto de expresiones de izquierda a derecha y devolver el valor de la expresión más a la derecha. Este operador se proporciona estrictamente para la compatibilidad con C y normalmente no debería utilizarse.

La entrada () en la tabla de prioridad de operadores representa una llamada de función; los ejemplos de llamadas a funciones como printf() y trace() se presentan en el Capítulo 1Introducción. En D también se utiliza una coma para enumerar argumentos de funciones y para formar listas de claves de matriz asociativas. Esta coma no es la misma que el operador coma y no garantiza la evaluación de izquierda a derecha. El compilador de D no proporciona ninguna garantía en cuanto al orden de evaluación de los argumentos a una función o las claves a una matriz asociativa. Debe tener cuidado al utilizar en estos contextos expresiones con efectos secundarios de interacción como el par de expresiones i y i++.

La entrada [] en la tabla de prioridad de operadores representa una matriz o una referencia de matriz asociativa. En el Capítulo 1Introducción se presentan ejemplos de matrices asociativa. Un tipo especial de matriz asociativa denominada agregación se describe en el Capítulo 9Adiciones. El operador [] también se puede utilizar para indexar matrices C de tamaño fijo, como se describe en el Capítulo 5Punteros y matrices.