CでもC ++でも、CまたはC ++標準に従って動作が定義されていないこの不正なプログラムは興味深いと思います。
#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;
}
私のマシンでの出力(最適化なしのコンパイル後):
123 555 555
この違法プログラムは興味深いものだと思います。スタックメカニクスを示しているからです。CやC ++(Javaなどの代わりに)を使用する主な理由は、ハードウェアやスタックメカニクスなどに近いプログラムにするためです。
ただし、StackOverflowでは、質問者のコードが初期化されていないストレージから誤って読み取る場合、最も頻繁に投票された回答が、動作が未定義であるという影響に対するCまたはC ++(特にC ++)標準を常に引用します。これはもちろん、標準に関する限り当てはまります(動作は実際に未定義です)。ただし、ハードウェアまたはスタックの機械的観点から、特定の未定義の動作(たとえば、上記の出力)が発生した可能性があり、まれであり、無視される傾向があります。
未定義の動作にはハードドライブの再フォーマットが含まれる可能性があることを示唆した回答を1つ覚えています。上記のプログラムを実行する前は、あまり心配していませんでした。
私の質問はこれです: 未定義の動作を理解することよりも、CまたはC ++で動作が未定義であることだけを読者に教える方が重要なのはなぜですか? つまり、読者が未定義の動作を理解した場合、それを回避する可能性は高くなりますか?
私の教育は電気工学であることを起こる、と私は建物の建設エンジニアとして働き、そして最後の時間は、私はプログラマーとしての仕事だったそれ自体が、私はより多くの、より従来とユーザーの視点を理解することは好奇心ので、1994年だったが最近のソフトウェア開発の背景。