“Conocimiento Programación>C /C + + Programming

¿Cuál es la diferencia entre una condición previa y postcondición en la programación C?

2013/2/8
En la programación C (y la programación en general), las condiciones previas y las postcondiciones son afirmaciones sobre el estado de las variables o estructuras de datos de un programa que deberían contener antes de y después de la ejecución de una función, respectivamente. Son importantes para diseñar un código robusto y confiable, especialmente en sistemas complejos. Si bien C no tiene soporte de palabras clave incorporada para condiciones previas formales y postes posicondiciones como otros idiomas (por ejemplo, contratos en Eiffel), los conceptos siguen siendo cruciales y pueden implementarse utilizando afirmaciones y comentarios.

Aquí hay un desglose de la diferencia:

1. Pracondición:

* Definición: Una condición que debe ser verdadera * Antes* se llama a una función para que la función funcione correctamente y garantice su comportamiento. Es la responsabilidad del * llamador * asegurarse de que se cumplan las condiciones previas. Si se viola una condición previa, el comportamiento de la función está indefinido; Puede bloquear, producir resultados incorrectos o comportarse de manera impredecible.

* Propósito:

* Aclare las entradas y el entorno esperados: Las condiciones previas documentan lo que espera una función. Esto hace que la función sea más fácil de entender y usar.

* Evitar errores y errores: Al verificar las condiciones previas (usando afirmaciones), puede detectar y prevenir errores temprano en el proceso de desarrollo.

* Habilitar optimización: Si una función sabe que ciertas condiciones siempre serán ciertas, puede realizar optimizaciones que no serían seguras de lo contrario.

* Documentación: La documentación clara permite a otros desarrolladores usar la función correctamente.

* Responsabilidad: La * persona que llama * de la función es responsable de garantizar que todas las condiciones previas sean verdaderas antes de llamar a la función.

* Ejemplo:

`` `C

#Include

#Include

// Funcionar para calcular el factorial de un número

int factorial (int n) {

// condición previa:n debe ser no negativa

afirmar (n> =0);

if (n ==0) {

regresar 1;

} demás {

regreso n * factorial (n - 1);

}

}

int main () {

int resultado =factorial (5); // Precondición satisfecha

printf ("factorial de 5:%d \ n", resultado);

// factorial (-1); // Pracondición violada! Esto causará una falla de afirmación.

regresar 0;

}

`` `` ``

En este ejemplo, la función `Factorial` tiene una condición previa que` n` debe ser no negativa. La declaración `afirmar (n> =0)` verifica esta condición previa. Si `n` es negativo, la afirmación fallará y el programa terminará (en una construcción de depuración).

2. Postcondition:

* Definición: Una condición que debe ser verdadera * Después de* una función se ha ejecutado correctamente. Describe el estado del programa (variables, estructuras de datos, valor de retorno) después de que la función haya completado su tarea. Es la responsabilidad de la * función * asegurarse de que se cumplan las poscondiciones, * suponiendo * que se cumplieron las condiciones previas.

* Propósito:

* garantiza el efecto de la función: Postconditions documenta lo que la función * promete * hacer.

* Verifique la corrección: Al verificar las poscondiciones (usando afirmaciones), puede verificar que la función está produciendo los resultados esperados.

* Facilitar la depuración: Si se viola una poscondición, indica un error dentro de la función misma.

* Documentación: La documentación clara permite a otros desarrolladores comprender el comportamiento de la función.

* Responsabilidad: La * función en sí * es responsable de garantizar que todas las poscondiciones sean verdaderas antes de regresar.

* Ejemplo:

`` `C

#Include

#Include

// Funciona para calcular el cuadrado de un número

int cuadrado (int x) {

int resultado =x * x;

// Postcondición:el resultado no debe ser negativo (si x es un entero)

afirmar (resultado> =0); // Esto podría fallar debido al desbordamiento entero si X es muy grande.

resultado de retorno;

}

int main () {

int resultado =cuadrado (5);

printf ("cuadrado de 5:%d \ n", resultado);

inter gran_number =100000; // podría causar desbordamiento

resultado =Square (grande_number); // La poscondición puede fallar debido al desbordamiento.

printf ("cuadrado de %d:%d \ n", grande_number, resultado);

regresar 0;

}

`` `` ``

En este ejemplo, la función `square` tiene una poscondición de que` resultado` debe ser no negativo (suponiendo que `x` es un entero). La declaración `afirmar (resultado> =0)` verifica esta poscondición. Si el resultado es negativo (debido al desbordamiento entero, por ejemplo), la afirmación fallará.

