【Swift 3 && C++11】<第一部分> 概覽(1): Swift簡單值與C++變量

Swift簡單值與C++變量

| Swift | C++
:-:|:-:|:-:
關(guān)鍵字 | let / var | const auto / auto
作用 | 創(chuàng)建一個(gè)常量/變量 | 創(chuàng)建一個(gè)常量/** 變量**

關(guān)于數(shù)值

Swift 中使用 let 來創(chuàng)建常量,使用var來創(chuàng)建變量.

var myVariable = 42
myVariable = 50
let myConstant = 42

C++ 中可以使用 auto 創(chuàng)建變量, 使用const auto 創(chuàng)建常量(也可以用其他形式創(chuàng)建變量).

#include <iostream>

int main() {

    auto myVariable = 42;
    myVariable = 50;
    const auto myConstant = 42; 
    
    return 0;
}

const是 類型說明符, 用于說明后面那個(gè)東西是常量, 初次賦值之后就再也不能改變了.

你不需要指明常量或變量的類型, 在聲明和同時(shí)賦值的話, 編譯器可以自動推斷類型.

上面例子中的 myVariablemyConstant

  1. Swift 將它們推斷為Int類型.
  2. C++ 將它們推斷為int類型.

一個(gè)常量或變量的值, 在編譯期并不需要明確的值. 但是如果沒有提供足夠的信息(或者沒有初始值), 那么你需要顯式的指明類型.

Swift 中可以在變量或常量右面聲明類型, 用冒號:分隔:

var varValue: Int
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70

C++中則需要先寫類型名,再寫變量名(創(chuàng)建常量/變量的另外的形式):

#include <iostream>

int main() {

    int varValue;
    const int constImplicitInt = 70;
    const double constImplicitDouble = 70.0;

    return 0;
}

Swift 練習(xí): 創(chuàng)建一個(gè)常量幼东,顯式指定類型為 Float 并指定初始值為4温峭。
C++ 練習(xí): 創(chuàng)建一個(gè)常量啡直,顯式指定類型為 float 并指定初始值為4庵佣。

關(guān)于字符串

Swift 中的值永遠(yuǎn)不會被隱式轉(zhuǎn)換為其他類型. 如果你需要把一個(gè)值轉(zhuǎn)換為其他類型, 請顯式轉(zhuǎn)換:

let label = "The width is "
let width = 94
let widthLabel = label + String(width)

刪除 String 試試看? 錯誤提示是什么?

** C++中**的值可以被隱式轉(zhuǎn)換為其他類型, 但并不是所有類型的值都可以. 只有該類型支持隱式轉(zhuǎn)換為其他類型, 才可以把該類型的值隱式轉(zhuǎn)換為其他類型:

#include <iostream>
#include <string> // 創(chuàng)建一個(gè)字符串變量,需要先包含 string 頭文件

int main() {

    int intValue = 70;
    double doubleValue = intValue;
    std::string aCplusplusString = "a C string"; // std::string 表示使用在標(biāo)準(zhǔn)庫 std 中的 string 類型
    
    return 0;
}

std::string aCplusplusString = "a C string";
寫成 std::string aCplusplusString = doubleValue; 試試?
錯誤提示是什么?

Swift 中有一種把值轉(zhuǎn)換成字符串的更簡單的方法: 把值寫到括號中,然后在括號前寫一個(gè)反斜杠. 形如: "字符串內(nèi)容\(值)字符串其他內(nèi)容"

let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

** C++中**這種數(shù)值向字符串的轉(zhuǎn)換是由標(biāo)準(zhǔn)庫函數(shù) to_string來完成的:

#include <iostream>
#include <string> // 創(chuàng)建一個(gè)字符串變量,需要先包含 string 頭文件

int main() {

    int intValue = 70;
    double doubleValue = intValue;
    std::string aCplusplusString = "a C string"; // std::string 表示使用在標(biāo)準(zhǔn)庫 std 中的 string 類型
    auto otherString = std::to_string(doubleValue); // std::to_string 表示使用在標(biāo)準(zhǔn)庫 std 中的 to_string 函數(shù)
    auto otherString2 = std::to_string(doubleValue + intValue);
    
    return 0;
}

Swift練習(xí):使用 \( )來把一個(gè)浮點(diǎn)數(shù)轉(zhuǎn)換成字符串, 并加上某人的名字
C++練習(xí):使用標(biāo)準(zhǔn)庫中的 to_string 函數(shù)來把浮點(diǎn)數(shù)轉(zhuǎn)換成字符串

關(guān)于數(shù)組與集合

** Swift 中**可以使用方括號[ ]來創(chuàng)建數(shù)組或字典, 并使用下標(biāo)或者鍵來訪問元素. 最后一個(gè)元素后面允許有逗號.

var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"

var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
 ] 
occupations["Jayne"] = "Public Relations"

// 創(chuàng)建空數(shù)組或字典,可以使用初始化語法.
let emptyArray = [String]()
let emptyDictionary = [String: Float]()

// 如果類型信息可以推斷出來, 可以使用[]創(chuàng)建空數(shù)組,使用[:]創(chuàng)建空字典. 
// 當(dāng)你為一個(gè)變量設(shè)置新值或者給一個(gè)函數(shù)傳遞參數(shù)的時(shí)候就可以這樣做
shoppingList = []
occupations = [:]

** C++中**創(chuàng)建向量或關(guān)聯(lián)數(shù)組, 則需要先指明類型名, 然后在<>中指定元素的類型, 再寫變量名, 然后給變量初始化或賦值. 初始化或賦值時(shí), 最后一個(gè)元素后面也允許有逗號. 只是沒有Swift這么簡潔了:

#include <iostream>

// 注意, 在 C++ 中, 下面這些東西統(tǒng)稱為容器.
#include <string> // 包含 string 來創(chuàng)建C++字符串
#include <vector> // 包含 vector 來創(chuàng)建向量(類似數(shù)組), 另外也可以包含 array 來創(chuàng)建C++數(shù)組, 當(dāng)然什么也不包含, 直接創(chuàng)建 C 數(shù)組
#include <map> // 包含 map 來創(chuàng)建有序的不重復(fù)關(guān)聯(lián)數(shù)組. 另外也可以包含 unordered_map抛蚤、 multimap、 unordered_map_multimap來分別創(chuàng)建無序的不重復(fù)的關(guān)聯(lián)數(shù)組、有序的可重復(fù)的關(guān)聯(lián)數(shù)組喂江、 無序的可重復(fù)的關(guān)聯(lián)數(shù)組

int main() {
    
    // 在創(chuàng)建的時(shí)候就不能使用 auto 進(jìn)行類型推斷了, 需要先指明類型, 再寫變量名
    std::string aCArray[4] = {"catfish", "water", "tulips", "blue paint"}; // 創(chuàng)建 C 數(shù)組
    aCArray[1] = "bottle of water";

    // 創(chuàng)建 vector 需要在<>中指明 vector 中包含元素的類型
    std::vector<std::string> aVector = {"catfish", "water", "tulips", "blue paint"};
    aVector[1] = "bottle of water";
    
    // 創(chuàng)建 map 需要在<>中分別指明 map 鍵和值的類型
    std::map<std::string, std::string> aMap = {
        {"Malcolm", "Captain"},
        {"Kaylee", "Mechanic"},
    }; // std::map<std::string, std::string> 表示使用 std 標(biāo)準(zhǔn)庫中的無序的關(guān)聯(lián)數(shù)組, 其中鍵值的類型分別使用標(biāo)準(zhǔn)庫 std 中的 string
    aMap["Jayne"] = "Public Relations";
    
    // 創(chuàng)建空向量/數(shù)組以及空字典
    std::vector<std::string> aEmptyArray;
    std::map<std::string, std::string> aEmptyMap;
    
    // 現(xiàn)在可以使用 auto 了
    auto aCArray2 = aCArray;
    auto aMap2 = aMap;
    
    
    return 0;
}

解釋

  • 命名空間

    • C++中的命名空間是為了防止名字沖突, 給防止名字沖突提供了更加可控的機(jī)制.
      代碼std::string, 其中 ::是作用域運(yùn)算符, ::運(yùn)算符把它的左右兩邊符號組合在一起, 表示使用在它的左邊符號所代表的命名空間中(std), 找到的它的右邊符號string; 也就是說std::string 表示使用存在在 std 中的 string
      如果::的左邊什么都沒有, 如::something 表示使用在全局作用域中的 something
    • Swift 中的命名空間是基于模塊(module)的, 每個(gè) module 代表了 Swift 中的一個(gè)命名空間, 而同一個(gè)命名空間中的名字仍然不能沖突. 簡單的說一個(gè)項(xiàng)目,一個(gè)庫就是一個(gè)命名空間, 而在一個(gè)項(xiàng)目(命名空間)中所用名字哪里都可以使用, 不需要 Import.
      另一種策略是使用類型嵌套的方法來指定訪問的范圍.
      詳細(xì)請看>>王巍 (@ONEVCAT): 命名空間
  • C++代碼中那些看起來巨長的類型名字

    • 現(xiàn)代 C++語言實(shí)際上是由三部分組成的:
      • 低級語言, 大部分繼承自 C語言. 比如:可以創(chuàng)建 C 數(shù)組std::string aCArray[4] = {...};

      • 現(xiàn)代高級語言特性, 允許我們定義自己的類型以及組織大規(guī)模程序和系統(tǒng).

      • 標(biāo)準(zhǔn)庫, 它利用高級特性來提供有用的數(shù)據(jù)結(jié)構(gòu)和算法.
        比如:vector, string, map 就是標(biāo)準(zhǔn)庫提供的,所以如果沒有任何說明的話, 就需要使用::運(yùn)算符來使用來自標(biāo)準(zhǔn)庫中內(nèi)容(vector,string,map 等).
        而標(biāo)準(zhǔn)庫的命名空間的名字為 std , 所以才出現(xiàn)像std::string,std::vector,std::map 這樣的代碼

  • 使用 using 聲明等方法避免巨長的類型名字的書寫.
    例如寫入: using namespace std;后就可直接使用 string,vector, map 等名字了, 當(dāng)然還有其他方法, 以后再詳細(xì)介紹

    • 比如上面的代碼可以修改為:

include <iostream>

// 注意, 在 C++ 中, 下面這些東西統(tǒng)稱為容器.

include <string> // 包含 string 來創(chuàng)建字符串

include <vector> // 包含 vector 來創(chuàng)建向量(類似數(shù)組), 另外也可以包含 array 來創(chuàng)建C++數(shù)組, 當(dāng)然也可以聲明也不包含直接創(chuàng)建 C 數(shù)組, 其實(shí) string 是一種字符數(shù)組

include <map> // 包含 map 來創(chuàng)建有序的不重復(fù)關(guān)聯(lián)數(shù)組. 另外也可以包含 unordered_map妒潭、 multimap悴能、 unordered_map_multimap來分別創(chuàng)建無序的不重復(fù)的關(guān)聯(lián)數(shù)組、有序的可重復(fù)的關(guān)聯(lián)數(shù)組雳灾、 無序的可重復(fù)的關(guān)聯(lián)數(shù)組

using namespace std; // 表示在下面的代碼中可以直接使用來自命名空間 std 中的所有名字
int main() {
// 在創(chuàng)建的時(shí)候就不能使用 auto 進(jìn)行類型推斷了, 需要先指明類型, 再寫變量名
string aCArray[4] = {"catfish", "water", "tulips", "blue paint"}; // 創(chuàng)建 C 數(shù)組
aCArray[1] = "bottle of water";

      // 創(chuàng)建 vector 需要在<>中指明 vector 中包含元素的類型
      vector<string> aVector = {"catfish", "water", "tulips", "blue paint"};
      aVector[1] = "bottle of water";

      // 創(chuàng)建 map 需要在<>中分別指明 map 鍵和值的類型
      map<string, string> aMap = {
        {"Malcolm", "Captain"},
        {"Kaylee", "Mechanic"},
      }; // std::map<std::string, std::string> 表示使用 std 標(biāo)準(zhǔn)庫中的無序的關(guān)聯(lián)數(shù)組, 其中鍵值的類型分別使用標(biāo)準(zhǔn)庫 std 中的 string
      aMap["Jayne"] = "Public Relations";

      // 創(chuàng)建空向量/數(shù)組以及空字典
      vector<string> aEmptyArray;
      map<string, string> aEmptyMap;

      // 現(xiàn)在可以使用 auto 了
      auto aCArray2 = aCArray;
      auto aMap2 = aMap;

      return 0;

}
```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漠酿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谎亩,更是在濱河造成了極大的恐慌记靡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件团驱,死亡現(xiàn)場離奇詭異,居然都是意外死亡空凸,警方通過查閱死者的電腦和手機(jī)嚎花,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呀洲,“玉大人紊选,你說我怎么就攤上這事〉蓝海” “怎么了兵罢?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滓窍。 經(jīng)常有香客問我卖词,道長,這世上最難降的妖魔是什么吏夯? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任此蜈,我火速辦了婚禮,結(jié)果婚禮上噪生,老公的妹妹穿的比我還像新娘裆赵。我一直安慰自己,他們只是感情好跺嗽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布战授。 她就那樣靜靜地躺著,像睡著了一般桨嫁。 火紅的嫁衣襯著肌膚如雪植兰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天瞧甩,我揣著相機(jī)與錄音钉跷,去河邊找鬼。 笑死肚逸,一個(gè)胖子當(dāng)著我的面吹牛爷辙,可吹牛的內(nèi)容都是我干的彬坏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼膝晾,長吁一口氣:“原來是場噩夢啊……” “哼栓始!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起血当,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤幻赚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后臊旭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體落恼,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年离熏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佳谦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滋戳,死狀恐怖钻蔑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奸鸯,我是刑警寧澤咪笑,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站娄涩,受9級特大地震影響窗怒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蓄拣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一兜粘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弯蚜,春花似錦孔轴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至收厨,卻和暖如春晋柱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诵叁。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工雁竞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓碑诉,卻偏偏與公主長得像彪腔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子进栽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容