Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C auto关键字在哪里使用?_C - Fatal编程技术网

C auto关键字在哪里使用?

C auto关键字在哪里使用?,c,C,在我上大学的时候,我读到了关于auto关键字的文章,但随着时间的推移,我实际上忘记了它是什么。其定义如下: 将局部变量定义为具有 局部寿命 我从未发现它在任何地方被使用过,它真的被使用过吗?如果是的话,那么它在哪里被使用,在哪些情况下被使用?auto是一个类似于static的修饰符。它定义变量的存储类。但是,由于局部变量的默认值是auto,因此通常不需要手动指定它 在C中列出了不同的存储类别。如果您阅读了(不常见问题)列表,您就会知道自动主要用于定义或声明车辆: auto my_car; 始终

在我上大学的时候,我读到了关于
auto
关键字的文章,但随着时间的推移,我实际上忘记了它是什么。其定义如下:

将局部变量定义为具有 局部寿命


我从未发现它在任何地方被使用过,它真的被使用过吗?如果是的话,那么它在哪里被使用,在哪些情况下被使用?

auto
是一个类似于
static
的修饰符。它定义变量的存储类。但是,由于局部变量的默认值是
auto
,因此通常不需要手动指定它

在C中列出了不同的存储类别。

如果您阅读了(不常见问题)列表,您就会知道自动主要用于定义或声明车辆:

auto my_car;
始终停在室外的车辆:

extern auto my_car;
对于那些缺乏幽默感、只想了解事实的人,女士:简单的回答是根本没有理由使用
auto
。唯一允许您使用
auto
的时间是与已经具有
auto
storage类的变量一起使用,因此您只需指定无论如何都会发生的事情。试图对任何尚未具有
auto
存储类的变量使用
auto
将导致编译器拒绝您的代码。我想,如果你想变得技术化,你的实现不必是一个编译器(但它是),理论上它可以在发出诊断后继续编译代码(但它不会)

小增编:

还有:

static auto my_car;
这需要根据ISO C进行诊断。这是正确的,因为它表明汽车出现故障。诊断是免费的,但是关闭仪表板灯要花80美元。(如果您从易趣购买用于车载诊断的USB加密狗,则不超过20个)

前面提到的
extern auto my_car
也需要诊断,因此,除了由负责停车执法的城市工作人员之外,它永远不会通过编译器运行


如果您在任何代码库中看到大量的外部静态自动…,那么您的环境就不好;在整个地方生锈之前,立即寻找更好的工作。

在C
auto
中,是一个关键字,表示变量是块的局部变量。因为这是块作用域变量的默认值,所以它是不必要的,也很少使用(我想我从来没有见过它在讨论关键字的文本中使用的例子之外)。如果有人能指出需要使用
auto
才能获得正确的解析或行为,我会很感兴趣

但是,在C++11标准中,
auto
关键字被“劫持”以支持类型推断,其中变量的类型可以从其初始值设定项的类型中获取:

auto someVariable = 1.5;   // someVariable will have type double

添加类型推断主要是为了支持在模板中声明变量或从模板函数返回,其中基于模板参数的类型(或在模板实例化时由编译器推断的类型)通常很难手动声明。

在C语言中,
auto
关键字是无用的。这是因为在C语言出现之前,有一种B语言,其中的关键字是声明局部变量所必需的。(B发展为NB,而后成为C)

这是你的电话号码

如您所见,手册中充满了使用
auto
的示例。这是因为没有
int
关键字。需要某种关键字来表示“这是一个变量的声明”,该关键字还指示它是本地的还是外部的(
auto
extrn
)。如果不使用其中一个,则会出现语法错误。也就是说,
x,y本身不是一个声明,而是
autox,y

由于在开发语言时,用B编写的代码基必须移植到NB和C,因此该语言的较新版本带来了一些改进后向兼容性的包袱,从而减少了工作量。在
auto
的情况下,程序员不必查找每次出现的
auto
并将其删除

从手册中可以明显看出,C中现在已经过时的“隐式int”cruft(能够在前面不使用任何
int
的情况下编写
main(){…}
)也来自B。这是支持B代码的另一个向后兼容特性。函数没有在B中指定的返回类型,因为没有类型。一切都是一个词,就像在许多汇编语言中一样


请注意,一个函数如何声明为
extrn putchar
,然后是标识符使用的唯一函数:它用于函数调用表达式,如
putchar(x)
,这就是告诉编译器将这个无类型字作为函数指针处理的原因。

Auto关键字是一个存储类(某种决定变量和存储位置生存期的技术)示例。它有一个行为,通过该行为,通过关键字have lifespan(life)生成的变量仅驻留在花括号中

{
    auto int x=8;        
    printf("%d",x);  // here x is 8

    { 
        auto int x=3;
        printf("%d",x);  // here x is 3
    }              

    printf("%d",x);  // here x is 8
}          

使用旧的Aztec C编译器,可以使用命令行开关将所有自动变量转换为静态变量(以提高寻址速度)


但是用
auto
显式声明的变量保留了这种情况。(这是递归函数必须的,否则它将无法正常工作!)

关键字
auto
类似于在Python中包含分号,这是以前的语言()所要求的,但开发人员意识到它是多余的,因为大多数东西都是
auto

我怀疑它是用来帮助从B语言过渡到C语言的。简言之,一个用途是为了B语言的兼容性

例如在B和C中:

/* The following function will print a non-negative number, n, to
   the base b, where 2<=b<=10.  This routine uses the fact that
   in the ASCII character set, the digits 0 to 9 have sequential
   code values.  */

printn(n, b) {
        extern putchar;
        auto a;

        if (a = n / b)        /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n % b + '0');
}
/*以下函数将打印非nega