Diferencias clave resumidas:

| Característica | Pracondición | Postcondición |

| ---------------- | ---------------------------------------------- | ------------------------------------------------ |

| Timing | Marcado * antes * la función se ejecuta | Marcado * después de * la función se ejecuta |

| Responsabilidad | Llamadora de la función | Función misma |

| Propósito | Definir la entrada y el entorno esperados | Definir el comportamiento y el efecto garantizados de la función |

| Violación | Indica un problema en el * código de llamada * | Indica un problema * dentro de la función * |

| garantiza | La función puede funcionar correctamente | La función habrá logrado su efecto previsto |

Cómo implementar en C:

Dado que C no tiene soporte incorporado para condiciones previas y postcondiciones, el enfoque estándar es usar:

1. `afirmar ()` macro (de ``) :Esta es la forma más común de verificar las condiciones. Las afirmaciones generalmente se habilitan en construcciones de depuración (por ejemplo, con el indicador del compilador `-Ddebug`) y se deshabilitan en compilaciones de lanzamiento. Esto significa que los controles ocurren durante el desarrollo, pero se optimizan en el producto final para evitar la sobrecarga de rendimiento.

2. `#IFDEF DEBUG` BLOCKS :También puede usar `#IFDEF DEBUG` para incluir condicionalmente las verificaciones de condición previa y postcondición más complejas que podrían implicar más que una comparación simple.

3. Comentarios :Incluso si no usa afirmaciones, es crucial documentar condiciones previas y postcondiciones en comentarios para hacer que su código sea más comprensible.

4. Marcos de prueba: Considere usar marcos de prueba que admiten verificaciones previas/posteriores a la condición para facilitar las pruebas unitarias.

Ejemplo con condiciones previas combinadas, postcondiciones y comentarios:

`` `C

#Include

#Include

/**

* @Brief calcula el poder de un número (base elevada a exponente).

*

* @param base el número base (entero).

* @param exponente El exponente (entero no negativo).

*

* @pre exponente> =0 (el exponente debe ser no negativo).

* @pre base! =0 || exponente! =0 (base y exponente no ambos 0 - evita el comportamiento indefinido)

*

* @Post Devuelve la base elevada al poder del exponente.

* @post si el exponente es 0, el resultado es 1 (excepto la base =0, que está rechazada).

*

* @return El resultado de la base elevada al poder del exponente.

* Devuelve 1 si el exponente es 0.

*/

int power (int base, int exponente) {

// Precondiciones:

afirmar (exponente> =0);

afirmar (base! =0 || exponente! =0); // prevenir el comportamiento indefinido con 0^0

int resultado =1;

para (int i =0; i resultado *=base;

}

// Postcondiciones:

if (exponent ==0) {

afirmar (resultado ==1); // Verifique el estuche base

}

resultado de retorno;

}

int main () {

int resultado =potencia (2, 3); // 2^3 =8

printf ("2^3 =%d \ n", resultado);

resultado =potencia (5, 0); // 5^0 =1

printf ("5^0 =%d \ n", resultado);

// potencia (0,0); // Esto activará la afirmación.

regresar 0;

}

`` `` ``

Beneficios del uso de condiciones previas y postcondiciones:

* Calidad de código mejorada: Te obligan a pensar cuidadosamente sobre los supuestos y garantías de sus funciones.

* Depuración más fácil: Las afirmaciones ayudan a atrapar errores temprano y a determinar la fuente de problemas.

* Mejor documentación: Documentan claramente el comportamiento esperado de sus funciones.

* aumentó la mantenimiento: Hacen que su código sea más fácil de entender y modificar, lo que reduce el riesgo de introducir errores.

* Verificación formal: En algunos casos, se pueden usar condiciones previas y postcondiciones con herramientas de verificación formales para probar la corrección de su código.

Al incorporar condiciones previas y postcondiciones en su código C (incluso si solo usa comentarios y afirmaciones), puede escribir un software más robusto, confiable y mantenible.

C /C + + Programming
Cómo convertir Celsius a Fahrenheit en C + + sin formatear el decimales
Funciones static void en C
¿Qué es la gestión de la memoria?
Cómo calcular una dirección de almacenamiento
¿Cuál es la función de las tragamonedas AGP?
Cómo moldeada Char internacional
Cómo escribir una línea de inversión de la función Utilizar punteros en C + +
Turbo C Métodos Clasificación
Conocimiento de la computadora © http://www.ordenador.online