【问题标题】:Why is a datatype necessary for an initialization that follows a declaration?为什么声明之后的初始化需要数据类型?
【发布时间】:2016-05-19 13:47:04
【问题描述】:

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

【问题讨论】:

  • 好吧,我不确定你的问题,但要在函数范围之外编写代码......
  • 对于 C++,有 auto 关键字,基本上就是这样做的。
  • @arrowd:我真的看不到与 auto 的连接

标签: c


【解决方案1】:

int a 在文件范围内是一个“暂定”定义(因为它缺少初始化部分)。这意味着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;

暂定定义可以先于实际定义,例如,如果用于初始化它的常量在第一点不可用。

编辑:

您似乎对无法在文件范围内执行分配感到困惑。 C 程序只允许在函数内进行实际操作。在文件范围内,只能定义或声明变量、类型和函数。

【讨论】:

  • 我不明白这是如何回答“当 a 的声明已经指定其数据类型时,为什么需要数据类型的初始化?”
  • 我真的不明白这在任何情况下都有什么实际价值。
  • @Lundin:想象一下这样一种情况,您在末尾包含一个自动生成的代码块(带有初始化),但在它之前的函数需要访问a
【解决方案2】:

我认为这与您无法在全局范围内编写指令这一事实有关。它的意思是:

int a = 11;

定义一个变量。这告诉编译器为变量分配一个静态地址,因为它是全局的。默认(分配)值只是一个额外的好处。 鉴于:

a = 11;

是指令,是非法的。

【讨论】:

  • 但是我问为什么编译器在后续声明/初始化中需要数据类型,而它已经看到了变量的数据类型。我不是在问为什么在函数体之外赋值是非法的。
【解决方案3】:

作为你的例子:

int a; // <--- is a declaration
int a = 11; // <--- is reference to a const value

你可以这样写代码: 一个;

int main() {
  a = 11;   // <--- simply no warning.
  return 0; 
}

那是因为 a = 1; //

在c中,你不能写出函数范围之外的赋值。

【讨论】:

  • 你在这里混合东西,你的代码中没有定义常量。 C 中有两种简单的方法来定义常量,使用 #define 预处理器或使用 const 关键字。
猜你喜欢
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多