Pregunta

Estoy un poco confundido entre lo que es y no es una expresión constante en C, incluso después de mucho Googleing. Podría dar un ejemplo de algo que es, y que no es, una expresión constante en C?

¿Fue útil?

Solución

expresión de la constante A se puede evaluar en tiempo de compilación. Eso significa que no tiene variables en ella. Por ejemplo:

5 + 7 / 3

es una expresión constante. Algo así como:

5 + someNumber / 3

no está, suponiendo someNumber es una variable (es decir, no es en sí una constante de tiempo de compilación).

Otros consejos

Hay otra sutileza para expresiones constantes. Hay algunas cosas que son conocidos por el compilador, pero no pueden ser conocidos por el preprocesador.

Por ejemplo (24*60*60) puede calcularse por tanto, pero sizeof struct foo sólo es conocida para el compilador. Esta distinción puede importar si usted está tratando de verificar que un struct se define para cumplir con un tamaño a un mandato externo, o que sus miembros se asignan a desplazamientos especificados externamente. (Este caso de uso a menudo surge cuando la codificación de los controladores de dispositivo en el que el struct describe dispositivo registra como tumbábamos en espacio de memoria.)

En ese caso no se puede decir simplemente #if (sizeof(struct UART) == 12) porque el preprocesador opera a un paso por delante de la compilación y simplemente no puede saber el tamaño de cualquier tipo. Es, sin embargo, una expresión constante y sería válida como un inicializador para una variable global (por ejemplo int UARTwords = sizeof(struct UART) / sizeof(short);), o para declarar el tamaño de una matriz (por ejemplo unsigned char UARTmirror[sizeof(struct UART)];)

Nadie parece haber mencionado todavía otro tipo de expresión constante: la dirección constantes. La dirección de un objeto con una duración de almacenamiento estático es una constante de dirección, por lo tanto, se puede hacer este tipo de cosas en el ámbito de archivo:

char x;
char *p = &x;

Los literales de cadena definen matrices con una duración de almacenamiento estático, por lo que esta regla es la razón por la que usted puede hacer esto en el ámbito de archivo:

char *s = "foobar";

Cualquier literal de un solo valor es una expresión constante.

3     0.0f    '\n'

(literales de cadena son raro, porque en realidad son matrices. Parece "hello" en realidad no es una constante, ya que termina teniendo que estar vinculada y todo eso, y la dirección y el contenido puede cambiar en tiempo de ejecución.)

La mayoría de los operadores (sizeof, moldes, etc.) que se aplica a las constantes o tipos son expresiones constantes.

sizeof(char)
(byte) 15

Cualquier expresión que implique sólo expresiones constantes es en sí también una expresión constante.

15 + 3
0.0f + 0.0f
sizeof(char)

Cualquier expresión que incluya llamadas a funciones o expresiones no constantes suele ser no una expresión constante.

strlen("hello")
fifteen + x

Cualquier estado de macro como una expresión de la constante depende de lo que se expande a.

/* Always a constant */
#define FIFTEEN 15

/* Only constant if (x) is
#define htons(x)  (( ((x) >> 8) | ((x) << 8) ) & 0xffff) 

/* Never constant */
#define X_LENGTH  strlen(x)

Al principio tuve algunas cosas aquí acerca de los identificadores const, pero he probado que al parecer no se aplica en C. const, por extraño que parezca, no declarar constantes (al menos, no los "constante" suficiente como para ser utilizado en los estados switch). En C ++, sin embargo, lo hace.

Otra diversión pequeña arruga: en C, el valor de un 'enumeración' es una constante, pero sólo se puede utilizar después de la declaración de la 'enumeración' es completa. El siguiente, por ejemplo, no es aceptable en C estándar, aunque es aceptable en C ++:

enum {foo=19, bar, boz=bar+5;};

Se podría reescribirse:

enum {foo=19, bar}; enum {boz=bar+5;};

aunque esto terminaría por definir varios diferentes tipos de enumeración, en lugar de una que contiene todos los valores.

También integral character constants como 'a' o '\n' son constantes que el compilador reconoce como tal. Tienen tipo int.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top