考虑简单的C程序:
int a; // declaration
int a = 11; // initialization
int main(int argc, char* argv[]) {
int b; // declaration
b = 10; // assignment
如果a
的初始化是在没有数据类型的情况下编写的,例如a = 11
,则编译器会发出警告。当a
的声明已指定其数据类型时,为什么a
的初始化需要数据类型?
答案 0 :(得分:3)
a
是一个“暂定”定义(因为它缺少初始化部分)。这意味着可以在以后使用值再次定义int a = 5; // defines a in the current translation unit with external linkage and a value of 5
int a; // tentative definition with no effect (a is already defined)
。
暂定定义可能会也可能不会作为定义,具体取决于在翻译单元之前或之后是否存在实际的外部定义:
int a;
...
int a = 5;
另一种方式通常具有更实际的优点:
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input type="file" name="file" />
<input type="submit" value="OK" />
}
暂定定义可以在实际定义之前,例如,如果用于初始化它的常量在第一点不可用。
修改强>
您似乎对您无法在文件范围内执行分配感到困惑。允许C程序仅在函数内进行实际操作。在文件范围,人们可能只定义或声明变量,类型和函数。
答案 1 :(得分:2)
我认为这与您无法在全局范围内编写指令这一事实有关。这意味着:
int a = 11;
定义变量。这告诉编译器为变量分配一个静态地址,因为它是全局的。默认(赋值)值只是一个额外的奖励。 鉴于:
a = 11;
是指令,这是非法的。
答案 2 :(得分:-3)
作为你的例子:
int a; // <--- is a declaration
int a = 11; // <--- is reference to a const value
你可以这样编写代码: int a;
int main() {
a = 11; // <--- simply no warning.
return 0;
}
那是因为
a = 1; //&lt; ---是一个代码声明
int a = 1; //&lt; ---是对const值的引用
在c中,您可能无法在功能范围之外编写分配。