为什么 “auto a = 1;” 在C语言中可以编译通过?

开发 后端
auto 是一个古老的C语言关键字,它的代表含义是 “局部作用域”。 `auto a` 等价于 `auto int a`,而且函数里的变量定义默认就是局部作用域的变量,所以在该例子中它也等价于`int a`.

问题(来自lee77):

  1. int main(void)  
  2. {  
  3.     auto a = 1;  
  4.     return 0;  

把如上所示的代码写在扩展名为.c的文件里面,用MS Visual Studio 2012编译器编译的时候不会报错。我一直认为,当你使用.c的扩展名时,编译器会按照C语言的语法来进行编译,而不是C++。而且,据我所知,不显示定义类型的auto变量声明只有从C++11标准之后才被允许,在C++11中auto的含义是声明该变量的类型可以被初始化法式推导出来的。

这是不是意味着我的编译器不严格遵守C语言的标准,或者这段代码实际上在C语言中是正确的?

***答案(来自larsmans):

auto 是一个古老的C语言关键字,它的代表含义是 “局部作用域”。 `auto a` 等价于 `auto int a`,而且函数里的变量定义默认就是局部作用域的变量,所以在该例子中它也等价于`int a`.

这个关键字(auto)事实上是 C语言的前身——B语言 遗留下来的,B语言没有基本类型: 一切类型都是 int, pointer to int, array of int . (*) 这些类型的声明只能是 `auto` 或者 `extern`。C语言继承了 “任何类型是int” 作为默认法则,所以你能用如下方法声明整型:

  1. auto a;  
  2. extern b;  
  3. static c; 

ISO C标准 抛弃了这个法则,但是当然有一些编译器为了向后兼容而接受这个法则。如果你还是觉得陌生,你应该明白有一个类似的的法则在下面语句中也生效:

  1. unsigned d; // actually unsigned int 

上式的代码在现代的代码中是很常见的。

C++11 复用了这个关键字(auto),既然它的原始含义很少被C++程序员使用,所以在C++11中被复用来作为类型推导。 这样的做法通常是安全的,因为”一切类型都是int”这个C语言的法则已经被C++98标准中被抛弃; 唯一可能不安全的用法是 `auto T a`, 不过也没人会这么做。()

(*) 在B语言中的字符串处理很有意思: 你会使用int数组和包装多个字符在int数组的每个成员里。B语言事实上就是不同语法的BCPL(BCPL的变种)。

原文链接: stackoverflow   翻译: 伯乐在线 - aszxqw

译文链接: http://blog.jobbole.com/67040/

责任编辑:林师授 来源: 伯乐在线
相关推荐

2023-09-07 10:50:22

2012-06-12 09:47:17

C语言

2020-09-04 15:34:07

C编程语言开发

2024-02-18 12:39:15

C++autodecltype

2010-01-11 15:29:13

引用C++语言

2010-11-03 09:22:00

C语言

2010-01-22 15:14:37

学习C++

2023-01-30 15:41:10

Channel控制并发

2011-03-30 11:01:13

C语言随机

2016-12-27 15:17:39

编程语言加减法

2020-10-09 11:06:38

C语言桌面语法

2022-05-24 08:31:05

C语言检查数组

2015-05-25 15:31:56

C语言学习和使用 C 语言

2023-11-04 16:26:18

C语言数组

2022-07-29 08:25:02

volatileC语言原子

2023-01-12 08:52:50

GoroutinesGo语言

2011-12-25 15:35:05

ibmdwJavaC++

2010-03-11 19:16:32

Python语言

2011-05-25 13:22:05

PHPJSON

2022-01-06 14:25:24

C语言指针内存
点赞
收藏

51CTO技术栈公众号