auto C和C 中乙個有意思的關鍵字

2021-09-10 13:50:33 字數 1516 閱讀 8759

一、c語言和c++11之前的auto

c語言中提供了儲存說明符auto,register,extern,static說明的四種儲存類別,在c語言和c++11之前,auto表示乙個變數為自動變數,在函式內部定義變數時,如果沒有宣告為其它型別的變數,那麼預設就是auto的,但是在函式外部會報錯。

例如:// main.cpp

#include

// auto int j; 會報錯

int main()

編譯:g++ main.cpp -std=c++03

二、c++11中的auto

在c++11中,auto表示自動型別推導,可以使用auto型別對變數的型別進行自動推倒

例如:auto sum = 0;

就會將sum自動推導為int型別

但是在c++11中,auto有著幾種不能推導的型別

1、對於乙個函式來說,auto不可以是形參型別

例如:int sum(auto number_one,auto number_two) 這樣在編譯的時候就會報錯

2、對於結構體來說,非靜態成員變數不能是auto的

例如:struct point;

4、auto作為函式的返回型別

例如:auto sum(int number_one,int number_two)

5、在例項化模板的時候,auto作為模板引數

例如:std::vectorv;

三、c++14中的auto

c++14中的auto爭對c++11中的兩種不能推導的型別做出了一些改變

1、auto作為函式的返回型別

// main.cpp

#include

auto sum(const int number_one,const int number_two){

return number_one + number_two;

int main() {

std::cout << sum(3,4) << std::endl;

編譯:g++ main.cpp -std=c++14

2、auto作為函式的形參

將上面的例子,形參型別改為auto

// main.cpp

#include

auto sum(const auto& number_one,const auto& number_two){

return number_one + number_two;

int main() {

std::cout << sum(3,4) << std::endl;

std::cout << sum(3.1,4.1) << std::endl;

std::string str1 = "hello ";

std::string str2 = "world!";

std::cout << sum(str1,str2) << std::endl;

這個時候auto就和模板函式類似了

編譯:g++ main.cpp -std=c++14 -fconcepts

乙個有意思的問題

a b這個表示式如何理解?應該理解成a b還是a b,還是a b呢?應該按第一種方式理解。編譯的過程分為詞法解析和 語法解析兩個階段,在詞法解析階段,編譯器總是從前到後找最長的合法token。把這個表 達式從前到後解析,變數名a是乙個token,a後 面有兩個以上的 號,在c語言中乙個 號是合法的t...

乙個有意思的問題

最近做乙個交通管理系統,其中有個使用者投票功能。設想是直接開發乙個自定義的控制項。完成顯示,投票,ip檢索等全部功能。然而卻遇到乙個有意思的問題。具體來說就說,因為是用radiobuttonlist顯示的資料,在用radiobuttonlist.value捕獲使用者輸入時卻發現取出的索引始終為0.即...

乙個有意思的正則

在乙個框架中偶然發現一段比較有意思的正則,到現在還沒完全搞懂,先記錄下 1 3 str string 4 第乙個引數為正則 是左右定界符,就代表每個字串都匹配 5 preg split no empty 不返回空的 6 第 個引數 代表分割多少個陣列 7 chars preg split str,1...