【问题标题】:Do "int i = 10;" and "int i; i=10;" perform different functions when i is a global variable?做“int i = 10;”和“int i; i=10;”当 i 是全局变量时执行不同的功能?
【发布时间】:2017-11-01 07:02:44
【问题描述】:

请参考下面的程序。我收到以下编译器警告。

bash-3.2$ gcc -Wall test1.c test1.c:6:警告:数据定义没有类型或存储类 test1.c:6:警告:在声明“j”时,类型默认为“int”

通常在函数外部写入运行时操作时会引发此警告。所以我质疑为什么在全局范围内,“int j; j=20”会引发警告,而“int i = 10”不会?

   #include <stdio.h>

   int i = 10;

   int j;
   j=20;

   int
   main(void)
   {
       int k;

       k = 30;

       printf("%d %d %d\n", i, j, k);

       return 0;
   }

【问题讨论】:

  • 你读到最后的警告了吗?
  • @DeiDei:我现在看到了。 “警告:在‘j’的声明中,类型默认为‘int’”实际上是在告诉 j=20 是一个声明。谢谢。

标签: c


【解决方案1】:

int i; 是一个暂定的定义。 以下定义I=10;将其转换为声明。

【讨论】:

    【解决方案2】:

    这一行

    j=20;
    

    不是作业。它是j 的声明,它使用了int 的隐式类型。

    C 允许您在全局范围内对同一个变量进行多次声明,只要它们匹配即可:

    int j;
    int j;
    int j = 20;
    

    当您未指定任何类型时,C99 之前的 C 标准也假定类型为 int

    以下是您可以打破示例的方法:

    double j;
    j = 20;
    

    这不会编译,因为j 被声明为double,然后重新声明为int

    【讨论】:

    • 请注意,隐式 int 仅在 C89 中有效,在 C99 及更高版本中无效。
    • @DeiDei 你说得对,我应该提一下,这种做法已经被禁止了一段时间。
    • 暂定定义在 C99 和 C11 中也是合法的。只有隐式 int 在 C99 中“停止工作”
    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多