您首先显示的代码行不是声明,它甚至不是正确的C语法。(请注意,我指的是问题的初始版本,我认为您的某些问题与不了解C语法的优点有关。这对于初学者来说是正常的,我无意冒犯您。)
这是整数变量的定义。
int mem;
此行应该只出现一次,或者最好只被编译器看到一次。
多次看到只有声明才应该的内容,例如,因为它位于包含在多个代码文件中的标头中。
extern int mem;
关于“何时”;前面的两行与将值写入变量的时间范围不同。在编译时看到的声明和定义在代码运行之前生效。实际分配,或更正确地说是链接器节的链接或布局,是在构建结束时完成所有编译的,但要在程序执行之前很长时间完成。
最后,在运行时,将值写入变量,自程序加载以来,内存一直在等待它。
您显示的第三行不能与前两行一起编译,它的错字是“ M”而不是“ m”。
此更正的行
mem = 10;
是一个赋值,只能在函数内部,并且仅在函数执行时才起作用。无法清楚地看到所显示的函数是否是这种情况,您所显示的代码并不是真正的MRE。
此行,是我们正在讨论的第四个有趣的可能性,是带有显式初始化的定义,这是推荐的最佳实践。
int mem = 10;
它具有定义的作用,以及一种将值输入变量的特殊方法。该行实际上并没有执行,仅描述/引起了链接和加载期间所应用的机制对变量的影响。它可以在函数体之外,在这种情况下,变量被认为是全局变量。这样做的结果是,无论何时第一次从函数中的已执行代码中使用变量,变量都将具有给定值。之后发生的分配确定值。