程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 為什麼 “auto a = 1;” 在C語言中可以編譯通過?

為什麼 “auto a = 1;” 在C語言中可以編譯通過?

編輯:C++入門知識

問題來自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的變種)。

譯文鏈接: http://blog.jobbole.com/67040/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved