簡體   English   中英

C++ 三元運算符,有什么區別嗎?

[英]C++ ternary operators, Any difference?

我正在閱讀以下內容的區別:

1)

std::string test = level > 10 ? "Master" : "Beginner";

2)

std::string test;
if (level > 10)
    test = "Master";
else
    test = "Beginner";

在第二種情況下,有人告訴我,在第二種選擇中,正在創建一個我不理解的臨時值。

我了解到,當我們聲明一個沒有初始化的變量時,它會占用垃圾,因此編譯器只保存一個 memory 位置並且不能“工作”來更改它的值。

從語法上講,第一種情況有點等價於:

constexpr const char* f(int level) {
    if (level > 10)
        return "Master";
    else
        return "Beginner";
}

std::string test = f(level);

在這里, test立即使用"Master""Beginner"進行初始化。 在第二種情況下, test首先被默認初始化,然后分配給它任何一個值。

但是,優化后不一定是這樣:編譯器可以很好地在兩種情況下生成完全相同的代碼。

當我們聲明一個沒有初始化的變量時,它需要垃圾

這僅適用於基本類型和 POD 類型,而不是像std::string這樣具有默認構造函數的類。 查找默認初始化以獲取詳細信息。

在這兩種情況下都沒有構造臨時對象。

在第一種情況下, test是從三元運算符直接返回的const char* 復制初始化的,通過std::string的構造函數采用const char*

在第二種情況下, test首先默認初始化,然后通過std::string的賦值運算符從ifelse分支中的const char*分配。 (順便說一句:在默認初始化test不會帶垃圾之后,它將被std::string的默認構造函數初始化為空字符串。)

沒有理由不使用第一種形式,但是如果編譯器沒有為任何一種生成相同的代碼,編譯器就會出現嚴重的性能問題。 話雖如此,第一種形式清晰易懂,可能會減少優化器的工作量,因此您不妨使用它。 它清楚地說明了將變量初始化為兩個給定值之一的意圖,並且最清楚地表達意圖的代碼通常會產生最好的生成代碼(並且最容易理解)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM