Ob in C oder C ++, ich denke, dass dieses illegale Programm, dessen Verhalten gemäß dem C- oder C ++ - Standard undefiniert ist, interessant ist:
#include <stdio.h>
int foo() {
int a;
const int b = a;
a = 555;
return b;
}
void bar() {
int x = 123;
int y = 456;
}
int main() {
bar();
const int n1 = foo();
const int n2 = foo();
const int n3 = foo();
printf("%d %d %d\n", n1, n2, n3);
return 0;
}
Ausgabe auf meinem Computer (nach Kompilierung ohne Optimierung):
123 555 555
Ich denke, dass dieses illegale Programm interessant ist, weil es die Stapelmechanik veranschaulicht, weil der Grund, warum man C oder C ++ (anstelle von beispielsweise Java) verwendet, darin besteht, nahe an der Hardware, nahe an der Stapelmechanik und dergleichen zu programmieren.
Wenn jedoch in StackOverflow der Code eines Fragestellers versehentlich aus dem nicht initialisierten Speicher gelesen wird, zitieren die am stärksten bewerteten Antworten ausnahmslos den C- oder C ++ - Standard (insbesondere C ++), sodass das Verhalten undefiniert ist. Dies gilt natürlich für den Standard - das Verhalten ist in der Tat undefiniert -, aber es ist merkwürdig, dass alternative Antworten, die aus Hardware- oder stapelmechanischer Sicht versuchen, zu untersuchen, warum ein bestimmtes undefiniertes Verhalten (wie das Ausgabe oben) könnte aufgetreten sein, sind selten und werden tendenziell ignoriert.
Ich erinnere mich sogar an eine Antwort, die darauf hinwies, dass undefiniertes Verhalten das Neuformatieren meiner Festplatte beinhalten könnte. Ich habe mir darüber jedoch keine allzu großen Sorgen gemacht, bevor ich das obige Programm ausgeführt habe.
Meine Frage lautet: Warum ist es wichtiger, den Lesern lediglich beizubringen, dass Verhalten in C oder C ++ undefiniert ist, als das undefinierte Verhalten zu verstehen? Ich meine, wenn der Leser das undefinierte Verhalten verstehen würde, würde er es dann nicht eher vermeiden?
Meine Ausbildung ist zufällig in Elektrotechnik und ich arbeite als Bauingenieur. Das letzte Mal, dass ich als Programmierer per se gearbeitet habe, war 1994, daher bin ich neugierig, die Perspektive von Anwendern mit konventionelleren, mehr zu verstehen Aktuelle Hintergründe der Softwareentwicklung.