C 11 的這個新特性,我願稱之最強!

2022-10-10 21:30:21 字數 2918 閱讀 4787

在日常開發中我們經常會將json、xml、html、sql、regex等字串拷貝貼上到我們的**中,而這些字串往往包含很多的引號",我們就必須將所有引號逐個新增轉義符\進行轉義。這個轉義十分麻煩,且容易出錯,而當我們們需要替換這些字串時,重新貼上進來的文字仍需要再次進行轉義,簡直讓人崩潰。

在我的工作中經常會遇到這麼乙個場景,對於某核心業務的方法,業務執行前一般會進行日誌輸出引數物件(json格式),這樣可在業務出現故障時追溯到當時的引數值,有利於事後補償或復現bug等。

假設故障發生了,我從日誌中獲取了這個引數值的內容如下

為復現該問題,在控制台或單元測試中,將該引數定義,並呼叫mylogic方法,

可以看到報錯的字串是我直接從日誌中拷貝的json貼上進去的,需要對所有的"進行轉義,這是很蛋疼的乙個問題,有時候可能需要將很多日誌中的物件貼上進來測試,每次貼上完還要進行插入轉義符號

現在我們不需要這樣做了。

原始字串文字 是字串文字的新格式。 原始字串文字可以包含任意文字,包括空格、新行、嵌入引號和其他特殊字元,而無需轉義序列。 原始字串文字以至少三個雙引號開頭, (""") 個字元。 它以相同數量的雙引號字元結尾。 通常,原始字串文字在單個行上使用三個雙引號來啟動字串,另一行的三個雙引號結束字串。 尾引號和尾引號前面的換行符不包括在最終內容中。詳細內容參考這裡

我使用這一新特性修改上面場景中的**如下,可以看到,json字串不做任何轉義直接貼上進來即可。

又比如我需要貼上一段html,如果沒有這新特性,轉義那麼多引號,你可能會瘋吧!!

當字串的內容中包含至少三個"一起出現,你的連續出現"的個數加1(最少三個),就是原始字串要開頭和結尾使用"的個數,所以說不是固定三個"

注意:圖中字串前面的|並不是輸入的字元,是編譯器的對齊提示。

輸出

如下如,編譯器自動以結尾""""前為界限顯示出一條豎線,豎線左側的空格不算作內容。

將結尾字元放到內容後面,編譯器會提示你將其放到自己的行上

這個可以理解為,在這種情況下可能會引起歧義,編譯器不確定你的原始字串是以下三種的哪一種。

你"""好"""啊

或(前面有空格)

你"""好"""啊

或(換行+前面有空格)

你"""好"""啊

如果下面這樣,則不會歧義,以箭頭指向的豎線為界,左側空格都不算做內容,右側空格均算作內容

如果是全在一行也行,因為不會產生歧義。

這個比較難理解點,$符號的數量也是不固定的,根據你需要連續將多少個花括號作為原始字元

你想要輸出的內容沒有括號時,屬於常規用法,沒什麼好說的。

如果你想輸出下文

會遇到這個問題的提示

簡單理解就是,你需要將乙個大括號視作內容,就需要兩個$作為字首,你需要將n個括號是做內容,就需要n + 1$做為字首,同樣內插字串也需要消耗跟$同樣數量的大括號。

因為你要將乙個大括號視為內容,所以需要1 + 1 = 2$,同樣,內插變數也需要跟$數量一致的括號包裹,所以修改後的**如下。

如果你想輸出的內容是

{{{{張三

需要將四個括號視為內容,n = 4,$數量為4 + 1 = 5,內插變數也需要5和括號包裹。

當我們將帶有引號的文字貼上至編譯器中需要進行大量的轉義操作,原始字串特性能很好的解決這個問題,讓我們可以愉快進行貼上這些字串,但當與內插字串使用時,尤其是多個大括號場景還是比較難以理解的,好在編譯器會提示怎麼做,且那種場景都屬於及其不常見。

__eof__

轉 

c 11的新特性

1 型別說明符auto 2.decltype提取型別 int a 0 decltype a b b 10 cout b endl 3.基於範圍的for迴圈 4.虛函式的override和final指示符 final修飾類 類無法被繼承 final修飾虛函式 虛函式不能被重寫 override就是輔助...

C 11的新特性

c 11提供在類中定義類的資料成員,可以直接在成員之後新增 預設值 當通過編譯器自動生成的預設建構函式初始化物件時,對應的資料成員就會被初始化成對應的預設值。class test int main 在c 98中,陣列可以使用 來進行初始化,對自定義型別是不可以的。在c 11中,的使用範圍變得更廣,可...

C 11的新特性

1.auto關鍵字 編譯器可以根據初始值自動推導出型別。但是不能用於函式傳參以及陣列型別的推導。2.nullptr關鍵字 nullptr是一種特殊型別的字面值,它可以被轉換成任意其它的指標型別 而null一般被巨集定義為0,在遇到過載時可能會出現問題。3.智慧型指標 c 11新增了std share...