在我的大学时代,我读到了auto
关键词,随着时间的推移,我实际上忘记了它是什么.它被定义为:
将局部变量定义为具有本地生命周期
我从来没有发现它在任何地方都被使用过,它是否真的被使用过,如果是的话那么它在哪里被使用?在哪些情况下?
如果您阅读了IAQ(不常见问题)列表,您就会知道auto主要用于定义或声明车辆:
auto my_car;
一直停在户外的车辆:
extern auto my_car;
对于那些缺乏幽默感并想要"只是事实女士"的人:简短的回答是根本没有任何理由可以使用auto
.您唯一允许使用的auto
是使用已具有auto
存储类的变量,因此您只需指定可能发生的事情.尝试auto
在任何没有auto
存储类的变量上使用将导致编译器拒绝您的代码.我想如果你想获得技术,你的实现不必是编译器(但它是),理论上它可以在发出诊断后继续编译代码(但它不会).
卡兹的小附录:
还有:
static auto my_car;
这需要根据ISO C进行诊断.这是正确的,因为它声明汽车已经损坏.诊断是免费的,但关闭仪表板灯将花费你八十美元.(二十或更少,如果你从eBay购买自己的USB加密狗用于车载诊断).
上述内容extern auto my_car
也需要诊断,因此除了负责停车执法的城市工作人员之外,它永远不会通过编译器运行.
如果您extern static auto ...
在任何代码库中看到很多,那么您就是一个糟糕的社区; 在整个地方转向Rust之前,立即寻找更好的工作.
auto
是一个修饰语static
.它定义变量的存储类.但是,由于局部变量的默认值是auto
,您通常不需要手动指定它.
此页面列出了C中的不同存储类.
该auto
关键字在C语言中无用.它存在,因为在C语言之前存在一种B语言,其中该关键字是声明局部变量所必需的.(B被发展为NB,后者成为C).
这是B的参考手册.
正如您所看到的,手册中充斥着使用的示例auto
.这是因为没有int
关键字.需要某种关键字的说:"这是一个变量的声明",而关键字也表明无论是本地或外部(auto
与extrn
).如果您不使用其中一个,则会出现语法错误.也就是说,x, y;
它本身不是一个声明,而是auto x, y;
.
由于用B语言编写的代码库必须在开发语言时移植到NB和C语言,因此语言的新版本带来了一些包袱,以提高向后兼容性,从而减少了工作量.在这种情况下auto
,程序员不必每次都追捕auto
并删除它.
这是从手动的现在过时"隐式int"克鲁夫特在C(能够编写明显main() { ... }
没有任何int
前)也来自于B.这是另一个向后兼容功能,支持B码.函数没有在B中指定的返回类型,因为没有类型.一切都是一个词,就像许多汇编语言一样.
注意如何声明一个函数extrn putchar
,然后唯一能使它成为标识符使用的函数:它在函数调用表达式中使用putchar(x)
,这就是告诉编译器将该无类型字视为函数指针.
在C中auto
是一个关键字,表示变量是块的本地变量.因为这是块作用域变量的默认,这是不必要的,很少使用(我不认为我见过它在讨论关键字文字使用的例子外).如果有人可以指出auto
需要使用才能获得正确的解析或行为,我会感兴趣.
然而,在C++ 11标准的auto
关键字已"劫持",以支持类型推断,其中变量的类型可以从它的初始值设定的类型来采取:
auto someVariable = 1.5; // someVariable will have type double
添加类型推断主要是为了支持在模板中声明变量或从模板函数返回,其中基于模板参数的类型(或者在实例化模板时由编译器推导出来)通常可能非常痛苦地手动声明.
使用旧的Aztec C编译器,可以使用命令行开关将所有自动变量转换为静态变量(以提高寻址速度).
但是明确声明的变量auto
在这种情况下保持原样.(必须为递归函数,否则将无法正常工作!)
该auto
关键字类似于Python中包含分号,它需要由以前的语言(B
),但开发人员意识到这是多余的,因为大多数事情auto
.
我怀疑它是留下来帮助从B到C的过渡.简而言之,一个用途是B语言的兼容性.
例如在B和80s 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) { extrn putchar; auto a; if (a = n / b) /* assignment, not test for equality */ printn(a, b); /* recursive */ putchar(n % b + '0'); }