Ich bin vor langer Zeit in einem Forum über eine interessante Frage gestolpert und möchte die Antwort wissen.
Betrachten Sie die folgende C-Funktion:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
Dies sollte false
seitdem immer wieder zurückkehren var3 == 3000
. Die main
Funktion sieht folgendermaßen aus:
Haupt c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
Da f1()
sollte immer zurückkehren false
, würde man erwarten, dass das Programm nur eine falsche auf dem Bildschirm druckt . Aber nach dem Kompilieren und Ausführen es, ausgeführt auch angezeigt wird:
$ gcc main.c f1.c -o test
$ ./test
false
executed
Warum ist das so? Hat dieser Code ein undefiniertes Verhalten?
Hinweis: Ich habe es mit kompiliert gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
könnte vereinfacht werden int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
- dies würde die Diskrepanz besser zeigen.
void
?
true
und false
in K & R 1st ed., also gab es überhaupt keine solchen Probleme. Es war nur 0 und nicht Null für wahr und falsch. Ist es nicht? Ich weiß nicht, ob zu diesem Zeitpunkt Prototypen verfügbar waren.
_Bool
Typ und keinen <stdbool.h>
Header.
f1()
in dieselbe Datei wie kopierenmain()
, werden Sie etwas seltsam: Während es in C ++ korrekt ist,()
eine leere Parameterliste zu verwenden, wird sie in C für eine Funktion mit einer noch nicht definierten Parameterliste verwendet ( Grundsätzlich wird nach dem)
) eine Parameterliste im K & R-Stil erwartet . Um korrekt C zu sein, sollten Sie Ihren Code in ändernbool f1(void)
.