为什么编译器允许自己初始化变量?

我终于追查了一个错字错误,这与下面的代码类似。 但是编译器不应该检测到这个(默认选项)?

#include  int main() { int c = c; return printf("%d\n", c); } $ gcc --version gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3 

我不明白为什么它不会编译。 定义在初始化之前发生。 当然这种初始化是没有意义的,但是,没有理由不能从编译器的角度来看它。

C没有与C#等现代语言相同的保护类型。 C#编译器会给出一个错误,即您正在使用未分配的变量。 C不关心。 它不会保护你自己。

在自己的初始化程序中使用变量是完全合法的。 考虑一个链表:

 #include  struct node { struct node *prev, *next; int value; }; int main() { struct node l[] = {{0, l + 1, 42}, {l, l + 2, 5}, {l, 0, 99}}; for (struct node *n = l; n; n = n->next) printf("%d\n", n->value); return 0; } 

通常,诊断何时使用未初始化的值是一个难题; 虽然有些编译器在某些情况下可以检测到它,但要求它发生是没有意义的。

如果

 int c; c = c; 

将编译,我不明白为什么int c = c; 不会编译。