自动类型默认为 int 而不是 long

auto type defaults to int instead of long

我已经 运行 进入以下示例,其中 auto 声明默认为 int 而不是 long:

#include <stdio.h>
int main(int argc, char **argv)
{
    auto i = 999999999999999;
    // long i = 999999999999999;
    printf("i = %ld\n",i);
    return 0;
}

当我编译这段代码时,gcc 确实给出了相关警告,即 i 实际上是一个 int:

$ gcc -o main main.c
main.c: In function ‘main’:
main.c:4:10: warning: type defaults to ‘int’ in declaration of ‘i’ [-Wimplicit-int]
     auto i = 999999999999999;
          ^
main.c:4:14: warning: overflow in implicit constant conversion [-Woverflow]
     auto i = 999999999999999;
              ^~~~~~~~~~~~~~~
main.c:6:19: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘int’ [-Wformat=]
     printf("i = %ld\n",i);
                 ~~^
                 %d

但我想知道 为什么 gcc 的词法扫描器没有将 999999999999999 标记为 long ,尽管它有所有的信息可以这样做?这是程序的输出:

$ ./main
i = 2764472319

编辑:

这里是用g++输出的正确答案(来自@Yang):

$ g++ -o main main.c
$ ./main
i = 999999999999999

另一种选择:

$ cp main.c main.cpp
$ gcc -std=c++11 -o main main.cpp
$ ./main
i = 999999999999999

如果你想要类型推断,auto 是一个 C++ 特性。您可以尝试使用 g++ 编译吗?

在 C 和 C++98/C++03 中,auto 是一个多余的关键字,意思是“automatic variable”。因此,在您的示例中,i 是一个没有显式类型的变量,因此被视为 int(但 C99 及更高版本需要诊断)。