为什么声明后的初始化需要数据类型?

时间:2016-05-19 13:47:05

标签: c

考虑简单的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的初始化需要数据类型?

3 个答案:

答案 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中,您可能无法在功能范围之外编写分配。