// funktion för att beräkna kvadratet för ett nummer
int kvadrat (int x) {
int resultat =x * x;
// Efterkondition:Resultatet måste vara icke-negativt (om X är ett heltal)
hävda (resultat> =0); // Detta kan misslyckas på grund av överflöd av heltal om X är mycket stort.
returresultat;
}
int main () {
int resultat =kvadrat (5);
printf ("kvadrat på 5:%d \ n", resultat);
int Large_Number =100000; // kan orsaka överflöde
resultat =kvadrat (large_number); // Efterkondition kan misslyckas på grund av överflöd.
printf ("kvadrat av %d:%d \ n", large_number, resultat);
return 0;
}
`` `
I det här exemplet har funktionen "Square" en postkondition som "resultat" måste vara icke-negativ (förutsatt att "x" är ett heltal). `Hävdar (resultat> =0)` uttalande kontrollerar denna postkondition. Om resultatet är negativt (på grund av till exempel överflöd av heltal) kommer påståendet att misslyckas.
Nyckelskillnader sammanfattade:
| Funktion | Förutsättning | Postcondition |
| ---------------- | ---------------------------------------------- | ------------------------------------------------ |
| timing | Kontrollerad * före * funktionen körs | Kontrollerad * efter * funktionen körs |
| Ansvar | Uppringaren av funktionen | Funktion själv |
| Syfte | Definiera förväntad input och miljö | Definiera garanterat beteende och effekt av funktionen |
| Överträdelse | Anger ett problem i * samtalskoden * | Indikerar ett problem * inom funktionen * |
| Garantier | Funktionen kan fungera korrekt | Funktionen kommer att ha uppnått sin avsedda effekt |
Hur man implementerar i C:
Eftersom C inte har inbyggt stöd för förutsättningar och postkonditioner är standardmetoden att använda:
1. `hävdar ()` makro (från ``) :Detta är det vanligaste sättet att kontrollera förhållandena. Påståenden är vanligtvis aktiverade i felsökningsbyggnader (t.ex. med kompilatorflaggan `-ddebug`) och inaktiveras i frisläppningsbyggnader. Detta innebär att kontrollerna inträffar under utvecklingen men är optimerade i slutprodukten för att undvika prestanda.
2. `#ifdef Debug` block :Du kan också använda `#ifdef Debug` för att villkorligt inkludera mer komplexa förutsättningar för förutsättning och postkondition som kan innebära mer än en enkel jämförelse.
3. Kommentarer :Även om du inte använder påståenden är det avgörande att dokumentera förutsättningar och postkonditioner i kommentarer för att göra din kod mer förståelig.
4. testramar: Överväg att använda testramar som stöder kontroller före/efter villkor för att underlätta enhetstestning.
Exempel med kombinerade förutsättningar, postkonditioner och kommentarer:
`` `c
#include
#include
/**
* @Brief beräknar kraften hos ett nummer (bas upp till exponent).
*
* @param bas basnumret (heltal).
* @param exponent Exponenten (icke-negativt heltal).
*
* @pre exponent> =0 (exponent måste vara icke-negativ).
* @pre bas! =0 || Exponent! =0 (bas och exponent inte båda 0 - undviker odefinierat beteende)
*
* @post returnerar basen upp till exponentens kraft.
* @post Om exponenten är 0 är resultatet 1 (med undantag för bas =0, vilket tillåts).
*
* @returnera resultatet av basen höjt till exponentens kraft.
* Returnerar 1 om exponenten är 0.
*/
int Power (int bas, int exponent) {
// Förutsättningar:
hävda (exponent> =0);
hävda (bas! =0 || exponent! =0); // Förhindra odefinierat beteende med 0^0
int resultat =1;
för (int i =0; i
resultat *=bas;
}
// Efterkonditioner:
if (exponent ==0) {
hävda (resultat ==1); // Kontrollera om basfodralet
}
returresultat;
}
int main () {
int resultat =kraft (2, 3); // 2^3 =8
printf ("2^3 =%d \ n", resultat);
resultat =kraft (5, 0); // 5^0 =1
printf ("5^0 =%d \ n", resultat);
// Power (0,0); // Detta kommer att utlösa påståendet.
return 0;
}
`` `
Fördelar med att använda förutsättningar och postkonditioner:
* Förbättrad kodkvalitet: De tvingar dig att tänka noga över antagandena och garantierna för dina funktioner.
* Enklare felsökning: Påståenden hjälper till att fånga fel tidigt och fastställa källan till problem.
* Bättre dokumentation: De dokumenterar tydligt det förväntade beteendet för dina funktioner.
* Ökad underhållbarhet: De gör din kod lättare att förstå och ändra, vilket minskar risken för att införa buggar.
* Formell verifiering: I vissa fall kan förutsättningar och postkonditioner användas med formella verifieringsverktyg för att bevisa riktigheten i din kod.
Genom att integrera förutsättningar och postkonditioner i din C -kod (även om du bara använder kommentarer och påståenden) kan du skriva mer robust, pålitlig och underhållbar programvara.